//可以把a看成一个一维数组,这个一维数组有三个元素: a[0] ,a[1], a[2],每个元素又是一个包含4个元素的一维数组。
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int *p;
p = (int *)a; //强制转换,p指向数组的首地址
return;
}
所以a+1跳过16个字节,也就是 a = 1000,a+ 1 = 1016;
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int *p;
p = (int *)(a+1);
p = (int *)(a+2);
return;
}
0x0034fc6c a的地址 1000
0x0034fc7c a+1的地址 1016
0x0034fc8c a+2的地址 1032
C语言规定数组名代表数组的首地址,所以就有如下:
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int *p;
p = a[0]; //地址:0x0042f7cc
p = a[1]; //地址:0x0042f7dc
return;
}
&a[0][1], a[0] + 1; --1004
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int *p;
p = &a[0][1]; //地址:0x000ffb30
p = a[0] + 1; //地址:0x000ffb30
return;
}
注意,不要把*(a+1)+2写成*(a+3),那就变成a[3];
a[i]的性质问题:
a[i] 和 &a[i]地址是一样的
实例:
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
a[i][j] = 86;
}
}
int *p;
p = (int *)(a+1); //第一行首地址; //a[1][0]....a[1][3]
*p = 56; //a[1][0] = 56
p++; //走4个字节 a[1][1]
*p = 78; //相当于a[1][1] = 78;
return;
}
//首先这是个数组,数组中有10个元素,每个元素都是个指针,所以这相当于定义了10个指针变量,也就是p[0]-p[9];
int *p[10]; //能引用的下标是[0]-[9]
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
a[i][j] = 86;
}
}
int *p[4]; //指针数组,能引用的下标[0]-[3]
p[0] = &a[0][0];
p[1] = &a[0][1];
p[2] = &a[0][2];
p[3] = &a[0][3];
for(j = 0;j < 4;j++)
{
printf("value = %d\n",*(p[j]));
}
return;
}
int (*p)[10];是一个指针变量,这个指针变量用来指向含有10个元素的一维数组。
int main()
{
int (*p)[10];
int a[10]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 10;i++)
{
a[i] = i;
}
p = &a; //&地址符
int *q;
q = (int *)p;
for(j = 0;j < 10;j++)
{
printf("value = %d\n",*q);
q++;
}
return;
}
int main()
{
int (*p)[10];
int a[3][10]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 10;j++)
{
a[i][j] = i+j;
}
}
p = a; //二维数组名可以直接赋值给数组指针
int *q;
q = (int *)p;
for(i = 0;i < 3;i++)
{
q = *(p +i); // 每次指向一个新行
for(j = 0;j < 10;j++)
{
printf("value = %d\n",*q);
q++;
}
printf("--------------\n");
p++; //跳40个字节
q = (int *)p;
}
return;
}
int main()
{
int (*p)[10];
int a[3][10]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 10;j++)
{
a[i][j] = i+j;
}
}
p = a; //二维数组名可以直接赋值给数组指针
int *q;
q = (int *)p;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 10;j++)
{
printf("value = %d\n",*(*(p+i)+j));
}
printf("--------------\n");
p++; //跳40个字节
q = (int *)p;
}
return;
}
整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记