【C生万物】 指针和数组笔试题汇总 (上)

news2024/11/26 11:31:11

 欢迎来到 Claffic 的博客 💞💞💞                               👉 专栏:《C生万物 | 先来学C》👈

前言:

在学习完初级和进级的指针之后,为了检验掌握程度,这里出一期指针和数组的笔试题,看看你掌握的怎么样吧!


目录

Part1:数组笔试题

1.做题

1.1一维数组

1.2字符数组

1.3二维数组

2.总结


Part1:数组笔试题

1.做题

1.1一维数组

计算大小:

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));

这里可以暂停,自己做一下。

答案及解析:

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));        16 -- 整个数组的大小 4*4 == 16
printf("%d\n",sizeof(a+0));      8  -- + 0这个动作表明是指针 64位下指针大小固定为 8
printf("%d\n",sizeof(*a));       4  -- 首元素地址解引用得到首元素1,一个整型大小为4
printf("%d\n",sizeof(a+1));      8  -- 指针大小
printf("%d\n",sizeof(a[1]));     4  -- 元素2的大小
printf("%d\n",sizeof(&a));       8  -- &a代表指向数组a的指针
printf("%d\n",sizeof(*&a));      16 -- 承上,解引用后表示整个数组
printf("%d\n",sizeof(&a+1));     8  -- 指针+1,表示步长,即指针大小
printf("%d\n",sizeof(&a[0]));    8  -- 首元素地址,指针大小
printf("%d\n",sizeof(&a[0]+1));  8  -- 步长,即指针大小

1.2字符数组

计算大小:

第一部分

char arr[] = { 'a','b','c','d','e','f' }; // 没有\0
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));

答案及解析:

char arr[] = { 'a','b','c','d','e','f' };  // 没有\0
printf("%d\n", sizeof(arr));          6 -- 所有字符的总大小,一个字符一字节,共6字节
printf("%d\n", sizeof(arr + 0));      8 -- 表示指针,8字节
printf("%d\n", sizeof(*arr));         1 -- 首元素地址解引用得到首元素,大小为1
printf("%d\n", sizeof(arr[1]));       1 -- 元素b的大小
printf("%d\n", sizeof(&arr));         8 -- 指向整个数组的指针大小
printf("%d\n", sizeof(&arr + 1));     8 -- 指针步长
printf("%d\n", sizeof(&arr[0] + 1));  8 -- 指向首元素指针的步长

 

第二部分 

char arr[] = { 'a','b','c','d','e','f' };  // 没有\0
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));

答案及解析:

char arr[] = { 'a','b','c','d','e','f' };  // 没有\0
printf("%d\n", strlen(arr));         随机值 -- arr表示首元素地址,但不知道\0在哪,不知道停止
printf("%d\n", strlen(arr + 0));     随机值 -- 同上,表示地址
printf("%d\n", strlen(*arr));        报错 -- ==strlen('a'),非法访问
printf("%d\n", strlen(arr[1]));      报错 -- ==strlen('b'),非法访问
printf("%d\n", strlen(&arr));        随机值 -- 从整个数组开始,向后寻找\0停止
printf("%d\n", strlen(&arr + 1));    随机值 -- 从跳过整个数组开始,向后寻找\0停止
printf("%d\n", strlen(&arr[0] + 1)); 随机值 -- 从'b'的地址开始,向后寻找\0停止

 

第三部分 

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));

答案及解析: 

char arr[] = "abcdef";  // 末尾有\0
printf("%d\n", sizeof(arr));       7 -- 包含\0在内   
printf("%d\n", sizeof(arr+0));     8 -- 指针大小
printf("%d\n", sizeof(*arr));      1 -- a的大小
printf("%d\n", sizeof(arr[1]));    1 -- b的大小
printf("%d\n", sizeof(&arr));      8 -- 字符串指针的大小
printf("%d\n", sizeof(&arr+1));    8 -- 字符串指针的步长大小
printf("%d\n", sizeof(&arr[0]+1)); 8 -- 首元素指针的步长大小

第四部分 

char arr[] = "abcdef";  // 末尾有\0
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));

答案及解析: 

char arr[] = "abcdef";  // 末尾有\0
printf("%d\n", strlen(arr));       6 -- 计算\0之前的大小
printf("%d\n", strlen(arr+0));     6 -- 同上
printf("%d\n", strlen(*arr));      报错 -- 给strlen传递'a'
printf("%d\n", strlen(arr[1]));    报错 -- 给strlen传递'b'
printf("%d\n", strlen(&arr));      6 -- 取出起始位置的地址
printf("%d\n", strlen(&arr+1));    随机值 -- 跳过整个数组(包含\0)
printf("%d\n", strlen(&arr[0]+1)); 5 -- 从b开机计算大小,到\0之前

第五部分 

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));

答案及解析:

char *p = "abcdef";
printf("%d\n", sizeof(p));       8 -- p是指针变量,即指针大小
printf("%d\n", sizeof(p+1));     8 -- p+1是指针变量
printf("%d\n", sizeof(*p));      1 -- 即a的大小
printf("%d\n", sizeof(p[0]));    1 -- 即a的大小
printf("%d\n", sizeof(&p));      8 -- 二级指针大小
printf("%d\n", sizeof(&p+1));    8 -- 指向整个字符串的指针步长
printf("%d\n", sizeof(&p[0]+1)); 8 -- 指向b的指针的大小

第六部分 

char* p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p + 1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p + 1));
printf("%d\n", strlen(&p[0] + 1));

答案及解析:

char* p = "abcdef";                
printf("%d\n", strlen(p));         6 -- 标准求字符串长度
printf("%d\n", strlen(p + 1));     5 -- 从b开始求字符串长度
printf("%d\n", strlen(*p));        报错 -- strlen(a)
printf("%d\n", strlen(p[0]));      报错 -- 同上
printf("%d\n", strlen(&p));        随机值 -- 指向p的指针,另起
printf("%d\n", strlen(&p + 1));    随机值 -- 跳过指向p的指针
printf("%d\n", strlen(&p[0] + 1)); 5 -- 从b开始求字符串长度

 

1.3二维数组

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]));

答案及解析:

因为是二维数组,这里画个图会好理解些:

 

注意:可以先这样理解,实际内存中是连续存储的。

int a[3][4] = {0};                 
printf("%d\n",sizeof(a));           48 -- 整个二位数组的大小 3*4*4
printf("%d\n",sizeof(a[0][0]));      4 -- 下标为0,0,即第一个元素的大小
printf("%d\n",sizeof(a[0]));        16 -- a[0]作为第一行的数组名,单独放在sizeof内部,计算的是数组第一行的大小
printf("%d\n",sizeof(a[0]+1));       8 --a[0]作为第一行的数组名,没有单独放在sizeof内部,没有取地址,表示的就是数组首元素的地址,即a[0][0]的地址,再+1就是a[0][1]的地址,是地址就是指针,指针大小
printf("%d\n",sizeof(*(a[0]+1)));    4 -- 第一行第二个元素的大小
printf("%d\n",sizeof(a+1));          8 -- a是二维数组的数组名,数组名表示首元素的地址,就是第一行的地址,a+1就是第二行的地址,是地址就是指针,指针大小
printf("%d\n",sizeof(*(a+1)));       16 -- 第二行的大小
printf("%d\n",sizeof(&a[0]+1));       8 -- &a[0]是第一行的地址,&a[0]+1就是第二行的地址,地址的大小指针大小
printf("%d\n",sizeof(*(&a[0]+1)));   16 -- 第二行的大小
printf("%d\n",sizeof(*a));           16 -- a表示首元素的地址,就是第一行的地址,*a就是第一行,计算的就是第一行的大小
printf("%d\n",sizeof(a[3]));         16 -- 如果数组存在第四行,a[3]就是第四行的数组名,数组名单独放在sizeof内部,计算的是第四行的大小

 

2.总结

数组名的意义:
• sizeof( 数组名 ) ,这里的数组名表示整个数组,计算的是整个数组的大小;
• &数组名,这里的数组名表示整个数组,取出的是整个数组的地址;
• 除此之外所有的数组名都表示首元素的地址。


总结: 

这篇博客带大家做了些关于数组和指针的笔试题,基本上汇总了全部类型,其实到这里还没完,那么下篇再带大家继续指针的练习。

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MYSQL 之 Redis配置与优化

(一)关系数据库和非关系数据库 关系库数据库Oracle ,mysql ,sql,server,microsoft Access ,postgresql 以上数据库必须先建表在设计表的结构,然后存储的时侯按表的结构去存&#x…

微信小程序入门01-工具的下载安装及模板的安装

小程序开发现在已经有多种模式了,有使用uniapp开发的,使用微信开发者工具开发的,还有低代码工具也支持开发小程序的。 在众多开发模式中,使用官方开发者工具开发也是一种形式。本篇我们就介绍一下如何用微信开发者工具搭建小程序…

【MATLAB第32期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理分类问题MATLAB代码实现(持续更新)

【MATLAB第32期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理分类问题MATLAB代码实现(持续更新) 本文敏感性分析主要分析分类问题(fisher、rf、arf、nca等)。 一、降维方法(分类) 常见的降维方法: 常见的敏…

2023,8种必备Selenium编写自动化用例的技巧(建议收藏)

在开始自动化时,您可能会遇到各种可能包含在自动化代码中的方法,技术,框架和工具。有时,与提供更好的灵活性或解决问题的更好方法相比,这种多功能性导致代码更加复杂。在编写自动化代码时,重要的是我们能够…

Jangow

Jangow 1.环境准备 靶场地址:https://www.vulnhub.com/entry/jangow-101,754/下载好靶机之后直接使用VMware Workstation Pro虚拟机导入环境,启动即可,将网段设置为NAT模式攻击机:kali(192.168.80.180)靶…

【电厂用 多功能数码显示 HJY-F931B/D交流三相电压继电器JOSEF约瑟】

