C与C++中array、*&array和&array[0]作为参数的等价性探究
三种写法在C语言中的等价性
这三种写法在C语言里完全等价,调用AnyFunction时传递的都是数组首元素的地址,具体分析如下:
- 写法A:
AnyFunction(array);
C语言中,数组名作为函数实参传递时会自动隐式转换为指向数组首元素的指针,即array等价于&array[0],传递的是数组第一个元素的地址。 - 写法B:
AnyFunction(*&array);&array取的是整个数组的地址,类型为unsigned char (*)[32];对该指针解引用*&array后得到数组本身,而数组作为实参时又会隐式转换为指向首元素的指针,最终效果和写法A一致。 - 写法C:
AnyFunction(&array[0]);
直接取数组第一个元素的地址,类型为unsigned char *,和函数参数类型完全匹配,传递的地址与前两种写法完全相同。
在C++中的适用性
这三种写法在C中同样完全等价。C继承了C语言中数组名隐式转换为指针的规则,&array和*&array的语义也与C保持一致:解引用数组指针得到数组后,数组作为实参依然会隐式转换为首元素指针,最终三种调用传递的都是数组首元素的地址,功能完全相同。
内容的提问来源于stack exchange,提问作者Tintenfisch
相关产品推荐
相关产品推荐

