指针和数组笔试题解析

大家好,我们今天来学习有关于指针和数组的笔试题解析。
在这里插入图片描述

在之前的C语言学习中我们知道了数组名代表的是数组首元素的地址,而有两个例外,就是sizeof中和&符操作取的就是整个数组的地址,那么我们今天的学习重点就是这些关于数组和指针的习题讲解。

下面让我们看到一维数组的习题:

int main()
{//一维数组int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));printf("%d\n", sizeof(a + 0));printf("%d\n", sizeof(*a));printf("%d\n", sizeof(a + 1));printf("%d\n", sizeof(a[1]));printf("%d\n", sizeof(&a));printf("%d\n", sizeof(*&a));printf("%d\n", sizeof(&a + 1));printf("%d\n", sizeof(&a[0]));printf("%d\n", sizeof(&a[0] + 1));return 0;
}

在做这个题我们要知道:数组名a单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小,单位是字节
第一个我们sizeof(a)操作,实际上就是整个数组的大小,因为一个整型是4个字节,那么整个数组就是16个字节。
第二个因为a不是单独放在sizeof中,也没有取地址符,那它代表的就是数组首元素的地址,a+0代表的就是首元素的地址,是地址的话就是4/8个字节。
第三个a并非单独放在sizeof内部,也没有&,所以数组名a是数组首元素的地址,*a 就是 首元素,大小就是4个字节 。*a == *(a+0) == a[0]
第四个a并非单独放在sizeof内部,也没有&,所以数组名a是数组首元素的地址,a+1就是第二个元素的地址,是地址的话就是4/8个字节。
第五个a[1]就是数组的第二个元素,这里计算的就是第二个元素的大小,单位是字节,也就是为4个字节。
第六个&a - 是取出数组的地址,但是数组的地址也是地址,是地址就是4/8个Byte,在这里我们需要注意数组的地址 和 数组首元素的地址 的本质区别是类型的区别,并非大小的区别,只要是地址大小就是4/8个字节。
第七个对数组指针解引用访问一个数组的大小,单位是字节,这里也就是访问这个数组的大小,这个数组有4个元素,一个元素的大小是4个字节,那这个数组的大小就是16个字节。
第八个&a数组的地址,&a+1还是地址,是地址就是4/8个字节。
第九个&a[0]是首元素的地址, 计算的是地址的大小 4/8 个字节。
第十个&a[0]是首元素的地址,&a[0]+1就是第二个元素的地址,大小4/8个字节。

看到我们程序运行的结果:
在这里插入图片描述
学到这里大家应该都明白了吧,那么我们就进行下一个习题讲解。

字符数组

int main()
{//字符数组char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr + 0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr + 1));printf("%d\n", sizeof(&arr[0] + 1));return 0;
}

看到上面一维数组的讲解那么这个题是不是就迎刃而解了呢。

第一个题数组名单独放在sizeof中就是整个数组的大小,char型的大小是一个字节,所以整个数组的大小就是6个字节。
第二题数组名没有单独放在sizeof中也没有&所以就是首元素的地址,arr+0也相当于首元素的地址,是地址的话大小就是4/8个字节。
第三题代表的就是首元素的地址,那么对它解引用就是第一个元素的大小,也就是1个字节。
第四个就是求第一个元素的大小,单位是字节,所以就是1个字节。
第五个就是对数组名取地址,用了&那么就是整个数组的地址,所以是地址的话就是4/8个字节。
第六个和第五个差不多,只不过第六题里跳过了整个数组,取的仍然是地址,是地址的话就是4/8个字节。
第七个代表的就是数组中第二个元素的地址,是地址的话就是4/8个字节。
在这里插入图片描述

到这里的话,以大家的聪明肯定已经理解了,那我们就进入到下一个题的讲解。

strlen类型题

int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", strlen(arr));printf("%d\n", strlen(arr + 0));printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr + 1));printf("%d\n", strlen(&arr[0] + 1));return 0;
}

