c/c++ 那些你一定出错的数组笔试题

**前言:**数组是一种基础的数据结构类型,我们允许数组中可以放置很多相同数据类型的元素,不管是在日常的开发,编程,面试中,都有极为广泛的应用,今天,笔者就给大家带来一系列看似简单,但是做起来却有不少陷阱和困难的数组面试题,相信您看完本篇文章一定会有不小的收获


目录

一.一维整形数组

二.一维字符数组

三.二维数组


一.一维整形数组

在进行题目的联系讲解之前,我们要对以下知识点有一个基础的认知:

数组名的理解:数组名是数组首元素的地址

但是有2个例外

  1. sizeof(数组名),这里的数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节
  2. &数组名,这里的数组名表示整个数组,&数组名取出的是数组的地址

首先,我们定义一个数组,里面一共有 4 个整形元素,接下来的一维数组的所有题目都是基于此讨论会有怎么样的输出(以32位机器为例)

cpp 复制代码
	//一维数组
	int a[] = { 1,2,3,4 };
	//4个元素,每个元素使int类型(4个字节)

题目一:

cpp 复制代码
printf("%d\n", sizeof(a));

输出结果:16

数组名 a 单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小单位是字节,是 16 字节

题目二:

cpp 复制代码
printf("%d\n", sizeof(a + 0));

输出结果:4

a 并非单独放在sizeof内部,也没有 &,所以数组名a是数组首元素的地址,a+0还是首元素的地址,是地址大小就是 4/8 Byte

题目三:

cpp 复制代码
printf("%d\n", sizeof(*a));

输出结果:4

a 并非单独放在 sizeof 内部,也没有 &,所以数组名 a 是数组首元素的地址,*a 就是首元素,大小就是 4 Byte ,*a == *(a+0) == a0

题目四:

cpp 复制代码
printf("%d\n", sizeof(a + 1));

输出结果:4

a 并非单独放在 sizeof 内部,也没有 &,所以数组名 a 是数组首元素的地址,a+1 就是第二个元素的地址,a+1 == &a1 ,是第2个元素的地址,是地址就是 4/8 个字节

题目五:

cpp 复制代码
printf("%d\n", sizeof(a[1]));

输出结果:4

a1 就是数组的第二个元素,这里计算的就是第二个元素的大小,单位是字节

题目六:

cpp 复制代码
printf("%d\n", sizeof(&a));

输出结果:4

&a - 是取出数组的地址,但是数组的地址也是地址,是地址就是4/8个Byte,数组的地址 和 数组首元素的地址 的本质区别是类型的区别,并非大小的区别

题目七:

cpp 复制代码
printf("%d\n", sizeof(*&a));

输出结果:16

对数组指针解引用访问一个数组的大小,单位是字节,sizeof(*&a) --- sizeof(a)

题目八:

cpp 复制代码
printf("%d\n", sizeof(&a + 1));

输出结果:4

&a 数组的地址,&a+1 还是地址,是地址就是 4/8 个字节

题目九:

cpp 复制代码
printf("%d\n", sizeof(&a[0]));

输出结果:4

&a0 是首元素的地址, 计算的是地址的大小 4/8 个字节

题目十:

cpp 复制代码
printf("%d\n", sizeof(&a[0] + 1));

输出结果:4

&a0 是首元素的地址,&a0+1 就是第二个元素的地址,大小 4/8 个字节

二.一维字符数组

首先,我们定义一个字符型数组,接下来的数组的所有题目都是基于此讨论会有怎么样的输出(以32位机器为例)

cpp 复制代码
	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };//6 个元素

题目一:

cpp 复制代码
	printf("%d\n", sizeof(arr));

输出结果:6

数组名 arr 单独放在 sizeof 内部,计算的是整个数组的大小,单位是字节

题目二:

cpp 复制代码
printf("%d\n", sizeof(arr + 0));

输出结果:4

arr 是首元素的地址==&arr0,是地址就是 4/8 个字节

题目三:

cpp 复制代码
printf("%d\n", sizeof(*arr));

输出结果:1

arr是首元素的地址,*arr就是首元素,大小就是1Byte

题目四:

cpp 复制代码
printf("%d\n", sizeof(arr[1]));

输出结果:1

访问数组第一个元素大小,为char类型

题目五:

cpp 复制代码
printf("%d\n", sizeof(&arr));

输出结果:4

&arr是数组的地址,sizeof(&arr)就是 4/8 个字节

题目六:

cpp 复制代码
printf("%d\n", sizeof(&arr + 1));

输出结果:4

