【C语言】充当右值时,数组名前加不加&的区别

    技术2025-05-21  42

    假设数组名是buf。

    则buf和&buf充当右值时的区别是:

    buf是数组首元素的首字节地址;&buf是整个数组的首地址。

    解释:

    这两个在值上是相等的,但是意义及数据类型不相同。

    &buf作右值时,只能赋值给“数组指针类型”的指针变量,即&buf得到的是一个数组指针。

    buf作右值时,只能赋给普通的指针变量,该指针变量的类型要和数组的数据类型一致。


    意义不相同会导致他们在参与运算的时候有不同的表现(有什么不同?见下例)。

    【例】

    #include <stdio.h> int main(void){ int i; int buf[5]={1,2,3,4,5}; //定义一个数组指针,p1 int (*p1)[5]=NULL; //定义一个普通int型指针,p2 int *p2=NULL; p1=&buf; //正确给数组指针赋值的写法 //p1=buf; //这种写法,编译器虽然不会报错,但是会警告,提示指针类型不匹配。 //通过数组指针来遍历输出一维数组a的元素 for(i=0;i<5;i++){ printf("%2d", *((*p1+0)+i) ); } printf("\n"); //通过普通指针来遍历输出一维数组a的元素 p2=buf; for(i=0;i<5;i++){ printf("%2d",*(p2+i)); } return 0; }

    运行结果:

    Processed: 0.012, SQL: 9