做这种题的时候我们要知道strlen计算的是/0之前的字符个数。
第一题因为我们数组中没有’/0’,所以我们算出来的是一个随机值。
第二题arr是首元素的地址, arr+0还是首元素的地址,因为数组中没有‘/0’,不知什么时候会碰到‘/0’,所以我们这里算出来也是随机值。
第三题对首元素的地址,对它解引用之后得到的是字符‘a’的Ascall值,站在strlen的角度,认为传参进去的’a’-97就是地址,97作为地址,直接进行访问,就是非法访问。
第四题这个和第三题是一样的,传参进去的是‘b’的Ascall值,所以也是非法访问。
第五题这里我们取的整个数组的地址我们对它进行访问的时候也是不知道什么时候回碰到‘/0’,所以也是随机值。
第六题我们也是一样的,不过这里是跳过整个数组开始访问,也是不知道在哪里会碰到‘/0’所以这里也是一个随机值。
第七题我们这里是取的第二个元素的地址,我们从第二个元素开始访问,但也是不知道什么时候碰到’/0’,所以得到的也是一个随机值。

下面就是字符串类型的习题了:

int main()
{char arr[] = "abcdef";printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr + 0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr + 1));printf("%d\n", sizeof(&arr[0] + 1));return 0;
}

做这个题之前我们要明白这是一个字符串,最后一个字符的后面隐藏了一个’/0’。

第一个我们这里是求整个数组的大小,因为字符串里面有一个’/0’,所以我们这里打印的结果就是7个字节。
第二个这里表示的第二个元素的地址,所以是地址的话就是4/8个字节。
第三个因为这个里面的数组名表示的是首元素的地址,所以对它解引用操作求的是首元素的大小,所以大小是1个字节。
第四个表示的是数组中第二个元素,所以求它的大小就是1个字节。
第五个这里是&操作,所以代表的是整个数组的地址,是地址的话就是4/8个地址。
第六个也一样,跳过了整个数组,仍然取的是地址,是地址的话就是4/8个字节。
第七个这里是第二个元素的地址,所以大小也是4/8个字节。

让我们看看程序运行的结果吧。
在这里插入图片描述

字符串的strlen类型

int main()
{char arr[] = "abcdef";printf("%d\n", strlen(arr));printf("%d\n", strlen(arr + 0));printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr + 1));printf("%d\n", strlen(&arr[0] + 1));return 0;
}

第一个我们知道就是整个数组的大小就是6。
第二个是数组首元素的地址所以从首元素开始访问,所以是6。
第三个传的是首元素的Ascall值,所以是非法访问。
第四个传的是第二个元素的值,所以也属于非法访问。
第五个和第六个都是随机值。
第七个因为是第二个元素的地址,所以从第二个元素开始访问,所以大小就是5。

接下来就是我们最近学的火热的指针类型了

int main()
{char* p = "abcdef";printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));return 0;
}

第一个 计算的是指针变量的大小,所以是4/8个字节。
第二个p+1代表的第二个元素的地址,所以大小是4/8个字节。
第三个对指针解引用得到是’a’所以是1个字节。
第四个因为 p[0]–> *(p+0) --> *p == ‘a’,所以也是一个字节。
第五个&p 是地址,所以是4/8个字节。
第六个4/8个字节,&p 是地址。
第七个代表的是第二个元素的地址,所以从第二个元素开始访问,所以就是5个字节。

接下来就是最后一个,二维数组的习题

int main()
{int a[3][4] = { 0 };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单独放在了sizeof内存,表示整个数组,sizeof(a)计算的是数组的大小,单位是字节,所以是48个字节。
第二个a[0][0]是数组的第一行第一个元素,这里计算的就是一个元素的大小,单位是字节,所以是4个字节。
第三个a[0]是第一行这个一维数组的数组名,数组名单独放在了sizeof内部,/a[0]就表示整个第一行这个一维数组,sizeof(a[0])计算的整个第一行这个一维数组的大小,所以就是16个字节。
第四个a[0]并非单独放在sizeof内部,也没有&,所以a[0]表示第一行这个一维数组首元素的地址,也就是第一行第一个元素的地址,因为a[0] <—> &a[0][0],所以a[0]+1 —> &a[0][1],因为是地址所以就是4/8个字节。
第五个a[0] + 1是第一行第二个元素的地址,(a[0] + 1))就是第一行第二个元素,所以就是4个字节。
第六个a 作为二维数组的数组名,并没有单独放在sizeof内部,也没有&,a就是数组首元素的地址,也就是第一行的地址, a 的类型是 int(
)[4],a+1 就是第二行的地址,类型是:int()[4],所以是4/8个字节。
第七个a+1是第二行的地址,
(a+1)就是第二行,计算的就是第二行的大小,另外一个角度理解:(a+1) – a[1],sizeof(a[1]) - a[1]这个第二行的数组名,单独放在了sizeof内部,计算的是第二行的大小,所以就是16个字节。
第八个a[0]是第一行的数组名,&a[0]取出的是数组的地址,取出的是第一行这个一维数组的地址,类型就是int(
)[4],&a[0]+1 就是第二行的地址,类型就是int()[4],所以就是4/8个字节。
第九个
(&a[0] + 1)得到的就是第二行,计算的就是第二行的大小,所以就是16个字节。
第十个a表示数组首元素的地址,也就是第一行的地址,*a 就是第一行,也就相当于是第一行的数组名,所以就是计算第一行的大小,大小就是16个字节。
第十一个这里我们要注意的是a[3]表示的是第四行的地址,但是我们只定义了三行,但是这里呢我们不算是越界,所以大小是16个字节。

