【C进阶】指针笔试题解析

news2024/11/25 22:44:39

做题之前我们再来回顾一下

对于数组名的理解:除了以下两种情况,数组名表示的都是数组首元素的地址

(1)sizeof(数组名):这里的数组名表示整个数组

(2)&(数组名) :这里的数组名也表示整个数组

1.程序的结果是什么?

int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int* ptr = (int*)(&a + 1);
	printf("%d,%d", *(a + 1), *(ptr - 1));
	return 0;
}

【答案】:

2,5

【解析】:

难点:&a+1的含义

&a,数组名和&单独结合,此时的a代表整个数组的地址

+1也就跳过整个数组的地址(&a的类型为数组指针:int (*)【5】)

a指向的是数组首元素

+1也就是指向第二个元素

【图解】:

a80e9f41f04d4e54bf46cbd24d21ab0c.jpeg


 2.假设p 的值为0x100000。 如下表表达式的值分别为多少?

//已知,结构体Test类型的变量大小是20个字节(32位环境下)

struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;

int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

【答案】:

10000014

10000001

10000004

【解析】:

结构体的最后*p表示:定义了一个struct类型的指针变量p

%p表示:以地址的形式打印

eg:32位打印出来也就是00 00 00 00(前面的0不会省,就是打印出8位

%x表示:以十六进制的形式打印(和%p不一样,最前面的0会省略

(1)结构体指针+1,表示跳过整个结构体,因为结构体的大小为20个字节,那么就是地址+20

,0x十六进制表示0x10000014(14表示的十六进制也就是十进制的20)

%p形式打印也就是10 00 00 14

(2)指针类型变为unsigned long正常数值类型(要注意这里不再是指针类型)

正常数值+1也就是10 00 00 01

%p形式打印也就是10 00 00 01

(3)struct类型的指针变为unsigned int*类型的指针

int类型指针+1,表示跳过一个int类型,也就是跳过4个字节

%p形式打印也就是10 00 00 04


 3.程序的结果是什么?

int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);
	return 0;
}

【答案】:

4,2000000

【解析】:

(1)&a,数组名和&单独结合,此时的a代表整个数组的地址

+1也就跳过整个数组的地址(&a的类型为数组指针:int (*)【4】)

再强转为int *类型,ptr1[-1]==*(ptr1-1),也就是4

(2)难点:怎么理解(int*)((int)a + 1) (简单来说就是数值+1转为地址+1个字节)

a单独代表数组首元素,强转为int类型,再+1也就是数值+1

eg:假设a的地址是0x0012ff40(十进制也就是1244992)

那么a+1也就是0x0012ff41(十进制1244993)

我们发现就是多了一个字节(内存中一个地址对应一个字节)

在vs编译器中,数值在内存中是小端存储,那么a数组从低地址到高地址存储就是

01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00(注意不要写成了10 00 00 00)

a变为数值+1也就是+一个字节,再把加一个字节后的a当作一个地址,那么a也就是跳过了一个字节,指向了01后面的00位置,即ptr2指向了01后面的00位置

int *ptr2解引用也就访问4个字节,也就是00 00 00 02这4个字节

转化为数值也就是0x02 00 00 00,那么以%x打印也就是2000000


 4.程序的结果是什么?

#include <stdio.h>
int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
	int* p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}

【答案】:

1

【解析】:

难点:数组定义的括号不是{ },而是()

{   {   }, {  }  }中里面的{  }表示:数组初始化的行列元素

{   (  ), (  )}中的( )表示:逗号表示式

第一行逗号表达式计算完也就是int a[3][2] = { 1, 3, 5 };

那么p【0】==*(p+0)也就是数组的第一个元素1


 5.程序的结果是什么?

int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
	return 0;
}

【答案】:

FFFFFFFC,-4

【解析】:

一个元素为4的数组指针指向一个5行5列的二维数组,也就是将这个数组每4个元素放一块,看图解(实际上二维数组也是连续存放的,但是为了便于理解,还是画成了行和列)

指针-指针得到的是两个指针之间的元素个数

&p[4][2] - &a[4][2]也就是-4

&d打印就直接打印数值-4

对于%p打印地址,在内存中存储的补码就是地址(fffc)

原码:1000 0000 0000 0000 0000 0000 0000 0100

反码:1111 1111 1111 1111 1111 1111 1111 1011

补码:1111 1111 1111 1111 1111 1111 1111 1100

转为十六进制也就是F F F F F F C

9175d5c7273a4695be760857d215088d.png


 6.程序的结果是什么?

int main()
{
	int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int* ptr1 = (int*)(&aa + 1);
	int* ptr2 = (int*)(*(aa + 1));
	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
	return 0;
}

