#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、 &数组名 - 数组名表示整个数组取出的是整个数组的地址