c语言指针经典笔试题

news2024/11/24 16:20:58

 指针的笔试题目

//深度讨论数组名
int main1()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));  //sizeof内部出现数组名代表是整个数组的大小 //16
	printf("%d\n", sizeof(a + 0));  //首元素地址+0还是首元素地址 4/8
	printf("%d\n", sizeof(*a));  //首元素地址进行解引用相当于a[0]是4个字节
	//*a中的a是数组首元素的地址,* a就是对首元素的地址解引用,找到的就是首元素
	//首元素的大小就是4个字节
	printf("%d\n", sizeof(a + 1));  //首元素地址+1 相当于a[1]的地址 是地址就是4/8
	printf("%d\n", sizeof(a[1]));  //第二个元素大小//4
	printf("%d\n", sizeof(&a));   //取地址数组名,取的是整个数组的地址,是地址就是4/8 
	printf("%d\n", sizeof(*&a));
	//&a----->的类型是int(*)[4] &a拿的是数组名的地址,数组指针解引用拿到了这个数组是
//是数组的大小就是16
	printf("%d\n", sizeof(&a + 1));
	//取数组名+1相当于跳了一个数组的大小,是地址就是4/8
	printf("%d\n", sizeof(&a[0]));
	//取第1个元素的地址 是地址就是4/8
	printf("%d\n", sizeof(&a[0] + 1));	       //取第2个元素的地址 是地址就是4/8
	return 0;
}


int main2()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//sizeof内部出现数组名代表是整个数组的大小 //6
	printf("%d\n", sizeof(arr + 0));//首元素'a'的地址---4/8
	printf("%d\n", sizeof(*arr)); //'a'的大小/1
	printf("%d\n", sizeof(arr[1]));//'a'的大小/1
	printf("%d\n", sizeof(&arr));//取出整个数组的地址是地址就是4/8
	printf("%d\n", sizeof(&arr + 1));//跳过一个数组的地址,是地址就是4/8
	printf("%d\n", sizeof(&arr[0] + 1));//'b'的地址是地址就是4/8
	return 0;

}
#include <string.h>
int main3()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));//随机值 因为不知道编译器在哪里放\0
	printf("%d\n", strlen(arr + 0)); //随机值
	printf("%d\n", strlen(*arr));//相当于strlen('a')strlen(地址)//err 是一个野指针
	printf("%d\n", strlen(arr[1]));//野指针
	printf("%d\n", strlen(&arr));//取数组的地址,数组的地址也是从‘a'的地址开始的   随机值
	printf("%d\n", strlen(&arr + 1));//取数组名+1跳过了一个数组的地址,   随机值-6
	printf("%d\n", strlen(&arr[0] + 1));  // 首元素的地址+1相当于  是字符b的地址开始  随机值-1

    return 0;
}

int main4()
{
	
	char arr[] = "abcdef";//[a b c d e f\0]
	printf("%d\n", sizeof(arr)); //计算的是整个数组的大小,7
	printf("%d\n", sizeof(arr + 0));//首元素地址 相当于是‘a'的地址 是地址就是4/8
	printf("%d\n", sizeof(*arr));//’a'元素的大小  1
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//取数组的地址 也是从‘a'的地址开始的 也是 4/8
	printf("%d\n", sizeof(&arr + 1));//跳了一个数组的地址是地址就是  4/8
	printf("%d\n", sizeof(&arr[0] + 1)); //相当于是’b'的地址  4/8
	return 0;
}
//strlen是求字符串长度的,关注的是字符串中的\0,计算的是\0之前出现的字符的个数
//	//strlen是库函数,只针对字符串
//	//sizeof只关注占用内存空间的大小,不在乎内存中放的是什么
//	//sizeof是操作符
int main5()
{
	char arr[] = "abcdef";//[a b c d e f\0]
	printf("%d\n", strlen(arr));//6
	printf("%d\n", strlen(arr + 0));//6
	//printf("%d\n", strlen(*arr));//err
	//printf("%d\n", strlen(arr[1]));//err
	printf("%d\n", strlen(&arr));//‘a’字符的地址开始  6
	printf("%d\n", strlen(&arr + 1)); //跳过了\0 从\0后面开始  随机值
	printf("%d\n", strlen(&arr[0] + 1));  //从'b'字符开始走  5
	
	return 0;
}
int main()
{
	char* p = "abcdef";//[a b c d e f\0]
	printf("%d\n", sizeof(p));//p指向的是字符a的地址  4/8
	printf("%d\n", sizeof(p + 1)); //指向的是字符b的地址 4/8
	//printf("%d\n", sizeof(*p));  //err
	//printf("%d\n", sizeof(p[0])); //err
	printf("%d\n", sizeof(&p));//取出的是一级指针的地址  4/8
	printf("%d\n", sizeof(&p + 1)); //4/8
	printf("%d\n", sizeof(&p[0] + 1)); //4/8

	printf("%d\n", strlen(p)); //p指向的是a的地址  6
	printf("%d\n", strlen(p + 1)); //p指向的是b的地址 5
	//printf("%d\n", strlen(*p)); //P找到了a的这个字符 err
	///printf("%d\n", strlen(p[0])); //err
	printf("%d\n", strlen(&p)); //取出的是一级指针的地址 随机
	printf("%d\n", strlen(&p + 1));//随机
	printf("%d\n", strlen(&p[0] + 1));//5  //P+1  p指向的是b的地址 
	
	return 0;
}

