1、指针的解释
int num=10;
int * p=#
指针是一个比较特别的变量,它里面存储的值可以被解释为是一个内存的地址,上面的例子p就是这个指针名,指针的类型是int *,跟num一样,num里存的是int类型的数,只不过p里存的是int类型数的地址。所以说指针就是地址,地址就是指针。
*p中的*是操作符表示指向变量p对应的存储空间,通俗的解释,1、遇见*,先把右边的东西找到,找到是p 2、p的是多少呢,是一个地址如&num 3、找到地址&num对应的存储空间是10,所以*p的值就是10。
2、数组的解释
2.1 定义一维数组 :
类型符 数组名 [常量表达式];
如 int num[4];
数组初始化:
int num[4]={1,2,3,4}; int num1[4]={1,2}; int num2[4]={0};
数组名是一个地址常量。
2.2 定义二维数组
类型符 数组名[常量表达式1][常量表达式2];
如 int num[3][2]表示三行两列的整形数组,行可以省略,列一定不能省略。
int num[3][2]={1,2,3,4,5,6}; int num1[3][2]={ {1,2},{3,4},{5,6}};
2.3 定义二维数组
int a[3][2]={{1,2},{4,4},{5,6}};
printf("a=%p\n",a);
printf("&a=%p\n",&a);
printf("a[0]=%p\n",a[0]);
printf("&a[0]=%p\n",&a[0]);
printf("&a[0][0]=%p\n",&a[0][0]);
printf("a+1=%p\n",a+1);
printf("&a+1=%p\n",&a+1);
运行结果如下
a= 0x7fff5fbff7f0
&a= 0x7fff5fbff7f0
a[0]= 0x7fff5fbff7f0
&a[0]= 0x7fff5fbff7f0
&a[0][0]= 0x7fff5fbff7f0
a+1= 0x7fff5fbff7f8
&a+1= 0x7fff5fbff808
由此可见数组名确实是一个地址常量 ,a表示数组的首地址,&a 表示数组a的地址,a+1表示向后偏移一行,&a+1表示整个数组偏移