【C语言】指针和数组笔试题解析(1)

news2025/1/11 21:50:34

指针是C语言的灵魂,他的玩法多种多样,这篇文章带来指针的笔试题详解,可以帮助我们更好的理解与巩固指针的知识

目录

  • 预备知识:
  • 题目:
    • 一维数组:
    • 二维数组:

题目比较多,但切记戒骄戒躁,保持空杯心态,相信看完一定会有提升
开始之前要先来一点预备知识:

预备知识:

数组名:

数组名大部分情况下是首元素地址,但有两种情况例外
1.当sizeof(数组名),此时数组名代表整个数组,求出的是整个数组的大小,单位是字节。
2.当&数组名,此时数组名代表整个数组,取出的是整个数组的地址,虽然与首元素地址相同,但含义不一样。

sizeof:

sizeof是一个操作符,可以求变量(类型)所占空间的大小。

strlen:

strlen是一个为库函数,可以获取字符串\0之前的长度

一一一一一一一一一分割线一一一一一一一一一一

题目:

分为两部分,第一部分时一维数组,第二部分是二维数组,逐步攀升难度

假设都在32位机器下进行

一维数组:

第一组:

//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//1
printf("%d\n",sizeof(a+0));//2
printf("%d\n",sizeof(*a));//3
printf("%d\n",sizeof(a+1));//4
printf("%d\n",sizeof(a[1]));//5
printf("%d\n",sizeof(&a));//6
printf("%d\n",sizeof(*&a));//7
printf("%d\n",sizeof(&a+1));//8
printf("%d\n",sizeof(&a[0]));//9
printf("%d\n",sizeof(&a[0]+1));//10

答案:

1.16
a代表整个数组,每个数组元素是int类型,一共4个元素,故为16字节大小
2.4
a为首元素地址,当地址进行±运算时,与指针类型有关,a的类型为int*,所以+0时,地址会向前跳过0个整形,仍旧是首元素地址
3.4
a为首元素地址,当解引用时,得到的是arr[0],也就是第一个整形元素,大小为4
4.4
a为首元素地址,当地址进行±运算时,与指针类型有关,a的类型为int*,所以+1时,地址会向前跳过1个整形,而数组是连续存放的,故地址会指向第二个数组元素。
5.4
a[1]是一个整形,为数组第二个整形元素,大小是4字节
6.4
&数组名代表的是取出整个元素的地址,但不管是什么地址,在32位下地址都是4个字节大小
7.16

此题有两种解法:
1.*与&结合会相互抵消,数组名在sizeof中就是求出整个数组的大小
2.&数组名取出的是整个数组的地址,当地址进行解引用时,与指针类型有关,解引用一个数组指针类型的内容,就会访问一个大小为此数组的内容,即4个整形变量的数组,大小为16字节

8.4
a代表整个数组,当地址进行±运算时,与指针类型有关,而此数组指针的类型是 int(*)[4], 数组指针+1会跳过一个数组,也就是跳过4个整形的数组,而运算后的结果仍旧是地址,故答案为4
9.4
&a[0]代表的是第一个元素的地址,地址大小为4字节
10.4
&a[0]代表的是第一个元素的地址,当地址进行±运算时,与指针类型有关,整形指针+1会跳过一个整形,即&a[0]+1指向数组第二个元素,为第二个元素的地址,大小为4个字节

一一一一一一一一一分割线一一一一一一一一一一
第二组:

//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//1
printf("%d\n", sizeof(arr+0));//2
printf("%d\n", sizeof(*arr));//3
printf("%d\n", sizeof(arr[1]));//4
printf("%d\n", sizeof(&arr));//5
printf("%d\n", sizeof(&arr+1));//6
printf("%d\n", sizeof(&arr[0]+1));//7