【答案】:

10,5

【解析】:

(1)&aa是二维数组地址,&aa+1跳过整个二维数组,元素10后面的地址

ptr1-1是元素10的地址,*(ptr1-1)是元素10

(2)aa是二维数组名,是第一行一维数组地址

aa+1跳过第一行数组,到第二行数组地址 

*(aa + 1)是第二行的首元素地址

ptr2 - 1是元素5的地址,*(ptr2 - 1)是元素5


 7.程序的结果是什么?

#include <stdio.h>
int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

【答案】:

at

【解析】:

a是一个指针数组,里面存放了元素的地址

pa指针变量指向了a数组的第一个元素(第一个字符串)

二级指针pa++也就是跳过一个a【0】

那么pa就指向了a【1】(也就是第二个字符串)

二级指针char **pa怎么理解:

*pa这里的*表示pa为指针

char *代表pa指向的对象类型为char *类型


8.程序的结果是什么?

int main()
{
	char* c[] = { "ENTER","NEW","POINT","FIRST" };
	char** cp[] = { c + 3,c + 2,c + 1,c };
	char*** cpp = cp;
	printf("%s\n", **++cpp);
	printf("%s\n", *-- * ++cpp + 3);
	printf("%s\n", *cpp[-2] + 3);
	printf("%s\n", cpp[-1][-1] + 1);
	return 0;
}

【答案】:

POINT
ER
ST
EW

【解析】:

88edb54f58f24d69a2698bdebb0a8de0.jpg

(1)cpp+1指向cp的第二个元素,

一次解引用找到c+2

两次解引用找到的就是POINT

(2)cpp再次++指向cp的第三个元素

注意:这里cpp++是接着上次的位置继续++

一次解引用找到c+1

c+1再--得到c(数值--)

c再第二次解引用找到ENTER的首地址

再+3跳过3个字节指向E的地址

最后从这个地址开始打印

(3)*cpp[-2] ==**(cpp-2) (这里是相当于,但是cpp并没有-2)

cpp-2指向cp的第一个元素,

一次解引用找到c+3

两次解引用找到的就是FIRST

再+3,跳过3个字节指针指向S的地址

最后从这个地址开始打印

(4)cpp[-1][-1]==*(*(cpp-1)-1)

cpp-1指向cp的第二个元素

一次解引用找到c+2

(c+2)-1得到c+1

第二次解引用找到的就是NEW中N的地址

再+1跳过一个字节,指向E

最后从这个地址开始打印


本次内容就到此啦,欢迎评论区或者私信交流,觉得笔者写的还可以,或者自己有些许收获的,麻烦铁汁们动动小手,给俺来个一键三连,万分感谢 ! 

87e8203d24d44ae2a0fc486087c20bbd.jpeg

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

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

相关文章

关掉在vscode使用copilot时的提示音

1. 按照图示的操作File --> Preferences --> Settings 2. 搜索框输入关键字Sound&#xff0c;因为是要关掉声音&#xff0c;所以找有关声音的设置 3. 找到如下图所示的选项 Audio Cues:Line Has Inline Suggetion,将其设置为Off 这样&#xff0c;就可以关掉suggest code时…

使用 Python 给 PDF 添加目录书签

0、库的选择——pypdf 原因&#xff1a;Python Version Support Python 3.11 3.10 3.9 3.8 3.7 3.6 2.7 pypdf>3.0 YES YES YES YES YES YES PyPDF2>2.0 YES YES YES YES YES YES PyPDF2 1.20.0 - 1.28.4 YES YES YES YES YES YES P…

【JAVA】为什么要使用封装以及如何封装

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 前言 Java的封装指的是在一个类中将数据和方法进行封装&#xff0c;使其可以保护起来&#xff0c;只能在该类内部访问&#xff0c;而不允许外部直接访问和修改。这是Java面向对象编程的三…

Python3学习笔记——第一章:基础入门

Python3 有段时间没摸Python了&#xff0c;浏览了一下菜鸟教程&#xff0c;巩固一下基础吧。 Python3学习笔记——第一章&#xff1a;基础入门 文章目录 Python3一、Python3 简介二、Python的安装三、查看 Python 版本四、第一个Python3程序 一、Python3 简介 讲几个对编程有…

【Cesium创造属于你的地球】相机系统

相机系统里面有setView&#xff0c;flyTo&#xff0c;lookAt&#xff0c;viewBoundingsphere这几种方法&#xff0c;以下是相关的使用方法&#xff0c;学起来&#xff01;&#xff01;&#xff01; setView 该方法可以直接切换相机视口&#xff0c;从而不需要通过一个飞入的效…

【Java】什么是继承

