1.数组元素的下标表示会在编译时改为指针
如:int ar[5] = {0,1,2,3,4};
int a = ar[3];
ar[3]会在编译时改为*(ar + 3)
所以ar[3]和3[ar]就相等,会改为*(ar + 3)
#include<stdio.h>
int main()
{
int ar[5] = {0,1,2,3,4};
int a = ar[3];
int b = 3[ar];
printf("a = %d b = %d \n",a,b);
return 0;
}
运行结果:
2.数组名 是数组首元素的地址,&数组名 是整个数组的地址
用它们给指针赋值,虽然指针的数值相同,但是它们的类型不同(意义不同)
#include<stdio.h>
int main()
{
int ar[5] = {0,1,2,3,4};
int *pa = ar;
//int *pb = &ar; //error,&ar的类型是int (*)[5],类型不匹配
int (*pb)[5] = &ar;
return 0;
}
3.二维数组,也可以看成一个存放类型为一维数组的一维数组
4.二维数组和指针
#include<stdio.h>
int main()
{
int ar[5][3] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
int (*p)[3] = &ar[2];//p的类型为int (*)[3],指向大小为3的一维数组的指针
//ar[2]是二维数组的第三个元素,是一个大小为3的一维数组
int *s = ar[1];//s是int类型的指针
//ar[1]是二维数组中的元素,是一维数组,
//数组名也是数组首元素的地址,ar[1]也就是这个数组中第一个元素的地址,类型为int *
int a = p[1][5];// *(*(p+1)+5)
int b = s[5]; // *(s+5)
printf("a = %d b = %d \n",a,b);
return 0;
}
指针+数字 =》 指针 + sizeof(指针类型) * 数字