数组名 与 &数组名

#include<stdio.h>
int main(){
    int arr[10] = {0};
    printf("%p\n",arr);
    printf("%p\n",&arr);
    return 0;
}

 

上述代码打印输出的结果虽然相同,但是表示的意义不一样

 printf("%p\n",arr); 这个表示打印的是数组首元素的地址

printf("%p\n",&arr); 这个则是打印 数组的地址

 这两个类型不一样

比如

#include<stdio.h>

int main (){
    int i = 97;
    char c = 'a';
    printf("%d\n",i);
    printf("%d\n",c);
    return 0;
}

 二者都用整型打印的数值是一样,但其类型不一样

2.

int main(){
    int arr[10] = {0};
    int * p1 = arr;         //p1是一个整型指针
    int (*p2) [10] = &arr;  //p2是一个数组指针
    printf("%p\n",p1);
    printf("%p\n",p2);
    return 0 ;
}

注意下面代码

int main(){
    int arr[10] = {0};
    int * p1 = arr;         //p1是一个整型指针
    int (*p2) [10] = &arr;  //p2是一个数组指针

    printf("%p\n",p1);
    printf("%p\n",p1+1); //这里指针+1 会跳过一个整型的指针(即跳过四个字节)
    printf("%p\n",p2);
    printf("%p\n",p2+1); //这里指针+1 会跳过一个整型数组的指针(即跳过40个字节)

    return 0 ;

}

 输出结果:

 

当我们取地址的时候,&arr表示的是数组的地址,而不是数组首元素的地址

    //练习
    double* d[5]; //d数组的每个元素 每个元素是double*类型的
    double*  (*pd)[5] = &d;
    //pd 就是一个数组指针
    //(*pd)[5] 这个说明 指针指向的是数组5个元素
    //double*  (*pd)[5] = &d;  这个说明 指针指向的是数组5个元素,指向的每个元素是double* 类型的

补充:

数组名是数组首元素的地址

但有两个例外

1、sizeof(数组名)  - 数组名表示整个数组,计算的是整个数组的大小,单位是字节

2、 &数组名 -  数组名表示整个数组取出的是整个数组的地址

猜你喜欢

转载自blog.csdn.net/qq_72505850/article/details/129916725