前面阿博带领友友们掌握了一维数组中sizeof和strlen的区别,今天咱们来学习二维数组,冲鸭!🦆🦆 |
一.辨识二维数组和一维数组的区别
二.了解sizeof内部运算技巧
好了,开始切入正题,上代码!👻👻`
int main()
{
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a[0][0]));
printf("%d\n", sizeof(a[0]));
printf("%d\n", sizeof(a[0]+1));
printf("%d\n", sizeof(*(a[0]+1)));
printf("%d\n", sizeof(a+1));
printf("%d\n", sizeof(*(a+1)));
printf("%d\n", sizeof(&a[0]+1));
printf("%d\n", sizeof(*(& a[0] + 1)));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a[3]));
return 0;
}
二维数组其实没有想象中的那么复杂,二维数组的数组名,也表示首元素的地址,二维数组的首元素是第一行,所以首元素的地址就是第一行的地址,是一个一维数组的地址,我们可以把二维数组看成连续的一维数组.
a[0]就是第一行的数组名,a[1]就是第二行的数组名,a[2]就是第三行的数组名,友友们只要想清楚这个,题目就好理解了.
1.sieof和a连用,这里计算整个数组的大小,而这个数组有12个整形,每个整形是4个字节,所以为48.
2.a[0][0]这里就是第一行第一个元素,所以大小为4个字节.
3.a[0]就是第一行的数组名,它和sizeof连用,所以计算的就是第一行数组元素的大小,所以为16个字节.
4.注意这里a[0]没有单独放在sizeof内部,所以它代表的是首元素的地址,就是第一行第一个元素的地址,这里容易把a[0]当成第一行的地址,大家一定要注意哦,a[0]是第一行数组名,所以它是第一行首元素的地址.所以a[0]+1就是第一行第二个元素的地址.
5.这里就相当于对第一行第二个元素解引用,拿出第一行第二个元素,所以大小为4个字节.
6.这里a作为二维数组名没有单独放在sizeof内部,所以它代表的就是首元素的地址,就是第一行的地址,再加1,就是第二行的地址,在x64环境下大小就是8个字节,在x86环境下就是4个字节.
7.这里解引用,就相当于拿出了第二行整个数组的元素,有4个整形,所以大小为16个字节. 这里也可以把*(a+1)看成a[1]
8.a[0]和&连用,代表取出的是第一行的地址,再加1,就是第二行的地址,所以大小为4/8个字节.这里我们可以调试看一下.
9.这里解引用,拿出的就是第二行的元素,所以大小为16个字节.
10.这里a没有单独放在sizeof内部,所以代表的就是首元素的地址,就是第一行的地址,所以解引用拿出第一行的元素,大小为16个字节.这里我们也可以换一种理解方式,星号a–>*(a+0)–>a[0].
11.前方高能!!!👽👽👽,这里我们不难发现根本就没有a[3],所以我们会想它是不是数组越界了呢,但是其实根本没有,让我们追溯过去吧.
int main()
{
int a = 5;
short s = 11;
printf("%d\n", sizeof(s = a + 2));
printf("%d\n", s);
return 0;
}
这里我们不难算出s=7,sizeof(s)=2,short为短整型,所以大小为2个字节.
这里我们会很迷惑为什么s的值不发生变化.其实是这样的🚀🚀🚀
由此也可以得出刚才那个a[3]的值为16,因为它也是4个整形,这里就不用担心数组越界了,因为它放在sizeof内部.
到此今天的内容就结束了,希望友友们能真正认识并且区分一维数组和二维数组,好了,下期内容阿博会继续给大家带来干货,如果对大家有帮助的话,可以给阿博点个关注哦💓💓💓 |