最后让我们来看看程序运行的结果吧:

在这里插入图片描述
学完这里想必大家都非常的烧脑吧,那么我们今天就学到这里,谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/135178.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈希(hash)——【C++实现】

本章gitee代码仓库&#xff1a;Hash 文章目录 &#x1f490;1. 哈希概念&#x1f33b;2. 哈希冲突&#x1f33c;3. 哈希函数&#x1f338;3.1 哈希函数设计原则&#x1f338;3.2 常见哈希函数 &#x1fab4;4. 哈希冲突解决方案&#x1f331;4.1 闭散列——开放定址法&#x1f…

【ROS】Ubuntu20.04+ROS Noetic 配置PX4-v1.12.2和Gazebo11联合仿真环境【教程】

【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】 文章目录 【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】0. 安装UbuntuROS1. 安装依赖2. 安装QGC地面站3. 配置PX4-v1.12.23.1 安装PX43.2 测试PX4是否成功安装…

Java常见面试题(含答案,持续更新中~~)

目录 1、JVM、JRE和JDK的关系 2、什么是字节码&#xff1f;采用字节码的最大好处是什么 3、Java和C的区别与联系 4、Java和GO的区别与联系 5、 和 equals 的区别是什么&#xff1f; 6、Oracle JDK 和 OpenJDK 的对比 7、String 属于基础的数据类型吗&#xff1f; 8、fi…

外星人入侵游戏-(创新版)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

【Tensorflow 2.12 电影推荐项目搭建】

Tensorflow 2.12 电影推荐项目搭建 学习笔记工具、环境创建项目项目配置安装相关python包召回模型实现排序模型实现实现电影推荐导入模块设置要推荐的用户召回推荐排序推荐推荐结果结尾学习笔记 Tensorflow 2.12 电影推荐项目搭建记录~ Tensorflow是谷歌开源的机器学习框架,可…

再次理解Android账号管理体系

目录 ✅ 0. 需求 &#x1f4c2; 1. 前言 &#x1f531; 2. 使用 2.1 账户体系前提 2.2 创建账户服务 2.3 操作账户-增删改查 &#x1f4a0; 3. 源码流程 ✅ 0. 需求 试想&#xff0c;自己去实现一个账号管理体系&#xff0c;该如何做呢&#xff1f; ——————————…

MySQL 学习笔记(基础)

首先解释数据库DataBase&#xff08;DB&#xff09;&#xff1a;即存储数据的仓库&#xff0c;数据经过有组织的存储 数据库管理系统DataBase Management System&#xff08;DBMS&#xff09;&#xff1a;管理数据库的软件 SQL&#xff08;Structured Query Language&#xf…

3D视觉到三维视觉之结构光

3D视觉是计算机视觉的终极体现形式 2D视觉技术主要在二维空间下完成工作&#xff0c;三维信息基本上没有得到任何利用&#xff0c;而三维信息才真正能够反映物体和环境的状态&#xff0c;也更接近人类的感知模式。近年来&#xff0c;学术界和工业界推出了一系列优秀的算法和产…

redis 哨兵(sentinel)机制

1. 前言 sentinel&#xff08;哨兵&#xff09;是Redis 的高可用性解决方案之一。通过哨兵可以创建一个当主服务器出现故障时自动将从服务器升级为主服务器的分布式系统&#xff0c;解决了主从复制出现故障时需要人为干预的问题。 redis 的主从复制的作用有数据预热、负载均衡…