答案:
1.6
arr在sizeof中为整个数组,求出的是整个数组的大小,单位是字节,结果为6字节
2.4
arr此时为首元素地址,类型为char*,字符指针+0会跳过0个字符大小,此时仍指向首元素地址,地址大小为4字节
3.1
arr此时为首元素地址,类型为char*,解引用arr会访问一个char大小的内容,为数组第一个元素,大小为1字节
4.1
arr[1]代表数组第二个元素,类型为char,大小为1字节
5.4
arr代表整个数组,取出的是整个数组的地址,地址的大小为4字节
6.4
arr代表整个数组,取出的是整个数组的地址,当地址进行±运算时,与指针类型有关,数组指针的类型为 char (*)[6] ,数组指针+1会跳过一个数组,在这就是跳过6个字符,运算后的结果依然是地址,大小为4
7.4
&arr[0]代表第一个元素的地址,当地址进行±运算时,与指针类型有关,字符指针+1会跳过一个字符,&arr[0]+1代表第二个元素地址,大小为4字节
一一一一一一一一一分割线一一一一一一一一一一
第三组:

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));//1
printf("%d\n", strlen(arr+0));//2
printf("%d\n", strlen(*arr));//3
printf("%d\n", strlen(arr[1]));//4
printf("%d\n", strlen(&arr));///5
printf("%d\n", strlen(&arr+1));//6
printf("%d\n", strlen(&arr[0]+1));//7

答案:
1.随机值
arr为首元素地址,但arr数组中没有’\0’,故结果为随机值
2.随机值
arr为首元素地址,当地址进行±运算时,与指针类型有关,字符指针+0会向前跳过0个字符,地址不变,而arr数组中没有’\0’,故结果为随机值
3.err
arr为首元素地址,*arr为第一个元素’a’,传入strlen中会把a的ASCII码值当做地址,而此地址为野指针,会报错。
4.err
arr[1]为数组第二个元素’b’,传入strlen中会把b的ASCII码值当做地址,而此地址为野指针,会报错。
5.随机值
arr为整个数组地址,首先要知道strlen的参数为在这里插入图片描述
传入strlen后数组指针会被强转为char *类型,而他们两的值是一样的,故结果为随机值
6.随机值
arr为整个数组地址,当地址进行±运算时,与指针类型有关,数组指针+1会向前跳过一个数组,故此时地址为跳过一个数组的地址,由于不清楚什么时候遇到’\0’,故为随机值
7.随机值
&arr[0]为首元素地址,当地址进行±运算时,与指针类型有关,字符指针+1会向前跳过一个字符,故此时地址为跳过一个字符的地址,由于不清楚什么时候遇到’\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));

答案:
1.7
arr代表整个数组,在sizeof中会求出整个数组的大小,为7字节,因为写成字符串形式自带’\0’
2.4
arr为首元素地址,当地址进行±运算时,与指针类型有关,字符指针+1会向前跳过1个字符,故此时地址为跳过一个字符的地址,则结果为4
3.1
arr为首元素地址,类型为char* ,解引用时会访问一个字节,为’a’,字符a的大小为1的字节
4.1
arr[1]为数组中第二个元素的地址,为char类型,大小为1字节
5.4
arr为整个数组地址,&arr为整个元素的地址,是地址就是4个字节
6.4
arr为整个数组地址,&arr为整个元素的地址,类型为char(*)[7],数组指针+1会跳过1个数组,&arr+1为跳过一个数组后的地址,是地址大小就是4字节
7.4
&arr[0]为首元素地址,当地址进行±运算时,与指针类型有关,字符指针+1会向前跳过1个字符,故此时地址为跳过一个字符的地址,则结果为4
一一一一一一一一一分割线一一一一一一一一一一
第五组:

char arr[] = "abcdef";
printf("%d\n", strlen(arr));//1
printf("%d\n", strlen(arr+0));//2
printf("%d\n", strlen(*arr));//3
printf("%d\n", strlen(arr[1]));//4
printf("%d\n", strlen(&arr));//5
printf("%d\n", strlen(&arr+1));//6
printf("%d\n", strlen(&arr[0]+1));//7

答案:
1.6
arr为首元素地址,因为字符串自带\0,故传入首元素地址后会得到\0之前的字符串个数,也就是6
2.6
arr为首元素地址,当地址进行±运算时,与指针类型有关,字符指针+0会向前跳过0个字节,故传入首元素地址后会得到\0之前的字符串个数,也就是6
3.err
arr为首元素地址,解引用后得到字符a,会将字符a的ASCII码值当做地址传入strlen,由于此地址为野指针,故会error
4.err
arr[1]为字符b,会将字符b的ASCII码值当做地址传入strlen,由于此地址为野指针,故会error
5.6
arr为整个数组地址,&arr为整个元素的地址,传入strlen后数组指针会被强转为char *类型,而他们两的值是一样的,故结果为6