2a6da45685024ceba483a6941e67b500.png

为什么strlen(&P)是随机值是因为指向p的那块空间上的地址存储方式不确定,有可能是大端存储,也可能是小段存储

2c1f4eef565b44e9b2afb66b40d5ac9d.png

int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48
	printf("%d\n", sizeof(a[0][0]));//4
	printf("%d\n", sizeof(a[0]));a[0]是第一行这个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组
	//sizeof(a[0])计算的就是第一行的大小 也就是第一行的数组名  16
	printf("%d\n", sizeof(a[0] + 1)); //没有单独放在sizeof内部,表示的是首元素地址 
	//也就是第一行这个一维数组的第一个元素的地址--a[0][0]的地址 然后+1 就是第一行第二个元素的地址  4/8
	printf("%d\n", sizeof(*(a[0] + 1)));  //第一行第二个元素的地址进行解引用 也就是arr[0][1]元素的大小  --4
	printf("%d\n", sizeof(a + 1));//  第一行的地址+1 相当于跳到了第二行的地址 是地址就是4/8
	printf("%d\n", sizeof(*(a + 1)));  //第二行的地址解引用 ---就相当于是第二行的数组名  16
	printf("%d\n", sizeof(&a[0] + 1));// 对第一行的数组名取地址 相当于是第一行的地址,第一行的地址+1相当于是第二行的地址	4/8
	printf("%d\n", sizeof(*(&a[0] + 1)));  //第二行的地址解引用相当于拿到了第二行的数组名 16
	printf("%d\n", sizeof(*a)); //第一行地址解引用 拿到了第一行的数组名 16
	printf("%d\n", sizeof(a[3]));//第三行的数组名  虽然越界了 但是不影响计算它内部的大小  16

	return 0;
}

1.题目1

890cbd3642604ef4add471ab86f89e52.png

7a151008d1594f9bbb63db023e37a881.png

取数组的地址说明这个指针是的类型是int(*)[5]的,说明这个指针是数组指针,指针指向这个数组,数组有5个元素,每个元素的类型是int类型

题目的指针是int*类型,说明我们要强制类型转换成int*类型的

2.题目2cb01e0fd326b47148880ebc2fae25355.png

这里的p是一个结构体指针

1.结构体指针+1相当于跳过的是一个结构体的大小 已经知道一个结构体的大小是20个字节就相当于跳了20个字节。0x100000+20----ox1000014

2.把p强制类型转换成无符号长整形,,已经知道1,048,576是p转换成无符号长整形的数据,它+1= 048,577

3.把p转换成无符号整形指针类型  +1就相当于跳过一个无符号整形 相当于+4 = 1,048,576+4

3.题目3

cdb17571d080450bb267fa2694fdfbea.png

ca604de2b62442a7be44a7a4e933590e.png

