vs2015中编译:
int main()
{
int a[4][3] = { {1,2,3}, {4,5,6},{7,8,9},{10,11,12} };
int b[4][3] = { { 1,2,3 },{ 4,5,6 },{ 7,8,9 },{ 10,11,12 } };
printf("%d\n",a);
printf("%d\n", *a);
printf("%d\n", a[0]);
printf("%d\n", a[1][2]);
printf("%d\n",*(*(a+1)+2));
printf("%d\n",*( a[1]+2));
printf("%d\n", (*(a+1))[2]);
//a[1] 等效于*(a+1)
//两种方式:a[1][2];*(a[1]+2)
//书95/108
int(*p)[3] = b;
int i, j;
for (i=0,j=0;j<3;j++)
{
printf("%d\t",*(*p+j));
}
putchar('\n');
for (i=1,j=0;j<3;j++)
{
printf("%d\t",*(p[i]+j));
}
putchar('\n');
for (i = 2, j = 0; j<3; j++)
{
printf("%d\t", *(p[i] + j));
//printf("%d\t", (*(p + i)[j]));有问题
}
putchar('\n');
for (i = 3, j = 0; j<3; j++)
{
printf("%d\t", *(&p[0][0] + i * 3 + j));
}
return 0;
}
13631028就是0x00CFFE34的十进制
1.三者数值一样,但是三者类型不一样,a与 a[0]是一级指针类型,a是数组指针
比如:int arr[100][200]
int (p)[200]
2.参与计算的方面:数组指针+1是加了整个一个数组的长度,为什么这样,因为设计者希望能够访问到下一行,
Arr + 1 1800 //数组指针
(*arr)+1 1004 //一级指针
四个分别对应: a;a+1; a+2,a+3;这四个是数组指针,每个指针都指向一个一维数组,
(相关知识点扩展:
数组的退化:
1.1不退化的场景;
1.1.1定义数组时,数组名不会退化
1.1.2求一个数组大小时 ,数组名不会退化
1.3退化场景:
由数组类型退化成为了数组指针类型
类型 退化前 退化后
一维数组 一维数组 一级指针
二维数组 二维数组 一维数组(就是这里的例子)
三维数组 三维数组 二维数组
......
)
一个小结论:
int a []={1,2,3,4,5}
int *p=a;
&a[2],a+2,&p[2],p+2表示一个一级指针类型的同一地址