6.随机值
arr为整个数组地址,&arr为整个元素的地址,类型为char(*)[7],数组指针+1会跳过1个数组,&arr+1为跳过一个数组后的地址,传入strlen后数组指针会被强转为字符指针类型
7.5
arr[0]为数组首元素,&arr[0]为首元素地址,当地址进行±运算时,与指针类型有关,字符指针+1会向前跳过1个字符,故得到的结果为5
一一一一一一一一一分割线一一一一一一一一一一
第六组:

char *p = "abcdef";
printf("%d\n", sizeof(p));//1
printf("%d\n", sizeof(p+1));//2
printf("%d\n", sizeof(*p));//3
printf("%d\n", sizeof(p[0]));//4
printf("%d\n", sizeof(&p));//5
printf("%d\n", sizeof(&p+1));//6
printf("%d\n", sizeof(&p[0]+1));//7

答案:
1.4
p为字符指针,是指针大小就为4字节
2.4
p+1指向数组第二个元素,但仍旧是地址,是地址就是4字节
3.1
p为字符首元素地址,解引用得到首元素,类型是char,故大小为1字节
4.1
p[0]可以写成*(p+0),也就是数组第一个元素,类型是char,大小是1字节
5.4
&p是字符指针的地址,是地址大小就为4字节
6.4
&p是地址的地址,当地址进行±运算时,与指针类型有关,&p的类型为char**,+1会跳过一个char*类型的,但仍旧是地址,为4字节
7.4
&p[0]为首元素地址,类型是字符指针,+1会跳过一个字节,但仍旧是地址,为4字节
一一一一一一一一一分割线一一一一一一一一一一
第七组:

char *p = "abcdef";
printf("%d\n", strlen(p));//1
printf("%d\n", strlen(p+1));//2
printf("%d\n", strlen(*p));//3
printf("%d\n", strlen(p[0]));//4
printf("%d\n", strlen(&p));//5
printf("%d\n", strlen(&p+1));//6
printf("%d\n", strlen(&p[0]+1));//7

答案:
1.6
p为字符串的首元素地址,传入strlen中得到6
2.5
p为字符串首元素地址,当地址进行±运算时,与指针类型有关,字符指针会跳过一个字节指向b,将b的地址传入strlen中得到5
3.err
p为字符首元素地址,解引用得到首元素,会将字符a的ASCII码值当做地址传入strlen,由于此地址为野指针,故会error
4.err
p[0]为字符a,会将字符a的ASCII码值当做地址传入strlen,由于此地址为野指针,故会error
5.随机值
&p得到的是字符指针的地址,由于不知道何时出现\0,故为随机值
6.随机值
&p是地址的地址,当地址进行±运算时,与指针类型有关,&p的类型为char**,+1会跳过一个char*类型的,由于不知道何时出现\0,故为随机值
7.5
&p[0]为首元素地址,类型是字符指针,+1会跳过一个字节,故得到5

二维数组:

int a[3][4] = {0};
printf("%d\n",sizeof(a));//1
printf("%d\n",sizeof(a[0][0]));//2
printf("%d\n",sizeof(a[0]));//3
printf("%d\n",sizeof(a[0]+1));///4
printf("%d\n",sizeof(*(a[0]+1)));//5
printf("%d\n",sizeof(a+1));//6
printf("%d\n",sizeof(*(a+1)));//7
printf("%d\n",sizeof(&a[0]+1));//8
printf("%d\n",sizeof(*(&a[0]+1)));//9
printf("%d\n",sizeof(*a));//10
printf("%d\n",sizeof(a[3]));//11

开始之前要明确几个概念:
二维数组是数组的数组
每一行的数组名是a[0],a[1],a[2]
在这里插入图片描述

