为什么即使数组衰减到POINTERS,将函数的参数保持为ARRAY也没关系?

jef*_*eff 3 c c++ arrays pointers

请原谅我的坏英语,

让我澄清,这是一个例子,

这是我们的主要内容:

 main()
{
  int a1 []= {1,2,3,4,5,6,7,8,9} ;
  int size = sizeof(a1) /sizeof(a1[0]) ;
  point (a1 , size);

  return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

这是功能:

void point(int a[] , int size)
{
  int i ;
  for (i = 0 ; i<size ; i++)
  printf("%d\n", a[i])) ;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,当一个数组作为参数传递给一个函数时,我们实际上是发送一个指向数组的第一个元素的指针.

话虽如此,为什么函数"point"的参数是一个ARRAY变量,而不是一个POINTER变量......?

之所以我认为这很奇怪,所以例如在main中我们将int*传递给某个函数:

  int* a = &b ;
  point2(a) ;
Run Code Online (Sandbox Code Playgroud)

功能:

void point2 (int  a) // this would be invalid, it has to be int* a
{
  .
  .
}
Run Code Online (Sandbox Code Playgroud)

我们必须指定函数接收指针,数组如何异常?

请注意:我确实理解数组衰减到指针; 这就是为什么我的问题永远不是"为什么我们可以将数组作为参数发送给具有相同类型指针的函数?".我的问题是,"即使数组衰减到POINTERS,为什么将函数的参数保持为ARRAY也没关系?".希望很清楚第一个问题是如何不同的.谢谢!

jua*_*nza 6

C和C++的语言规范表明类型数组的函数参数T调整为键入指针T.所以这些函数声明是一样的:

void foo(int a[42]);
void foo(int a[]);
void foo(int* a);
Run Code Online (Sandbox Code Playgroud)

所有这些都将接受指针参数,无论是否是数组衰减的结果.

  • 应该注意的是,尽管`void foo(int a [42])`与`void foo(int*a)`具有相同的结果,但对于函数中的数组声明,这通常不正确.至少在C中,括号中的表达式可以被评估(标准对此是沉默的),有些实现也是如此,所以用`void foo定义的函数(int a [printf("Hello,world.\n")] )`可以打印"Hello,world.".此外,关于数组声明的约束在调整之前适用,因此`void foo(int a [42] [])`无效,因为元素类型不完整,而`void foo(int(*a)[])`有效. (4认同)