取数组的地址说明这个指针是的类型是int(*)[4]的,说明这个指针ptr1是数组指针,指针指向这个数组,数组有4个元素,每个元素的类型是int类型

题目的指针是int*类型,说明我们要强制类型转换成int*类型的

ptr1[-1]是指向的是04 00 00 这块区域的 同理也是00是高地址的 04是低地址的拿出来的时候就是低地址在后面  00 00 00 04  以16进制打印的时候前面的0全部删除掉 就是4了6643a617efc041d09a28d3da67a47389.png

ptr2: 首先这个a是数组名,数组名是首元素地址,首元素地址+1是跳过一个整形也就是4个字节,题目强制类型转换成了int类型说明现在的a不是地址了是一个整数,它+1就说明加了一个整数

1f7418f06fc44e22bb86467dbff49fa0.png

503bbf4c734248098dfb3519be101ec2.png

比如1的16进制是 00 00 00 01

在内存是小端存储模式,01是低地址处,----01 00 00 00

a+1强制类型转换成int*类型的指针,所以ptr2就指向了 00 00 00 02这块起始地址。因为 00 00 00 02在内存中是以小端模式存储,拿出来的时候就是02 00 00 00 以16进制打印的时候就是200 00 00

9a23030372ac468a9f9ff0520d565a1b.png 因为·02是高位的地址就应该放在低地址处

4.题目4

b702977c8535441fb412cc001a00144a.png

b40199ea037e4463aa6d80e0f224c818.png

首先这个二维数组的元素是以逗号表达式的形式展开,你要明确这个数组里的元素是{1,3,5,0,0,0}p指向了第一行的数组名,此时的数组名表示的一行的地址,数组名没有放在sizeof内部,也没有取地址,说明数组名表示首元素地址  也就是a[0][0]的地址然后解引用就是1了

5.题目5

b492434a36954de4b9c7e6264734d17f.png

d6c28228bf15467c9389365bb50e2bf4.png

这里的a作为数组名,它是第一行的地址,它的类型是int(*)[5] ,因为二维数组的数组名代表的是第一行的地址,也就是第一行数组名的地址  一维数组名的地址就需要用一维数组的指针来接受。

这里的p是一个数组指针,它指向的是一个数组,这个数组有4个元素,每个元素的类型是int类型

这里把二维数组的数组名赋给数组指针    类型存在差异,但不影响,只不过是报警告

再来看看   p是一个数组指针 它+1跳过一个数组的大小,这个数组有4个元素,每个元素的类型是int类型,相当于跳了4个整形的大小,p[4][2]可以看成 *( *(p+4)+2)

*(p+4)这个相当于p跳了4个整形的大小 再图可以看出 它跳到了a[3][1]的 地址,然后解引用找到了arr[3]的数组名,就可以访问相当于arr[3][1]~ arr[3][4]这块区域的元素的地址,然后+2跳过二个整形长度指向了arr[3][3]这块地址然后解引用找到了arr[3][3] 这个元素 

我们是把p[4][2]看成arr[3][3]  ,指针-指针的绝对值是元素之间的个数,他们相差了4个 又因为地址再内存中是从低到高存放的,所以结果是-4

打印地址是打印它在内存中的地址,所以这里不考虑大小端字节序,也不考虑原码补码反码,

 b5479e31a1884970a613d25db800e46c.png

再x86的环境下就是FF  FF FC 记住打印内存是打印反码的形式打印内存

6.题目6

9d4cd629a2964a28b016963a17875eb3.png

44db0f5a4ea4431fb01ff8124a1fd45a.png

7.题目7

6ba3870e47684f4aaee03c5564af11ec.png

3a2907939874406285bf32d711d18111.png

pa是指向的是a的起始地址

pa++跳到了第二行,对pa解引用找到了a的地址相当于指向了a的地址

56b40f83eeac464f9bae7f5885599165.png

pa指向了a,a是一个指针数组pa指向的对象是一个char*类型的,第二*说明pa是一个指针

pa++=pa+1  自然是跳过一个char*类型  也就是4个字节。

int*p 是一个指针,它指向的对象是int类型,所以+跳过了4个字节。

9ecc4ba01a964dd283eae59c6732bc5e.png

