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

 更新时间:2023年10月08日 10:36:44   作者:luming-02  
这篇文章主要给大家汇总介绍了关于c/c++那些你一定会出错的数组笔试题,除了基本数据类型之外,其余的都作为类对象,包括数组,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言:

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

一.一维整形数组

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

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

但是有2个例外

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

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

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

题目一:

printf("%d\n", sizeof(a));

输出结果:16 

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

题目二:

printf("%d\n", sizeof(a + 0));

输出结果:4 

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

题目三:

printf("%d\n", sizeof(*a));

输出结果:4 

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

题目四:

printf("%d\n", sizeof(a + 1));

输出结果:

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

题目五:

printf("%d\n", sizeof(a[1]));

输出结果:4

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

题目六:

printf("%d\n", sizeof(&a));

输出结果:

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

题目七:

printf("%d\n", sizeof(*&a));

输出结果:16 

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

题目八:

printf("%d\n", sizeof(&a + 1));

输出结果:

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

题目九:

printf("%d\n", sizeof(&a[0]));

输出结果:

&a[0] 是首元素的地址, 计算的是地址的大小 4/8 个字节

题目十:

printf("%d\n", sizeof(&a[0] + 1));

 输出结果:4 

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

二.一维字符数组 

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

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

题目一:

printf("%d\n", sizeof(arr));

输出结果:

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

题目二:

printf("%d\n", sizeof(arr + 0));

输出结果:

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

题目三:

printf("%d\n", sizeof(*arr));

输出结果:1 

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

题目四:

printf("%d\n", sizeof(arr[1]));

输出结果:

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

题目五:

printf("%d\n", sizeof(&arr));

输出结果:

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

题目六:

printf("%d\n", sizeof(&arr + 1));

输出结果:

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

题目七:

printf("%d\n", sizeof(&arr[0] + 1));

输出结果:

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

三.二维数组 

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

int a[3][4] = { 0 };

题目一:

printf("%zd\n", sizeof(a));

输出结果:48 

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

题目二:

printf("%zd\n", sizeof(a[0][0]));

输出结果:

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

题目三:

printf("%zd\n", sizeof(a[0]));

输出结果:16 

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

题目四:

printf("%zd\n", sizeof(a[0] + 1));

输出结果:

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

        a[0] <---> &a[0][0]

        a[0]+1 ---> &a[0][1]

题目五:

printf("%zd\n", sizeof(*(a[0] + 1)));

输出结果:

        a[0] + 1是第一行第二个元素的地址,*(a[0] + 1))就是第一行第二个元素

题目六:

printf("%zd\n", sizeof(a + 1));

 输出结果:

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

题目七:

printf("%zd\n", sizeof(*(a + 1)));

输出结果:16 

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

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

题目八:

printf("%zd\n", sizeof(&amp;a[0] + 1));

输出结果:4 

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

题目九:

printf("%zd\n", sizeof(*(&amp;a[0] + 1)));

输出结果:16 

        *(&a[0] + 1) 得到的就是第二行,计算的就是第二行的大小

题目十:

printf("%zd\n", sizeof(*a));

输出结果:16 

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

题目十一: 

printf("%zd\n", sizeof(a[3]));

输出结果:16 

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

总结 

到此这篇关于c/c++那些你一定会出错的数组笔试题的文章就介绍到这了,更多相关c/c++数组笔试题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++扫盲篇之指针详解

    C++扫盲篇之指针详解

    C++中一个指针的使用就已经让很多人欲哭无泪,可是更不幸的是他还有指向指针的指针,这篇文章主要给大家介绍了关于C++扫盲篇之指针的相关资料,需要的朋友可以参考下
    2022-03-03
  • 基于MFC实现类的序列化详解

    基于MFC实现类的序列化详解

    序列化是将程序中的对象以一种二进制格式存储到存储设备中(例如文本/数据库等),以实现“永生”或随意“流动”。本文将为大家详细讲讲如何基于MFC实现类的序列化,需要的可以参考一下
    2022-07-07
  • 麻将游戏算法深入解析及实现代码

    麻将游戏算法深入解析及实现代码

    这篇文章主要介绍了麻将游戏算法深入解析及实现代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • C语言模拟掷骰子游戏

    C语言模拟掷骰子游戏

    这篇文章介绍了C语言模拟掷骰子游戏的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。需要的朋友可以收藏下
    2021-11-11
  • C++与Lua交互内存分配详解

    C++与Lua交互内存分配详解

    C/C++ 与 Lua 的交互是通过 lua_State 这一句柄进行交互,我们常规的创建都是通过 luaL_newstate 这一辅助函数,这篇文章主要给大家详细介绍了C++与Lua交互内存分配,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2023-11-11
  • C++编程产生指定范围内的随机数

    C++编程产生指定范围内的随机数

    这篇文章主要为大家详细介绍了C++编程产生指定范围内的随机数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 如何在C++类的外部调用类的私有方法

    如何在C++类的外部调用类的私有方法

    这篇文章主要介绍了如何在C++类的外部调用类的私有方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • C语言char s[]和char* s的区别

    C语言char s[]和char* s的区别

    本文主要介绍了C语言char s[]和char* s的区别,详细讲述了数组,指针的使用,具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • C语言使用realloc函数实现通讯录源码分析

    C语言使用realloc函数实现通讯录源码分析

    什么是动态通讯录,就是在静态的基础上改进了一下,不在使用数组,而是使用指针和动态内存开辟的函数,当空间不够的时候,便进行增容
    2023-02-02
  • C语言中栈的两种实现方法详解

    C语言中栈的两种实现方法详解

    栈只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作,这篇文章主要介绍了C语言对栈的实现基本操作
    2021-08-08

最新评论