首先申明本文是个人学习总结,是凭借自己的理解总结的。其中一些理解可能有错误,欢迎指出。代码是自己跑通了的。
上一篇总结搞清楚了基本的指针和一维数组,这一篇写一下二维数组,二维数组和指针搞明白了多维的也就能明白了。先看下面这个图:
这幅图表达了数组a在内存中的存储形式。a是3*3的二维数组,那么&a是0000,sizeof(a)是3x3x4=36个字节。&a[1]是0012,sizeof(a[1])是3x4=12个字节。sizeof(a[1][1])是int型,所以是4个字节。
#include<stdio.h>
#include<string.h>
int main(void)
{
int a[3][3] = {1,2,3,4,5,6,7,8,9};
int *p = (int*)(&a[1] + 1);
int *q = (int*)(int*)(&a[1][0] + 1);
printf("a的地址是:%d\n",a);
printf("sizeof(a):%d\n", sizeof(a));
printf("a[1]的地址是:%d\n", &a[1]);
printf("sizeof(a[1])是:%d\n", sizeof(a[1]));
printf("*p是:%d\n", *p);
printf("a[1][0]的地址是:%d\n", &a[1][0]);
printf("sizeof(a[1][0])是:%d\n", sizeof(a[1][0]));
printf("*q是:%d\n", *q);
}
结果如下: