我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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(&a[0] + 1));

输出结果:4 

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

 题目九:

printf("%zd\n", sizeof(*(&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


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

来源地址:https://blog.csdn.net/m0_69519887/article/details/132985924

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录