用途 HJY系列数字式交流电压继电器为瞬时动作特性,用于发电机,变压器,输电线路的继电保护装 置中作为过压或欠压的闭锁启动元件。 安装结构 导轨安装9,导轨安装E两种结构方式,具体尺寸请参考外型尺寸图。特点 (1). 采…

局域网内使用的多人协同编辑文档的软件哪个好?对比5款主流平台

支持局域网内多人协同编辑文档的软件或平台哪个好?PingCode 、Confluence 等知识库工具和腾讯文档、飞书文档等都支持多人协作编辑,怎么选?这是企业团队在找文档管理工具最常见的问题。 支持局域网内协同编辑的软件可以分为两个大类&#xf…

azkaban介绍

目录 为什么需要工作流调度系统 什么是azkaban azkaban适用场景 azkaban特点 常见的工作流调度系统 azkaban和Ooize特性对比 azkaban的架构 azkaban调度的任务有可能有那些类型 总结 为什么需要工作流调度系统 一个完整的大数据分析系统,必然由很多任务单…

基于显扬科技3D视觉相机的医疗试管分拣系统

行业现状: 医疗试管分拣是医疗行业中的一个重要环节,指将医疗实验室或生物技术研究中的试管按照一定的规则进行分拣,并对试管的类型、位置、数量等信息进行识别和管理。 随着医疗技术的不断发展和诊断治疗的精细化,医疗试管分拣…

Python之selenium关于Chrome驱动位置和闪退的问题

目录 一、Chromedriver放置的位置二、浏览器闪退 一、Chromedriver放置的位置 背景:之前由于Chrome浏览器自动升级后,导致驱动与浏览器不匹配,自己也不知道问题出在哪儿,花费了我大量时间去排查,所以接下来记录一些。…

Linux ps -A 和 ps -ef

Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器 ps -A | grep xx 显示xx所有的进程 ps -ef | grep xx 显示xx在一个终端的所有进程 注意这里ef 其实可以拆开理解 e 是显示所有进…

oracle报错ORA-12514

问题:oracle使用服务名orcl登录不成功,并且报错 ORA-12514, TNS:listener does not currently know of service requested in conn原因分析: ORA-12514 错误通常表示 Oracle 数据库监听器无法识别客户端请求的服务名称。这可能是由于以下原因…

什么是ERP、APS和MES

01 先来说说ERP与MES的区别 ERP:企业资源计划 一天中午,丈夫在外给家里打电话:“亲爱的老婆,晚上想带几个同事回家吃饭可以吗?”(订货意向) 丈夫:“6个人,我们7点左右回…

【计算机视觉】如何利用 CLIP 做简单的人脸任务?(含源代码)

文章目录 一、数据集介绍二、源代码 结果三、代码逐行解读 一、数据集介绍 CELEBA 数据集(CelebFaces Attributes Dataset)是一个大规模的人脸图像数据集,旨在用于训练和评估人脸相关的计算机视觉模型。该数据集由众多名人的脸部图像组成&a…

【MySQL】MySQL索引--聚簇索引和非聚簇索引的区别

文章目录 前言1.聚簇索引和非聚簇索引的概念2.两者详细介绍2.1 聚簇索引2.2 非聚簇索引 3. 两者的区别3.1 数据存储方式3.2 二级索引查询 前言 1.聚簇索引和非聚簇索引的概念 数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引两种。“聚簇”的意思是数据行被按照…

【Java|golang】1072. 按列翻转得到最大值等行数

给定 m x n 矩阵 matrix 。 你可以从中选出任意数量的列并翻转其上的 每个 单元格。(即翻转后,单元格的值从 0 变成 1,或者从 1 变为 0 。) 返回 经过一些翻转后,行与行之间所有值都相等的最大行数 。 示例 1&#…

使用TensorFlow构建,绘制和解释人工神经网络

使用 Python 进行深度学习:神经网络(完整教程) 使用TensorFlow构建,绘制和解释人工神经网络 总结 在本文中,我将展示如何使用Python构建神经网络,以及如何使用可视化和创建模型预测解释器向业务解释深度学习…

【PCIE】pcie设备协议分析和crash后定位

分析RP Headerlog在协议中位置 能力集寄存器协议字段 HeaderLog字段偏移以及各字段含义 headerLog和协议的对应入截图中内容 completer id就是完成的ID,对应的BDF ,如下图 b5:00.0 AECap寄存器 其中 first error pointer 含义: 这里有专…

对于 Git 每一次提交的时间信息,什么是作者日期和提交者日期

文章目录 什么是作者日期和提交者日期如何查看作者日期和提交者日期方法 1方法 2方法 3 修改最近一次提交的时间 什么是作者日期和提交者日期 对于 Git 的每一次提交,在 TortoiseGit 和 IntelliJ IDEA 都可以看到这次提交的时间。但很多人不知道的是,Gi…

人脸识别2:Python实现人脸识别Face Recognition(含源码)

人脸识别2:Python实现人脸识别Face Recognition(含源码) 目录 人脸识别2:Python实现人脸识别Face Recognition(含源码) 1. 前言 2. 项目安装 3. 人脸识别系统 (1)人脸检测和关键点检测 (2)人脸校准 …