答案:
1.48
a是二维数组的数组名,在sizeof中表示整个数组,那么得到的结果就是整个数组的大小,为48字节
2.4
a[0][0]为第一个元素,类型是int,故大小为4字节
3.16
a[0]是第一行的数组名,数组名放在sizeof中就代表第一行整个数组,为16字节
4.4
a[0]是第一行数组名,他不在sizeof中,也没有取地址,故为第一行首元素地址,当地址进行±运算时,与指针类型有关,+1后指向第一行第二个元素,但依旧为地址,那就是4字节
5.4
a[0]+1为第一行第二个元素地址,解引用后成为int类型的元素,故为4字节
6.4
a不在sizeof中,也没有取地址,故为首元素地址,二维数组的首元素地址为第一行数组的地址,类型为int(*)[4],+1跳过一个4字节的数组,指向第二行数组,但依旧是地址,故为4字节大小
7.16

此题有两种方法:
1.a+1为第二行数组的地址,解引用后就是整个第二行数组,则sizeof后就是第二行整个数组的大小,为16字节
2.*(a+1)就是a[1],a[1]就是第二行的数组名,放在sizeof中就是求第二行整个数组的大小,为16字节

8.4
&a[0]是第一行数组的地址,+1后就是第二行数组的地址,是地址的话就是4字节
9.16
解引用第二行数组地址找到的就是第二行整个数组,sizeof后就是16字节
10.16
a不在sizeof中,也没有取地址,故为首元素地址,即为第一行数组地址,解引用就是整个第一行数组,大小为16字节
11.16
sizeof是操作符,不会执行,故也不会越界,在编译时就会算出结果

欢迎讨论与纠错,下篇也是笔试题,但是不是关于sizeof与strlen,而是会更灵活的运用

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

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

相关文章

Selenium常用操作之单选复选框、下拉列表、键盘、截屏、断言、(显式隐式)等待

