1.数组名的理解
(1)当数组名单独出现的时候,一般情况下表示数组首元素的地址
(2)例外的情况:
1)当出现&arr时,表示的是取出的整个数组的地址
2)当出现sizeof(arr)时,表示的是整个数组的大小
如:
int a[10] = { 0 };
printf("%p\n", a);
printf("%p\n", &a);
printf("%p\n", a+1);
printf("%p\n", &a+1);
printf("%d\n", sizeof(a[0]));
printf("%d\n", sizeof(a));
return 0;
2.使用指针访问数组
例如:
int a[3] = { 1,2,3 };
int sz = sizeof(a)/sizeof(a[0]);
int* p = a;
for (int i = 0; i < sz; i++)
printf("%d ", *(p + i));//还可以写作p[i]
return 0;
3.二级指针
如:
int a = 5;
int* p1 = &a;//把a的地址传给p1
int** p2 = &p1;//把p1的地址传给p2
printf("%d %d", *p1, **p2);
return 0;
结果:
解释:p1解引用后就是a的值,p2解引用后先是p1,再解引用就是a的值
4.指针数组
定义:本质上是数组,指的是存放指针的数字,具体可以类比整形数组,字符数组等等
如图:
每一个存放一个指针。
利用指针数组模拟二维数组
例如:
int a1[3] = { 1,2,3 };
int a2[3] = { 4,5,6 };
int a3[3] = { 7,8,9 };
int* arr[3] = { a1,a2,a3 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d ", *(*(arr + i) + j));//其中*(arr+i)第一层解引用表示找到a[i]也就是找到那一层,然后第二层解引用表示找到具体的数据
}
printf("\n");
}
return 0;
}
提示:当然除了*(*(arr + i) + j)这个,arr[i][j]亦可以