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…

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

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

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

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

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

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;而后经历了试译、海选等激烈的角逐&#…

基于块生成最大剩余空间的三维装箱算法

问题简介 三维装箱问题&#xff08;3D Bin Packing Problem&#xff0c;3D BPP&#xff09;是一类组合优化问题。它涉及到将一定数量的三维物品放入一个或多个三维容器&#xff08;称为“箱子”&#xff09;中&#xff0c;同时遵循一定的约束&#xff0c;通常目标是最大化空间…

后端开发中缓存的作用以及基于Spring框架演示实现缓存

缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…

滚球游戏笔记

1、准备工作 (1) 创建地面&#xff1a;3D Object-Plane&#xff0c;命名为Ground (2) 创建小球&#xff1a;3D Object-sphere&#xff0c;命名为Player&#xff0c;PositionY 0.5。添加Rigidbody组件 (3) 创建文件夹&#xff1a;Create-Foder&#xff0c;分别命名为Material…

AUTOSAR学习

文章目录 前言1. 什么是autosar&#xff1f;1.1 AP&#xff08;自适应平台autosar&#xff09;1.2 CP&#xff08;经典平台autosar)1.3 我的疑问 2. 为什么会有autosar3.autosar的架构3.1 CP的架构3.1.1 应用软件层3.1.2 运行时环境3.1.3 基础软件层 3.2 AP的架构 4. 参考资料 …

shell脚本中的变量

关于Linux操作系统中当前shell进程与子shell进程的详细解释 如上图所示&#xff0c;使用ps -f可以当前查看Linux操作系统中当前正在运行的进程。 然后敲bash后&#xff0c;相当于在当前的bash shell环境下又创建了一个子bash shell的进程&#xff0c; 如上图所示&#xff0c;…

win环境安装Node.js的多种方式

今天我们分享win环境安装Node.js的多种方式&#xff1a; 首先要明白Node.js是一个JavaScript运行环境&#xff0c;它基于Google的V8引擎进行封装&#xff0c;允许JavaScript运行在服务器端。Node.js让JavaScript成为一种与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语…

图神经网络入门(1)-networkx

简介 NetworkX是一个Python语言的图论建模工具&#xff0c;用于创建、操作复杂网络结构&#xff08;如图、有向图等&#xff09;。它提供了许多用于分析网络、生成随机网络、以及可视化网络的函数和工具。用户可以利用NetworkX来研究复杂网络的拓扑结构、节点间的关系以及路径查…

【RK3588/算能/Nvidia智能盒子】挑战「无电无网」部署AI算法,守护大亚湾荃美石化码头工地安全

“万顷碧波之上&#xff0c;一座千米钢栈桥如蛟龙出水&#xff0c;向大海蜿蜒。钢栈桥上的项目建设者正在加紧作业&#xff0c;为助推惠州大亚湾加快建设成为世界级绿色石化基地全力奋战。”这是不久前北京日报对大亚湾惠州港荃湾港区荃美石化码头工地的描述。 △ 图片来源于北…