C指针表示法与数组表示法相比:传递给函数时
我的问题基于以下代码:
int myfunct(int ary[], int arysize) int myfunct2(int *ary, int arysize) int main(void){ int numary[10]; myfunct(numary, 10) myfunct2(numary, 10) return; } int myfunct(int ary[], int arysize) { //Whatever work is done } int myfunct2(int *ary, int arysize) { // Whatever work is done }
是否有理由使用其中一个而不是另一个? 详细说明,当涉及数值数组时,有任何理由想要在数组表示法上使用指针表示法。 如果使用指针表示法,那么在函数指针算术中将使用等等。如果使用[]数组表示法,则可以像往常一样使用数组。 我是编程新手,我目前看不到使用指针表示法有什么好处。
我的确切问题是,有没有理由使用指针表示法将数值数组传递给函数,因此在函数中使用指针操作。
两种符号之间没有真正的function差异。 在C中,当您将数组变量传递给函数时,无论符号如何,它都会衰减到指针。 但是,在我看来, 指针表示法更可取 。 函数定义中[]
表示法的问题在于,在我看来,它有点误导:
void foo(int array[]) { }
新手C程序员普遍存在的错误是假设sizeof(array)
会给你sizeof(array)
中元素的数量乘以sizeof(int)
,就像array
是在堆栈上声明的数组变量一样。 但实际情况是, 尽管有误导性的[]
符号, array
已经衰减为指针,因此sizeof(array)
将是sizeof(int*)
。 array
实际上只是指向第一个元素的指针,或者可能是指向任何地方分配的单个整数的指针。
例如,我们可以像这样调用foo
:
int x = 10; foo(&x);
在这种情况下, foo
定义中的[]
符号有点误导。
将函数参数声明为数组时,编译器会自动忽略数组大小(如果有)并将其转换为指针。 也就是说,这个声明:
int foo(char p[123]);
100%相当于:
int foo(char *p);
实际上,这不是关于符号而是关于实际类型:
typedef char array_t[42]; int foo(array_t p); // still the same function
这与您在函数中访问p
无关。 此外, []
运算符不是“数组表示法”。 []
是一个指针运算符:
a[b]
100%相当于:
*(a + b)
那些声明完全相同。 引用标准:
参数声明为“类型数组”应调整为“限定类型的指针”
C99标准第6.7.5.3节第7段
在自C99以来具有可变长度数组的现代C中, 如果是数组 , 则数组符号是优选的。 对于一维数组,您可以执行类似的操作
int myfunct(size_t size, int array[size]) { ... array[i] .. }
并为二维
int myfunct(size_t size, int array[size][size]) { ... array[i][j] .. }
因此,arrays符号在一般情况下更适合。 一个复杂的编译器甚至可以进行边界检查,但我不知道有任何这样做。
您只需要为多维数组使用数组表示法。 (您不必提供第一个维度的大小)。