为什么这些function原型不相同?
void print_matrix(char *name, int SX, int SY, int m[SX][SY]) void print_matrix(char *name, int SX, int SY, int **m)
即使两个函数参数可以以相同的方式使用,即通过m[i][j]
,它们也是完全不同的:
您不能将数组作为函数参数传递,因此“ T
类型的K
元素数组”会衰减为“指向T
指针”,指向数组的第一个元素。 因此,允许并等效于在函数参数中将第一个表单写为int m[][N]
,因为值M
将丢失。 但是,值N
不会丢失; 它是该类型的一部分!
因此,对于第一种forms,以下内容是可接受的/错误的:
void f(int arr[M][N]); int a[M][N]; int b[2*M][N]; int c[M][N + 1]; f(a); // OK f(b); // OK; slowest extent is forgotten in the decay //f(c); // Error! 'c' is not an array of {array of N ints}.
对于第二种forms,含义相当不同:
void g(int **p); int a; int * pa = &a; g(&pa); // fine, pointer to 'pa' int arr[M][N]; // g(arr); // Error, makes no sense
表达式arr
指定指向N
整数数组数组的第一个元素的指针,即其类型为int (*)[N]
。 取消引用它会得到一个N
整数的数组,而不是一个指向整数的指针。
没有办法将表达式arr
转换为指向指针的指针:如果你说,
int ** fool = (int**)arr;
那么*fool
会指向第一个数组的第一个元素( arr[0]
),而不是指向int
指针 。 因此,您不能进一步取消引用该值,因为该值不是指针 。
将二维数组作为双指针传递的唯一正确方法是构造一个中间辅助数组:
int * helper[M]; // array of pointers for (size_t i = 0; i != M; ++i) { helper[i] = arr[i]; // implicit decay } g(helper); // or "g(&helper[0])"
以上就是c/c++开发分享array 和**数组有什么区别相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562566.html