目录 什么是继承 继承关系图 idea如何生成继承类图 继承优缺点 什么情况下使用继承模式呢&#xff1f; 继承中变量的访问特点 什么是继承 继承是面向对象的三大特征之一&#xff0c;可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义、追加属性和方法…

蓝桥杯Python scratch C++选拔赛stema个人如何报名?

如果不会操作&#xff0c;可以微信makytony协助。

阅读LINGO-1: Exploring Natural Language for Autonomous Driving

1 背景2 Motivation3 具体过程 1 背景 wayve在9月14日公布了大语言模型和自动驾驶的结合模型LINGO-1&#xff0c;可以用自然语言解释自动驾驶的决策原因。 网页链接&#xff1a;https://wayve.ai/thinking/lingo-natural-language-autonomous-driving/ 但是目前没有论文和开源…

【牛客网】JZ39 数组中出现次数超过一半的数字

题目 思路 思路1 将数组排序,再保证有结果的情况下,此时数组中间的数字就是想要的结果 思路2 在保证有结果的情况下,此时数组的的众数是数组长度的一半以上 所以我们可以通过抵消的做法来找到最终的结果 我们可以从头遍历这个数组,如果两个数不相同,则消去这两个数,最坏的…

SpringBoot的学习

代码书写&#xff1a;耦合度偏高 解决方法&#xff1a;使用对象时&#xff0c;在程序中不要主动使用new产生对象&#xff0c;转换为由外部提供对象——IcC控制反转 IoC&#xff08;Inversion of Control&#xff09;控制反转 使用对象时&#xff0c;由主动new产生对象转换为…

链式二叉树的基本操作实现

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;数据结构 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 链式二叉树基本操作 二叉树节点设置二叉树的深…

RabbitMQ学习笔记(消息发布确认,死信队列,集群,交换机,持久化,生产者、消费者)

MQ&#xff08;message queue&#xff09;&#xff1a;本质上是个队列&#xff0c;遵循FIFO原则&#xff0c;队列中存放的是message&#xff0c;是一种跨进程的通信机制&#xff0c;用于上下游传递消息。MQ提供“逻辑解耦物理解耦”的消息通信服务。使用了MQ之后消息发送上游只…

MySQL - mysql服务基本操作以及基本SQL语句与函数

文章目录 操作mysql客户端与 mysql 服务之间的小九九了解 mysql 基本 SQL 语句语法书写规范SQL分类DDL库表查增 mysql数据类型数值类型字符类型日期类型 示例修改&#xff08;表操作&#xff09; DML添加数据删除数据修改数据 DQL查询多个字段条件查询聚合函数分组查询排序查询…

【AI视野·今日Sound 声学论文速览 第十六期】Mon, 2 Oct 2023

AI视野今日CS.Sound 声学论文速览 Mon, 2 Oct 2023 Totally 13 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Improving Audio Captioning Models with Fine-grained Audio Features, Text Embedding Supervision, and LLM Mix-up Augmentation Auth…

质数距离 - 如何在较合理的时间复杂度内求2e9范围内的质数

求l、r之间的质数&#xff0c;范围在2e9&#xff0c;但l、r的差值不大&#xff0c;在1e6范围内 先求出 内的质数&#xff0c;然后拿这个指数去筛[l, r]范围内的即可 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \…

微信开发者工具 如何设置代码的缩进

最近学习小程序的时候发现微信开发工具的缩进有点问题&#xff0c;当我在pages-index-index.wxml中删除初始代码重新自己写的时候。发现里面其实是没有缩进的。 如下图&#xff1a; 然后我自己研究了一下&#xff0c;结合查了一些资料&#xff0c;总结了在微信开发者工具中设置…

全网最全Java快捷键~

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

Windows11与CentOS7下配置与检测JDK与Maven环境变量

安装过程参考我这篇&#xff1a;Java开发环境的搭建与测试及相关问题的解决 JDK 一、Windows 需要配置三个系统内变量&#xff0c;分别为CLASSPATH、PATH、JAVA_HOME 。 CLASSPATH 变量 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 或者 .;%java_home%\lib;%java_…

【image captioning】CaMEL: Mean Teacher Learning for Image Captioning(实现流程)

CaMEL: Mean Teacher Learning for Image Captioning(实现流程) 作者:安静到无声 个人主页 目录 CaMEL: Mean Teacher Learning for Image Captioning(实现流程)环境设置数据准备Evaluation训练程序推荐专栏参考代码: CaMEL: Mean Teacher Learning for Image Captioning.…

DFS 模板:843. n-皇后问题

n−n−皇后问题是指将 nn 个皇后放在 nnnn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 nn&#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n…