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符号在一般情况下更适合。 一个复杂的编译器甚至可以进行边界检查,但我不知道有任何这样做。

您只需要为多维数组使用数组表示法。 (您不必提供第一个维度的大小)。