&arr+1 是跳过数组后的地址,是地址就是 4/8 个字节

题目七:

cpp 复制代码
printf("%d\n", sizeof(&arr[0] + 1));

输出结果:4

第二个元素的地址,是地址就是 4/8 Byte

三.二维数组

我们初始化二维数组如下,接下来的数组的所有题目都是基于此讨论会有怎么样的输出(以32位机器为例)

cpp 复制代码
int a[3][4] = { 0 };

题目一:

cpp 复制代码
printf("%zd\n", sizeof(a));

输出结果:48

数组名 a 单独放在了 sizeof 内存,表示整个数组,sizeof(a) 计算的是数组的大小,单位是字节

题目二:

cpp 复制代码
printf("%zd\n", sizeof(a[0][0]));

输出结果:4

a00 是数组的第一行第一个元素,这里计算的就是一个元素的大小,单位是字节

题目三:

cpp 复制代码
printf("%zd\n", sizeof(a[0]));

输出结果:16

a0 是第一行这个一维数组的数组名,数组名单独放在了 sizeof 内部,sizeof(a0) 计算的整个第一行这个一维数组的大小

题目四:

cpp 复制代码
printf("%zd\n", sizeof(a[0] + 1));

输出结果:4

a0 并非单独放在 sizeof 内部,也没有 &,所以 a0 表示第一行这个一维数组首元素的地址,也就是第一行第一个元素的地址

a0 <---> &a00

a0+1 ---> &a01

题目五:

cpp 复制代码
printf("%zd\n", sizeof(*(a[0] + 1)));

输出结果:4

a0 + 1是第一行第二个元素的地址,*(a0 + 1))就是第一行第二个元素

题目六:

cpp 复制代码
printf("%zd\n", sizeof(a + 1));

输出结果:4

a 作为二维数组的数组名,并没有单独放在 sizeof 内部,也没有 &,a 就是数组首元素的地址,也就是第一行的地址, a 的类型是 int(*)4,a+1 就是第二行的地址,类型是:int(*)4

题目七:

cpp 复制代码
printf("%zd\n", sizeof(*(a + 1)));

输出结果:16

a+1是第二行的地址,*(a+1)就是第二行,计算的就是第二行的大小

另外一个角度理解:*(a+1) -- a1,sizeof(a1) - a1 这个第二行的数组名,单独放在了 sizeof 内部,计算的是第二行的大小

题目八:

cpp 复制代码
printf("%zd\n", sizeof(&a[0] + 1));

输出结果:4

a0 是第一行的数组名,&a0 取出的是数组的地址,取出的是第一行这个一维数组的地址,类型就是 int(*)4 ,&a0+1 就是第二行的地址,类型就是 int(*)4

题目九:

cpp 复制代码
printf("%zd\n", sizeof(*(&a[0] + 1)));

输出结果:16

*(&a0 + 1) 得到的就是第二行,计算的就是第二行的大小

题目十:

cpp 复制代码
printf("%zd\n", sizeof(*a));

输出结果:16

a 表示数组首元素的地址,也就是第一行的地址,*a 就是第一行,也就相当于是第一行的数组名,*a--> *(a+0) -- a0

题目十一:

cpp 复制代码
printf("%zd\n", sizeof(a[3]));

输出结果:16

输出结果不会越界,还是作为一行的结果进行输出,代表一行的大小,所以是 16


本次分享就到此为止了,如有错误欢迎积极指正,希望我的分享对您有所帮助

相关推荐
apocelipes4 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
HjhIron6 小时前
面试常客:字符串算法从入门到进阶
算法·面试
大志说编程6 小时前
Agent面试真题06: 十分钟带你快速掌握Agent记忆管理高频面试题(附详细答案)
后端·面试·ai编程
众人皆醒我独醉6 小时前
Kubernetes 为什么不直接调度容器?非要套一层 Pod
面试
亮亮不想说话958887 小时前
iOS底层探索 -- GCD分析
面试
程序员小假8 小时前
从问题到答案:RAG系统完整处理流程与核心机制深度拆解
后端·面试·agent
沉默王二14 小时前
阿里一面,我霸气反问:你说你们在做Agent项目,说说langchain、muti-agent、a2a这些你们都是怎么做的?面试官一直在擦汗。。
面试·agent·ai编程
云技纵横14 小时前
@Transactional 里套 REQUIRES_NEW,为什么会把连接池耗尽?
后端·面试
weedsfly14 小时前
栈和堆:JavaScript 内存的“旅馆”和“仓库”
前端·javascript·面试
SamDeepThinking14 小时前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试