0. 前言
Hello,大家好呀!今天我们继续来讲解数组与指针相关笔试题
在讲解之前,让来我们来回顾一下上篇博客讲的内容:
1.
🌟🌟strlen和sizeof的对比:
1.sizeof是操作符。而strlen是库函数,需要包含头文件string.h。2.sizeof是计算操作数所占内存的大小,单位是字节。strlen是求字符串长度的,统计的是\0之前字符的个数。
3.sizeof操作符是不关心内存中存放什么数据,而strlen函数是关注内存中是否有\0,如果没有\0,就会持续往后找,可能会越界。
2. 整型数组和字符数组和字符指针相关笔试题举例分析和讲解。
本期博客会把剩下的二维数组和指针笔试题,以及指针运算相关笔试题进行讲解。
1. 预备知识
在讲解二维数组和指针相关笔试题之前,我们先带同学们回顾一下二维数组在内存中的存储
这个知识~
1.1 二维数组是怎么存储的?
像⼀维数组⼀样,我们如果想研究⼆维数组在内存中的存储⽅式,我们也是可以打印出数组所有元素的地址的。
代码如下:
#include <stdio.h>
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
输出的结果:
分析代码: 从输出的结果来看,二维数组中每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置的两个元素 (如:arr[0][4]
和arr[1][0]
) 之间也是差4个字节。
因此我们可以得出以下结论: 二维数组中的每个元素都是连续存放的。
另外,我们曾经在:【C语言】深入理解指针-优快云博客
讲过:二维数组的数组起始可以看作是一维数组的数组,也就是二维数组的每个元素是一个一维数组。那么二维数组的首元素就是第一行,是个一维数组。
如下图所示:
1.2 总结
二维数组中的每个元素都是连续存放的。
好了,当我们介绍了这些预备知识后,那我们就开始讲解一下二位数组和指针相关的笔试题吧~
2. 二维数组和指针相关笔试题
接下来,我们来看一下二维数组和指针相关的笔试题~
#include <stdio.h>
int main()
{
int a[3][4] = { 0 };
printf("%zd\n", sizeof(a));//1.输出结果是什么?
printf("%zd\n", sizeof(a[0][0]));//2.输出结果是什么?
printf("%zd\n", sizeof(a[0]));//3.输出结果是什么?
printf("%zd\n", sizeof(a[0] + 1));//4.输出结果是什么?
printf("%zd\n", sizeof(*(a[0] + 1)));//5.输出结果是什么?
printf("%zd\n", sizeof(a + 1));//6.输出结果是什么?
printf("%zd\n", sizeof(*(a + 1)));//7.输出结果是什么?
printf("%zd\n", sizeof(&a[0] + 1));//8.输出结果是什么?
printf("%zd\n", sizeof(*(&a[0] + 1)));//9.输出结果是什么?
printf("%zd\n", sizeof(*a));//10.输出结果是什么?
printf("%zd\n", sizeof(a[3]));//11.输出结果是什么?
return 0;
}
大家可以先思考一下这些题,你们认为输出结果是什么,一会儿会进行讲解~
2.1 分析
如图所示:
1.我们知道,sizeof(数组名)是计算整个数组的大小。
那从上图,我们得知,这个二维数组一共有12个元素,并且每个元素占的是4个字节,那这里总共占了12*4个字节。所以它的大小是48。
2.从上图:我们知道a[0][0]
是第一行第一个元素,大小是4个字节。
如下图所示:
3.虽然这个二维数组在我们假想中是一个多行多列的形式。
但事实上我们刚刚就介绍过二维数组在内存中是连续存放的,也就是像上图这样存储。
我们可以把这个二维数组每一行看作是一个一维数组,然后我们给每一行的一维数组都起个名,分别是a[0],a[1],a[2]。
所以说,这里a[0]实际上就是第一行的数组名,然后这里的数组名单独放在sizeof内部了,计算的是第一行的大小,而且第一行是有4个整型,所以它的大小是16个字节。
4.这里的a[0]是第一行这个数组的数组名。
但是这个数组名并非是单独放在sizeof内部,所以数组名表示数组首元素的地址,也就是a[0][0]的地址。
那a[0]+1是第一行第二个元素(a[0][1]),是地址它的大小就是4/8个字节。
5.从上题我们知道 a[0]+1是第一行第二个元素(a[0][1])的地址。
所以,*(a[0]+1)拿到的就是第一行第二个元素,大小是4个字节。
如图所示:
6. 这里我们发现a没有单独放在sizeof内部,没有&,数组名a就是首元素的地址,也就是第一行的地址。
所以a+1,就是第二行的地址。它的大小也就是4/8。这里可能有同学对此表示疑惑,为什么a+1是第二行的地址呢?
因为a是数组首元素的地址,而从上图,我们得知首行(第一行)是四个整型元素的数组,所以a的类型为in