c语言指针经典笔试题

 指针的笔试题目

//深度讨论数组名
int main1()
{int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));  //sizeof内部出现数组名代表是整个数组的大小 //16printf("%d\n", sizeof(a + 0));  //首元素地址+0还是首元素地址 4/8printf("%d\n", sizeof(*a));  //首元素地址进行解引用相当于a[0]是4个字节//*a中的a是数组首元素的地址,* a就是对首元素的地址解引用,找到的就是首元素//首元素的大小就是4个字节printf("%d\n", sizeof(a + 1));  //首元素地址+1 相当于a[1]的地址 是地址就是4/8printf("%d\n", sizeof(a[1]));  //第二个元素大小//4printf("%d\n", sizeof(&a));   //取地址数组名,取的是整个数组的地址,是地址就是4/8 printf("%d\n", sizeof(*&a));//&a----->的类型是int(*)[4] &a拿的是数组名的地址,数组指针解引用拿到了这个数组是
//是数组的大小就是16printf("%d\n", sizeof(&a + 1));//取数组名+1相当于跳了一个数组的大小,是地址就是4/8printf("%d\n", sizeof(&a[0]));//取第1个元素的地址 是地址就是4/8printf("%d\n", sizeof(&a[0] + 1));	       //取第2个元素的地址 是地址就是4/8return 0;
}int main2()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr));//sizeof内部出现数组名代表是整个数组的大小 //6printf("%d\n", sizeof(arr + 0));//首元素'a'的地址---4/8printf("%d\n", sizeof(*arr)); //'a'的大小/1printf("%d\n", sizeof(arr[1]));//'a'的大小/1printf("%d\n", sizeof(&arr));//取出整个数组的地址是地址就是4/8printf("%d\n", sizeof(&arr + 1));//跳过一个数组的地址,是地址就是4/8printf("%d\n", sizeof(&arr[0] + 1));//'b'的地址是地址就是4/8return 0;}
#include <string.h>
int main3()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", strlen(arr));//随机值 因为不知道编译器在哪里放\0printf("%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跳过了一个数组的地址,   随机值-6printf("%d\n", strlen(&arr[0] + 1));  // 首元素的地址+1相当于  是字符b的地址开始  随机值-1return 0;
}int main4()
{char arr[] = "abcdef";//[a b c d e f\0]printf("%d\n", sizeof(arr)); //计算的是整个数组的大小,7printf("%d\n", sizeof(arr + 0));//首元素地址 相当于是‘a'的地址 是地址就是4/8printf("%d\n", sizeof(*arr));//’a'元素的大小  1printf("%d\n", sizeof(arr[1]));//1printf("%d\n", sizeof(&arr));//取数组的地址 也是从‘a'的地址开始的 也是 4/8printf("%d\n", sizeof(&arr + 1));//跳了一个数组的地址是地址就是  4/8printf("%d\n", sizeof(&arr[0] + 1)); //相当于是’b'的地址  4/8return 0;
}
//strlen是求字符串长度的,关注的是字符串中的\0,计算的是\0之前出现的字符的个数
//	//strlen是库函数,只针对字符串
//	//sizeof只关注占用内存空间的大小,不在乎内存中放的是什么
//	//sizeof是操作符
int main5()
{char arr[] = "abcdef";//[a b c d e f\0]printf("%d\n", strlen(arr));//6printf("%d\n", strlen(arr + 0));//6//printf("%d\n", strlen(*arr));//err//printf("%d\n", strlen(arr[1]));//errprintf("%d\n", strlen(&arr));//‘a’字符的地址开始  6printf("%d\n", strlen(&arr + 1)); //跳过了\0 从\0后面开始  随机值printf("%d\n", strlen(&arr[0] + 1));  //从'b'字符开始走  5return 0;
}
int main()
{char* p = "abcdef";//[a b c d e f\0]printf("%d\n", sizeof(p));//p指向的是字符a的地址  4/8printf("%d\n", sizeof(p + 1)); //指向的是字符b的地址 4/8//printf("%d\n", sizeof(*p));  //err//printf("%d\n", sizeof(p[0])); //errprintf("%d\n", sizeof(&p));//取出的是一级指针的地址  4/8printf("%d\n", sizeof(&p + 1)); //4/8printf("%d\n", sizeof(&p[0] + 1)); //4/8printf("%d\n", strlen(p)); //p指向的是a的地址  6printf("%d\n", strlen(p + 1)); //p指向的是b的地址 5//printf("%d\n", strlen(*p)); //P找到了a的这个字符 err///printf("%d\n", strlen(p[0])); //errprintf("%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));//48printf("%d\n", sizeof(a[0][0]));//4printf("%d\n", sizeof(a[0]));a[0]是第一行这个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组//sizeof(a[0])计算的就是第一行的大小 也就是第一行的数组名  16printf("%d\n", sizeof(a[0] + 1)); //没有单独放在sizeof内部,表示的是首元素地址 //也就是第一行这个一维数组的第一个元素的地址--a[0][0]的地址 然后+1 就是第一行第二个元素的地址  4/8printf("%d\n", sizeof(*(a[0] + 1)));  //第一行第二个元素的地址进行解引用 也就是arr[0][1]元素的大小  --4printf("%d\n", sizeof(a + 1));//  第一行的地址+1 相当于跳到了第二行的地址 是地址就是4/8printf("%d\n", sizeof(*(a + 1)));  //第二行的地址解引用 ---就相当于是第二行的数组名  16printf("%d\n", sizeof(&a[0] + 1));// 对第一行的数组名取地址 相当于是第一行的地址,第一行的地址+1相当于是第二行的地址	4/8printf("%d\n", sizeof(*(&a[0] + 1)));  //第二行的地址解引用相当于拿到了第二行的数组名 16printf("%d\n", sizeof(*a)); //第一行地址解引用 拿到了第一行的数组名 16printf("%d\n", sizeof(a[3]));//第三行的数组名  虽然越界了 但是不影响计算它内部的大小  16return 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.mzph.cn/diannao/29815.shtml

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

相关文章

TestProject Python SDK入门

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;-CSDN博客跳槽涨薪的朋友们有福了&#xff0c;今天给大家推荐一个软件测试面试的刷题小程序。​编辑https://…

阻力支撑相对强度(RSRS)选股系列报告之三

https://download.csdn.net/download/SuiZuoZhuLiu/89447699?spm1001.2014.3001.5503https://download.csdn.net/download/SuiZuoZhuLiu/89447699?spm1001.2014.3001.5503

《维汉翻译通》App一款免费的维吾尔语翻译工具,也是新疆人学习中文的利器!维吾尔文OCR识别提取文字神器,功能丰富、界面简洁无广告、操作简单!

免费翻译&#xff0c;无界限沟通 《维汉翻译通》App提供免费的短文本翻译服务&#xff0c;无论是日常对话还是专业术语&#xff0c;都能迅速给出准确的翻译结果。维吾尔语免费翻译工具的加入&#xff0c;更是让这款App成为学习维吾尔语的必备应用。 智能OCR&#xff0c;文字识…

#QT(QCharts绘制曲线)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;绘制曲线图表 3.记录&#xff1a; 4.代码 pro QT core gui #加入以下代码引入charts QT charts greaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses depre…

关于数据库导入导出excel后出现前面的0消失或者有-的变成了日期

1、数据导出0消失 在数据库导出excel后&#xff0c;发现前面的数字0都消失了&#xff0c;怎么办呢&#xff0c;将需要转换的列转成字符串在导出 2、数据导入时&#xff0c;excel的0消失 载excel中输入’00001’&#xff0c;发现变成了‘1’&#xff0c;选中列点击右键–>设置…

python写一个ai agent对接仓库管理系统的业务流程

要实现一个AI agent对接仓库管理系统的业务流程&#xff0c;首先需要了解仓库管理系统的具体业务流程和需求。以下是一个简单的示例&#xff0c;用Python编写一个AI agent&#xff0c;用于对接仓库管理系统的业务流程。 1. 首先&#xff0c;定义一个类WarehouseManager&#xf…

场景设计题

为什么要这样分表&#xff1f;跨库join如何解决&#xff1f;数据量突增怎么解决&#xff1f; 如何解决线上问题&#xff1f;cpu狂飙怎么办&#xff1f;频繁minor gc怎么办&#xff1f;可能造成的原因是什么&#xff1f;如何避免&#xff1f; 数据库 隔离级别&#xff0c;怎么实…

npm发布自己的插件包:新手教程

npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;广泛用于JavaScript项目中。本文将为你介绍如何从零开始发布一个npm插件包。 前提条件 在开始之前&#xff0c;你需要确保以下几点&#xff1a; 安装Node.js和npm&#xff1a;你可以在No…

C++ 二叉搜索树【面试】

以下是一个简单的二叉搜索树实现&#xff0c;包括插入和查找操作的示例代码&#xff1a; #include <iostream>// 定义二叉搜索树的节点结构 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} };//…

Spring Boot定时任务编程指南:如何创建和配置周期性任务

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …

基于Langchain构建本地大型语言模型(LLM)问答系统的经验分享

基于Langchain构建本地大型语言模型&#xff08;LLM&#xff09;问答系统的经验分享 https://download.csdn.net/download/xziyuan/89334371?spm1001.2101.3001.9500 最近&#xff0c;我一直在探索如何利用Langchain来构建一个本地的大型语言模型问答系统。在这个过程中&…

消息中间件比较:Redis,Kafka和RabbitMQ

对微服务使用异步通信时&#xff0c;通常使用消息代理。代理确保不同微服务之间的通信可靠且稳定&#xff0c;消息在系统内得到管理和监控&#xff0c;并且消息不会丢失。您可以从几个消息代理中进行选择&#xff0c;它们的规模和数据功能各不相同。这篇博文将比较三种最受欢迎…

不知道密码,一样能卸载瑞星esm防病毒终端安全防护系统

离开单位后试图卸载瑞星的时候却发现还需要密码&#xff0c;真是烦死了。研究了几分钟后找到了完美卸载方法。 首先&#xff0c;让我们请出老流氓360安全卫士&#xff0c;下载好它&#xff0c;让右键菜单出现使用 360强力删除这一选项。 之后&#xff0c;进入安全模式&#x…

中医药人工智能大模型正式启动

6月15日&#xff0c;在横琴粤澳深度合作区举行的中医药广东省实验室&#xff08;以下简称横琴实验室&#xff09;第一届学术委员会第一次会议暨首届横琴中医药科技创新大会上&#xff0c;中医药横琴大模型、中药新药智能自动化融合创新平台同时启动。这也是该实验室揭牌半年来取…

迷你手持小风扇十大名牌排名有哪些?公认迷你小风扇排行榜揭开!

随着夏季高温的来临&#xff0c;迷你小风扇成为了大家追求清凉和舒适的必备工具。其小巧便携的设计、强劲的风力和长续航时间&#xff0c;使得迷你小风扇迅速在市场上走红。然而&#xff0c;面对琳琅满目的品牌和各种型号&#xff0c;如何选择一款既高效又耐用的迷你小风扇成为…

UE5 C++ 跑酷游戏练习 Part1

一.修改第三人称模板的 Charactor 1.随鼠标将四处看的功能的输入注释掉。 void ARunGANCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) {// Set up action bindingsif (UEnhancedInputComponent* EnhancedInputComponent CastChecked&…

python+unity手势控制地球大小

效果图如下 具体操作如下 1 在unity窗口添加一个球体 2 给球体添加材质,材质图片使用地球图片 地球图片如下 unity材质设置截图如下 3 编写地球控制脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class test : MonoBehavio…

RK3588/算能/Nvidia智能盒子:加速山西铝业智能化转型,保障矿业皮带传输安全稳定运行

近年来&#xff0c;各类矿山事故频发&#xff0c;暴露出传统矿业各环节的诸多问题。随着全国重点产煤省份相继出台相关政策文件&#xff0c;矿业智能化建设进程加快。皮带传输系统升级是矿业智能化的一个重要环节&#xff0c;同时也是降本增效的一个重点方向。 △各省份智能矿山…

《UNIX环境高级编程》第三版(电子工业出版社出品)——两年磨一剑的匠心译作

历时两年&#xff0c;《UNIX环境高级编程》的翻译工作终于落下帷幕。这一路走来&#xff0c;真可谓是如鱼饮水&#xff0c;冷暖自知。还记得最初看到招募译者消息的那一刻&#xff0c;内心的激动难以言表。我毫不犹豫地报名&#xff0c;而后经历了试译、海选等激烈的角逐&#…

【CMake】Linux 下权限丢失与软链接失效问题

【CMake】Linux 下权限丢失与软链接失效问题 文章目录 【CMake】Linux 下权限丢失与软链接失效问题问题概述解决方法1 - 安装目录2 - 安装文件3 - 手动指定 使用 Linux 下原生命令行注意事项参考链接 问题概述 一般使用 CMake 安装&#xff0c;在 Windows 平台不会出问题&…