指针数组 :存放指针的数组
数组名为数组首元素的地址 即为指针。 将数组名放在数组中,
则有以下代码:
#include<stdio.h>
int main() {
int z[] = { 1,2,3,4,5 };
int s[] = { 6,7,8,9,10 };
int r[] = { 11,12,13,14,15 };
int l[] = { 16,17,18,19,20 };
int* a[4] = { z,s,r,l };//arr数组中有四个元素,元素类型为整形指针
int i = 0;
int j = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++) {
printf("%d ", *(a[i] + j));
// a[i]表示指针数组a中的指针, a[i]+j为数组zsrl中,元素的地址 *(a[i] + j) 对其解引用 找到地址中的值
printf("\n");
}
}
系统分别为数组z,s,r,l分配了不同的空间,有了指针数组a,将z,s,r,l的各首元素地址(也就是指针)放在数组a中。
看似是是将z,s,r,l的地址连接在了一起 实际上并没有。
/*********************************************************************************************************/
以上代码 循环嵌套 与二维数组输出类似。
#include<stdio.h>
int main() {
int a[4][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};
int i = 0, j = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 5; j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
二维数组中 各个元素的地址在内存中都为连续的
/*************************************************************************************************************/
解引用操纵符的个人理解
printf("%d ",a[i][j]);与printf("%d ", *(a[i] + j));结果相同
int a[]={1,2,3,4,5};
int *p=a;
是否解引用操作符 的操作为 a[i]==*(p+i)?
其中p=a;那么a[i]==*(a+i)
经验证 解引用的操作为 a[i]==*(a+i);
将a[i][j]中的a[i]看成A 则 A[j]==*(A+j) a[i][j]=*(a[i]+j)