8.题目8

23e5c247349d4f1d965dde986dfed11f.png

3a298622125a4276a5144d1f3ec49896.png

7208ae86ba4b4620920724230840e7e5.png

11

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

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

相关文章

苹果手机618多次降价:京东618iPhone 15 Pro Max降价超2300元 销量重回销量榜第一

一年一度的618大促快接近尾声&#xff0c;在大促期间&#xff0c;iPhone 15多次降价后重回销量榜第一名。 买手机这个一定要领&#xff0c;你懂的&#xff01; &#xff08;20号结束 &#xff09; 淘宝APP搜&#xff1a;领到就赚3300 京东APP搜&#xff1a;好运红包588 如下…

leaflet室内地图\平面图点线面绘制

需求&#xff1a; 用户自定义上传一张平面图&#xff0c;然后可以在平面图内标点、绘制面、并且能够弹出相对应点、面的信息&#xff0c;信息可编辑&#xff0c;类似下图&#xff1a; 相关实现技术&#xff1a;leaflet 中文网&#xff1a;Leaflet - 一个交互式地图 JavaScript…

友思特应用 | 模型链接一应俱全:IC多类别视觉检测一站式解决方案

导读 高精度IC制造工艺需要对产品进行全方位检测以保证工艺质量过关。友思特 Neuro-T 通过调用平台的流程图功能&#xff0c;搭建多类深度学习模型&#xff0c;形成了一站式的视觉检测解决方案。本文将为您详述方案搭建过程与实际应用效果。 在当今集成电路&#xff08;IC&…

润滑不良:滚珠花键磨损的隐形杀手!

滚珠花键作为一种精密机械传动元件&#xff0c;被广泛应用于各种机器和设备中&#xff0c;起着传递动力和运动的重要作用。滚珠花键经过长时间的运行&#xff0c;难免会多少些磨损&#xff0c;严重的话还会导致设备不能正常运转。那么&#xff0c;如何保证它的正常运行呢&#…

frp安装与配置

个人从网上杂乱的信息中学习、试错&#xff0c;记录自己成功配置的方法&#xff0c;避免遗忘 一、frp的下载 因目前无法下载&#xff0c;仅保留下载方法&#xff0c;版本号根据实际修改&#xff0c;目前使用0.54版&#xff0c;不同系统下载不同文件。 wget https://github.c…

[渗透测试学习] BoardLight-HackTheBox

BoardLight-HackTheBox 信息搜集 nmap扫描一下 nmap -sV -v 10.10.11.11扫描结果如下 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.41 ((Ubuntu))80端口有h…

分享一个自己写的PC版的Ai指令保存工具

今天给大家分享下我用非常古老的VB写的一个小工具。纯粹是每次电脑使用指令太麻烦了&#xff0c;所以写了一个小工具。这个工具支持5条指令&#xff0c;作为一般的应该够用了。使用场景&#xff1a;比如你要经常使用指令&#xff0c;但是觉得复制指令麻烦&#xff0c;那么你可以…

Qt | 简单的使用 QStyle 类(风格也称为样式)

01、前言 者在 pro 文件中已添加了正确的 QT+=widgets 语句 02、基础样式 1、QStyle 类继承自 QObject,该类是一个抽像类。 2、QStyle 类描述了 GUI 的界面外观,Qt 的内置部件使用该类执行几乎所有的绘制,以确保 使这些部件看起来与本地部件完全相同。 3、Qt 内置了一系…

水利部:关于推进水利工程建设数字孪生的指导意见

从《关于大力推进智慧水利建设的指导意见》到《十四五智慧水利建设规划》&#xff0c;自2022年以来&#xff0c;水利部先后出台一系列文件部署“数字孪生水利”政策框架。2024年4月1日&#xff0c;水利部再次颁发《关于推进水利工程建设数字孪生的指导意见》&#xff0c;强调&a…

自注意力与卷积高效融合!多SOTA、兼顾低成本与高性能

在自注意力机制中&#xff0c;模型计算输入序列中不同位置的相关性得分&#xff0c;以生成连接权重&#xff0c;从而关注序列中的重要部分。而卷积通过滑动窗口的方式&#xff0c;在输入上应用相同权重矩阵来提取局部特征。 如果将以上两者结合&#xff0c;就可以同时利用自注…

