最近学完了C语言指针的基本内容,开始学习多维数组与指针,写下一点自己的学习心得。C语言中的多维数组指针是比较复杂的,需要多理解和多思考,先举个例子,对于一个二维数组a,他有三行四列。如图所示:
a[0] |
1 |
3 |
5 |
7 |
a[1] |
9 |
11 |
13 |
15 |
a[2] |
17 |
19 |
21 |
23 |
可以看到这个数组包含了12个元素,一共有3行,4列,我们可以这样看,这个二维数组是由3个一维数组所组成的,每个一维数组又包含了4个元素,a[0][0],a[0][1],a[0][2]
在一维数组中,a代表了数组的首元素地址,那么在二维数组中,a代表了就是第0行的首地址,那么第一行的首地址就是 a+1, 如果我们说第0行的首地址是2000,在Turbo C 中第1行的地址就是2008,因为第0行有4个整型数据,他们在内存单元中占据了4*2=8个内存单元,所以a+1的首地址就是2008,那么由此可以推导出,a+1就是a[1]的地址,同理可以推导出 a+2就是a[2]的首地址……
a[0] a[1] a[2]是一维数组名,C语言规定 数组名代表数组首元素的地址,所以a[0]就是a[0][0]的地址,也就等于&a[0][0] a[1]=&a[1][0] a[2]=&a[2][0]
那么 第0行1列的元素地址怎么表示呢? a[0]这个一维数组名代表的是第0行的首地址,注意,a代表的是列的首地址,而a[0]则代表的是行的首地址,如果说第1行是a+1,那么第一列就是a[0]+1,以此类推…… 因为a指向的是a[0]的地址。所以a其实是一个指针变量,他存放的是a[0]的地址,然而a[0]则存放的是a[0][0]的首地址,那么前面已经知道,*a等于a[0],因为a中存放的是a[0]所在的地址,那么我们要求a[0][0]的地址就应该是* *a,或者*a[0],也就是说,这个指针其实有两个指向。请看图:
看图应该就很清楚了,写到这里,如有错误望各位前辈请多多指教