传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

Tin*_*sch 4 c c++ pointers

下面的 C 语言等价吗?

差异仅在最后一行 ( AnyFunction) 中。

A

static void AnyFunction(unsigned char *array);
unsigned char array[32] = "";

AnyFunction(array);
Run Code Online (Sandbox Code Playgroud)

static void AnyFunction(unsigned char *array);
unsigned char array[32] = "";

AnyFunction(*&array);
Run Code Online (Sandbox Code Playgroud)

C

static void AnyFunction(unsigned char *array);
unsigned char array[32] = "";

AnyFunction(&array[0]);
Run Code Online (Sandbox Code Playgroud)

如果其中任何一个是等效的,这同样适用于 C++ 吗?

请参阅上面的问题和代码示例。

dbu*_*ush 7

最终的结果是相同的,尽管它们的实现方式略有不同。

在第一种情况下:

AnyFunction(array);
Run Code Online (Sandbox Code Playgroud)

array当传递给函数时,特别是从与函数期望的类型相匹配的unsigned char [32]类型,衰减为指向其第一个成员的指针。unsigned char *

在第二种情况下:

AnyFunction(*&array);
Run Code Online (Sandbox Code Playgroud)

array获取 的地址,给我们一个类型的表达式unsigned char (*)[32],即指向数组的指针,然后*运算符取消引用该指针,得到一个类型为 的数组的表达式unsigned char [32]。然后,与第一种情况一样,该数组衰减为指向其第一个元素的指针。

在最后一种情况下:

AnyFunction(&array[0]);
Run Code Online (Sandbox Code Playgroud)

数组索引运算符为我们提供了一个左值,它是数组的第一个元素,该&运算符为我们提供了该元素的地址,并将结果传递给函数。

在所有三种情况下,函数都会传递一个指向 的第一个元素的指针array