一维数组
int a[] = { 1, 2, 3, 4, 5, 6, 7 };
a表示什么?* a表示什么?a[]表示什么?
a表示什么?
a只有在siezof(a)和&a这两种情况下表示整个数组,其余情况均表示首元素地址。
a是一个数组,单独的a表示数组中首元素的地址。
*a表示什么?
即对a解引用,a表示首元素地址,* a表示首元素,类型是int
a[]表示什么?
首先分析这里的a是什么,a是首元素地址,a[i] 表示数组中第i+1个元素,因为数组的下标是从0
开始的,a[0]表示数组的第一元素,我们前面知道* a也表示数组的第一个元素,* a和a[0]都表示第一个元素。
那么*(a+1)呢,a表示首元素地址,+1为第二元素地址,解引用表示第二个元素。与a[1]相同,都是int类型
a[i]等价于 *(a+i)
二维数组
int b[][3] = { { 1, 2, 3 }, { 7, 8, 9 }, { 4, 5, 6 } };
在分析二维数组时必须要明白很关键的两点
1.可以将二维数组看成一个一维数组,这个一维数组存的元素是一维数组,类似的可以将一个n维数组看成一个一维数组。
2.数组在内存中是线性存储的。
类似一维数组,我们来分析二维数组
b是什么? * b是什么? b[]是什么? *b[]是什么? **b是什么
b是什么?
同一维数组,只有在siezof(b)和&b这两种情况下表示整个数组,其余情况均表示 首元素地址。
那么在一个二维数组中,首元素是什么?,首元素地址是什么?
前面说过一个二维数组,可以看成一个一维数组,这个一维数组的元素为一维数组,所以在二维数组中,首元素是一个一维数组。b的首元素为一个一维数组,这个一维数组存放着{1,2,3}。那么b+1是什么?把b当成一个一维数组,我们想想一维数组a+1得到的是什么,a+1得到的是第二个元素的地址,所以b+1也应该得到第二个元素的地址,即第二个数组(7,8,9)的地址。
后面的类型int[3]*也可以看出,b+1是一个地址,这个地址指向的是一个数组,这个数组的类型是int型,有3个元素。
再分析下 * b+1是什么,b代表的是首元素地址即数组{1,2,3}的地址,解引用 *b得到数组相当于b[0]再加1得到2的地址。
再来分析首元素地址,数组b 首元素地址是数组{1,2,3}的地址,而一维数组{1,2,3}的地址也就是首元素{1}的地址,所以在数值上他们的地址是相同的,都为元素1的地址,但是他们的含义是不一样的。
下面来看看他们的区别
分析:&b[0][0]+1?&b[0]+1?b+1?&b+1?的结果会是什么?
分析:
b和b+1
b为首元素地址即数组{1,2,3},b+1为下一个元素{7,8,9}地址,地址大小增加了sizeof(int)*3
&b和&b+1
&b代表的是整个数组,&b+1地址大小增加sizeof(int) *3 *3
&b[0]和&b[0]+1
b[0]代表第一个元素,二维数组中b[0]表示数组{1,2,3},&b[0]得到这个数组的地址,&b[0]+1为下一个数组的地址
&b[0][0]和&b[0][0]+1
&b[0][0]代表第一个元素的地址&b[0][0]+1代表第二个元素的地址
在一维数组中 a[i]等价 * (a+i)
二维数组同样如此, b[i]等价于 *(b+i)
前面分析了b是数组首元素地址,这个地址指向第一个数组{1,2,3},b+i也是地址,指向第i-1个数组,以i = 1举例,b+1 表示二维数组b的第二个元素地址,第二个元素为数组{7,8,9},再解引用(b+1)表示这个数组,即b[1]
b+1是数组地址,解引用后 *(b+1)是数组,等价于b[1],相当于数组名。
b[1]既然表示的是一个一维数组,前面讲过,数组名表示首元素地址,那个b[1]表示首元素7的地址,
将b[1]解引用得到元素7
总结 :int a[] = { 1, 2, 3, 4, 5, 6, 7 };
int b[][3] = { { 1, 2, 3 }, { 7, 8, 9 }, { 4, 5, 6 } };
数组名就是数组首元素地址!!!
b是什么?
首元素地址,地址指向数组{1,2,3},与1的地址相同,b+1指向下一个数组和7的地址相同。
*b是什么?
先分析一维数组 * a是什么,a为首元素地址即1的地址,解引用得到首元素1
再来分析b,b为首元素地址,首元素是什么?数组{1,2,3}解引用得到首元素{1,2,3}
**b是什么?
*b表示数组{1,2,3},*b首元素1的地址,对 * b解引用 即 * *b得到元素1
b[0]是什么?
b[0]等价于 * (b+0),b表示首元素地址解引用的首元素{1,2,3}
*b[0]是什么
b[0]表示数组{1,2,3}解引用得到元素1