目录 1. 窗口最大化 2.单选框操作 3. 复选框操作 4. 下拉列表 5. selenium 三种等待 6. 键盘操作 7.截屏 8.断言 9. Selenium操作JS弹窗控件 10.鼠标悬停与释放 1. 窗口最大化 driver.maximize_window() 2.单选框操作 driver.find_element_by_xpath("//input[…

Hdoop伪分布式集群搭建

文章目录 Hadoop安装部署前言1.环境2.步骤3.效果图 具体步骤(一)前期准备(1)ping外网(2)配置主机名(3)配置时钟同步(4)关闭防火墙 (二&#xff09…

Linux学习第13天:嵌入式LinuxLED驱动开发:一字一符总见情

在正式写这篇笔记前,有一个事情必须要说一下。昨天更新的基于API函数的字符设备驱动开发按照正常的教程来说应该在本笔记后一天更新才对。但是由于我一时的疏忽,跳过了本笔记。在昨天学习基于API函数的时候造成了一定程度的困扰。今天重翻教程的时候才发…

burp+IE 微信小程序抓包教程

文章目录 一、BURP里新增监听端口二、BURP导出证书三、导入证书四、IE代理设置五、小程序抓包实际测试 一、BURP里新增监听端口 找一个没用的端口,使用以下方式新增 二、BURP导出证书 选择刚才新增的监听端口,点击证书导入导出 将其存出来即可&…

Maven知识点总结

Maven 基础课程第一天 第1章 Maven 介绍 1.1什么是 Maven 1.1.1什么是 Maven Maven 的正确发音是[ˈmevən],而不是“马瘟”以及其他什么瘟。Maven 在美国是一个口语化的词语,代表专家、内行的意思。 一个对Maven 比较正式的定义是这么说的&#xff1…

notepad++ 配置 python 以及Anaconda中的python(已解决)

说明,无论是自己的电脑单独安装的python 还是Anaconda虚拟环境安装的python都是一样的。区别就是 独立安装的python 的exe文件路径添加的环境变量了,不需要制定它的路径直接运行下面的命令就可以,而Anaconda中的python.exe的文件夹并没有在虚…

endnotes插入文献突然变得格式不对,而且也不是按照正常的顺序来插入解决办法

今天插入文献突然变成了endnotes里面的文献序号,而且也不导入了,多了作者和序号信息 解决办法: 更新一下,然后在进行的导入就ok了,能够按照以前的格式插入了,序号也能自动排开,而且也能导入文献…

从CNN(卷积神经网络),又名CAM获取热图

一、说明 卷积神经网络(CNN)令人难以置信。如果你想知道它如何看待世界(图像),有一种方法是可视化它。 这个想法是,我们从最后的密集层中得到权重,然后乘以最终的CNN层。这需要全局平均…

想要精通算法和SQL的成长之路 - 戳气球

想要精通算法和SQL的成长之路 - 戳气球 前言一. 戳气球1.1 记忆化搜索 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 戳气球 原题链接 首先我们看一下题干:对于超出了数组边界的,就当做它是一个数字为1的气球。遇到这种的,我们可以考…

论文解读-DeepEdit:使用纳米孔直接RNA测序对A - to - I RNA编辑事件进行单分子检测和阶段划分

DOI: 10.1186/s13059-023-02921-0 期刊 :Genome Biology 中科院分区:1Q 影像因子:12.3 作者 Longxian Chen; Liang Ou; Xinyun Jing; Yawei Kong; Bingran Xie; et al 出版日期 2023-04-17 网址: https://genome…

Jetpack系列 -- LiveData源码原理解析(解决黏性问题)

一、LiveData是什么? 注意:一般情况下,LiveData要配合ViewModel一起使用的,但是今天是单独使用LiveData,作为学习的话,我们可以只关注LiveData了。 LiveData是一种可观察的数据存储器类。与常规的可观察类…

python-保留小数位数的3种方法

在python实际运用中,需要对小数位数进行截取保留。 以下是,python保留小数点位数的3种方法。 方法一 方法:’%.nf’ % num n代表保留的小数位数,num表示需要截取的目标数 用法如下: old_num 1.23456 new_num %.2f…

[NLP] LLM---<训练中文LLama2(四)方式一>对LLama2进行SFT微调

指令精调 指令精调阶段的任务形式基本与Stanford Alpaca相同。训练方案也采用了LoRA进行高效精调,并进一步增加了可训练参数数量。在prompt设计上,精调以及预测时采用的都是原版Stanford Alpaca不带input的模版。对于包含input字段的数据,采…

竞赛 基于机器学习与大数据的糖尿病预测

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE(递归特征消除法)4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

yolov5在rk3588上加速

不采用fastdeploy等三方框架,使用rknn-lite2或者rknpu在rk3588上加速,测试加速的是rknn自带的yolov5模型。 备注: 1.测试视频:多人,帧:3000,时长:2min,分辨率:1920x1080,fps:25 2…

傅里叶变换应用 (02/2):频域和相位

一、说明 到目前为止,在我们的讨论中,我已经交替使用了“傅里叶变换”和“快速傅里叶变换(FFT)”。在这一点上,值得注意的是区别!FFT 是“离散”傅里叶变换 (DFT) 的有效算法实现。“…

Remix+Cloudflare Pages+D1 快速上手

我们最近听到越来越多的关于Cloudflare的服务。 我对Clouflare D1特别感兴趣,所以我决定研究一下。 与这次我想使用的 Remix 一起,我想介绍 Remix Cloudflare Pages D1 的第一步。 我只是稍微地了解一下,但我所做的在下面的仓库中&#…

【深度学习】 Python 和 NumPy 系列教程(十二):NumPy详解:4、数组广播;5、排序操作

目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象(ndarray) 多维数组的属性 1、创建数组 2、数组操作 3、数组数学 4、数组广播 5、排序操作 1. np.sort() 函数 2. np.argsort() 函数 3. ndarray.sort() 方法 4. 按列或行排序 5. n…

VHDL菜鸟入门到精通之激励文件编写

目录 一、概览 二、激励文件结构 三、样例 3.1 组合逻辑 3.2 时序逻辑 四、常用编写 4.1 时钟信号 4.2 延时 4.3 循环 4.4 进程 一、概览 二、激励文件结构 VHDL激励文件结构和设计文件较为类似,下面以3-8译码器的激励文件对结构进行说明。 激励文件主要…

git clone报错Failed to connect to github.com port 443 after 21055 ms:

git 设置代理端口号 git config --global http.proxy http://127.0.0.1:10085 和 git config --global https.proxy http://127.0.0.1:10085 然后就可以成功git clone hugging face的数据集了 如果是https://huggingface.co/datasets/shibing624/medical/tree/main 那么…