【初阶数据结构】树(tree)的基本概念——C语言

目录 一、树&#xff08;tree&#xff09; 1.1树的概念及结构 1.2树的相关概念 1.3树的表示 1.4树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二、二叉树的概念及结构 2.1二叉树的概念 2.2现实中真正的二叉树 2.3特殊的二叉树 2.4二叉树的性质…

使用 Feature Flags 实现数据库灰度迁移的监控与可观测性

作者&#xff1a;观测云与胡博 场景描述 很多企业会遇到数据库升级、或数据库迁移的情况&#xff0c;尤其是在自建数据库服务向云数据库服务、自建机房向云机房、旧数据库向新数据库迁移等场景。 然而&#xff0c;我们需要在整个移植过程中保证其稳定性、避免数据遗失、服务宕…

获取spring容器中的bean实例

在开发过程中&#xff0c;我们可能需要动态获取spring容器中的某个bean的实例&#xff0c;此时我们就会用到ApplicationContext spring应用上下文&#xff0c;这里做一下记录&#xff0c;网上很多类似的的工具类。 先写好工具类再测试一下是否好用 工具类&#xff1a; packag…

【pytest】生成测试报告

0. 脚本&#xff1a; fixture/test_fixtures_02.py # 功能函数 import pytestdef multiply(a, b):return a * bclass TestMultiply:# fixturesclassmethoddef setup_class(cls):print("setup_class>")classmethoddef teardown_class(cls):print("teardown_c…

最小二乘法

Least Square Method 1、相关的矩阵公式2、线性回归3、最小二乘法3.1、损失函数&#xff08;Loss Function&#xff09;3.2、多维空间的损失函数3.3、解析法求解3.4、梯度下降法求解 1、相关的矩阵公式 P r e c o n d i t i o n : ξ ∈ R n , A ∈ R n ∗ n i : σ A ξ σ ξ…

Linux驱动之INPUT设备驱动

目录 一、开发环境 二、编写按键input设备的注册与事件上报 2.1 修改设备树文件 1 添加 pinctrl 节点 2、添加 KEY 设备节点 3、检查 PIN 是否被其他外设使用 2.2 驱动程序编写 2.3 测试APP编写 2.4 运行测试 三、Linux内核自带按键input设备驱动 3.1 自带按键驱动程序源码简…

C#实现钉钉自定义机器人发送群消息帮助类

一、自定义机器人发送群消息使用场景 在企业中,针对一些关键指标内容(如每天的生产产量、每天的设备报警信息等信息),需要同时给多人分享,此时就可以将需要查看这些数据的人员都拉到一个群中,让群里的机器人将这些关键指标内容推送到群里即可【(目前已实现在钉钉群里创建…

Web 器学习笔记(基础)

Filter 过滤器 概念&#xff1a;表示过滤器&#xff0c;是 JavaWeb 三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一 作用&#xff1a;顾名思义可以过滤资源的请求&#xff0c;并实现特殊的需求 Filter 接口及它核心的 doFilter() 方法&#xff08;执行前就是…

Excel 公式函数:学习基本示例

数据准备 对于本教程&#xff0c;我们将使用以下数据集。 家居用品预算 S / N项目数量价格小计价格适中吗&#xff1f;1芒果96002橘子312003番茄125004食用油565005汤力水133900 房屋建筑项目时间表 S/NITEM开始日期结束日期持续时间&#xff08;天&#xff09;1调查土地0…

000_差分信号

1.什么是差分信号 差分信号又叫做差模信号&#xff0c;使用差分信号传输时&#xff0c;需要2根信号线&#xff0c;这2根信号线的振幅相等&#xff0c;相位相反&#xff0c;通过2根信号线的电压差值来表示逻辑0和逻辑1。 差分信号表示逻辑值如下图&#xff1a; 2.差分信号的特…

IDEA2023.2.1中创建第一个Tomcat的web项目

首先&#xff0c;创建一个普通的java项目。点击【file】-【new】-【project】 创建一个TomcatDemo项目 创建如下图 添加web部门。点击【file】-【project structure】 选择【modules】-选中项目“TomcatDemo” 点击项目名上的加号【】&#xff0c;添加【web】模块 我们就会发现…