C指针表示法与数组表示法比较:传递给函数时

Sys*_*Fun 11 c arrays pointers function

我的问题基于以下代码:

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

  }
Run Code Online (Sandbox Code Playgroud)

是否有理由使用其中一个而不是另一个?详细说明,当涉及数值数组时,有任何理由想要在数组表示法上使用指针表示法.如果一个人使用指针表示法,那么在函数指针运算中将使用等等.如果使用[]数组表示法,可以像往常一样使用数组.我是编程新手,我目前看不到使用指针表示法有什么好处.

我的确切问题是,有没有理由使用指针表示法将数值数组传递给函数,因此在函数中使用指针操作.

mel*_*ene 11

将函数参数声明为数组时,编译器会自动忽略数组大小(如果有)并将其转换为指针.也就是说,这个声明:

int foo(char p[123]);
Run Code Online (Sandbox Code Playgroud)

是100%相当于:

int foo(char *p);
Run Code Online (Sandbox Code Playgroud)

实际上,这不是关于符号而是关于实际类型:

typedef char array_t[42];
int foo(array_t p);  // still the same function
Run Code Online (Sandbox Code Playgroud)

这与您p在函数中的访问方式无关.此外,[]运算符不是"数组符号".[]是一个指针运算符:

a[b]
Run Code Online (Sandbox Code Playgroud)

是100%相当于:

*(a + b)
Run Code Online (Sandbox Code Playgroud)


Cha*_*via 8

两种符号之间没有真正的功能差异.在C中,当您将数组变量传递给函数时,无论符号如何,它都会衰减到指针.但是,在我看来,指针表示法更可取.[]功能定义中的符号问题是,在我看来,它有点误导:

void foo(int array[])
{

}
Run Code Online (Sandbox Code Playgroud)

新手C程序员中普遍存在的错误是假设sizeof(array)会给你数组中元素数量乘以sizeof(int),就像array在堆栈中声明的数组变量一样.但事实是array,尽管存在误导性的[]符号,它已被衰减为指针,因此sizeof(array)将会如此sizeof(int*).array实际上只是指向第一个元素的指针,或者可能是指向任何地方分配的单个整数的指针.

例如,我们可以foo像这样调用:

int x = 10;
foo(&x);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,[]定义中的符号foo有点误导.