[C#]winform基于opencvsharp实现黑白图像上色

【算法简介】 技术有时会提高艺术&#xff0c;但有时也会破坏艺术。着色黑白电影是一个可以追溯到1902年的古老想法。几十年来&#xff0c;许多电影创作者反对将黑白电影着色的想法&#xff0c;并将其视为对艺术的破坏。但今天它被接受为艺术形式的增强。该技术本身已经从艰苦…

PO、VO、BO、DAO、DTO、POJO

PO、VO、BO、DAO、DTO关系图 DAO&#xff08;Data Access Object&#xff09;数据访问对象&#xff0c;数据访问&#xff1a;顾名思义就是与数据库打交道&#xff0c;它封装了与底层数据源&#xff08;如数据库&#xff09;的交互逻辑。为业务逻辑层&#xff08;Service&#…

绿色免费离线版JS加密混淆工具 - 支持全景VR加密, 小程序js加密, H5网站加密

自从我们推出在线版的免费JS加密混淆工具以来&#xff0c;受到了广大用户的热烈欢迎。特别是全景开发人员&#xff0c;他们使用该工具加密VR插件的JS代码, 添加域名锁等&#xff0c;都非常有效地保护了插件的代码资源。 最近&#xff0c;我们收到了许多用户的反馈&#xff0c;…

【数据库编程-SQLite3(四)】基本常用操作

学习分享 1、sql数据类型1.1、约束 2、数据定义语言DDL(Data Definition Language)2.1、创建表2.2、修改表2.3、删除表 3、 数据操纵语言DML(Data Manipulation Language)3.1、INSERT语句3.2、DELETE语句3.3、UPDATE语句3.4、SELECT语句 4、高级查询4.1、SQL通配符4.2、模糊查询…

JAVA的优势是什么?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; java编程语言自1995年问世…

基于 Vitis HLS 的单个乘法 DSP 映射研究

文章目录 1 自媒体账号2 引言3 整数乘法4 定点乘法5 浮点乘法6 总结 1 自媒体账号 目前运营的自媒体账号如下&#xff1a; 哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.com 如果觉得有所收获的话&#xff0c;可以点击我的主页 -> 充电 -> 自定义充电 支持一下&#…

人工智能在癌症新辅助治疗领域的研究|顶刊速递·24-06-18

小罗碎碎念 本期推文主题——人工智能在肿瘤新辅助治疗领域中的研究进展。 这一期推文谋划已久&#xff0c;最早可以追溯到五一假期。五一的时候&#xff0c;我第一站去的就是北大。当时和北医的一个师兄&#xff08;博士&#xff09;聊天&#xff0c;主要聊的就是新辅助治疗AI…

摄像头图像矫正的表格生成方法

1.设置单元格高宽 点击表格左上角 的 小三角 列宽: HOME -> Rows and Columns -> Column Width 5 CM 行高: HOME -> Rows and Columns -> Row Height 5 CM 2.设置 条件格式 HOME -> Conditional Formatting-> Manager Rules 点击 左上方 New Rule…

老杨说运维 | 如何结合现状进行运维路径建设(文末附演讲视频)

青城山脚下的滔滔江水奔涌而过&#xff0c;承载着擎创一往无前的势头&#xff0c;共同去向未来。2024年6月&#xff0c;双态IT成都用户大会擎创科技“数智化可观测赋能双态运维”专场迎来了完满的收尾。 本期回顾来自擎创科技CTO葛晓波的现场演讲&#xff1a;数智化转型的核心目…

PCI-E 5.0固态硬盘温度价格「双降」,速度近15GB/s

都 2024 年了&#xff0c;相信各位同学对固态硬盘都不陌生了吧。 随着技术的不断更新迭代&#xff0c;固态硬盘接口速率如今最高已经来到了 PCI-e 5.0 了。 其实这不算什么新技术了&#xff0c;早在2023年5月美光就上市了全球首款 PCI-e 5.0 固态硬盘&#xff0c; 英睿达 T700…