指针进阶笔试题

news2024/11/12 12:16:41

在这里插入图片描述
今天分享的是指针的笔试题,相信看完这篇文章对指针又会有深入的了解,让我们来学习吧。
首先分享的是指针和数组的关系,我们都知道数组名是首元素的地址,那就让我们来看一下一维数组和指针的关系吧

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

这些题目我们一定要牢记一些规则,第一个就是数组名就是首元素的地址,只有两个是例外,一个就是sizeof这个操作符,一定要记住他不是函数,然后还有一个就是我们经常看到的取地址操作符(&)这两个是取出整个数组的,其他的都只是首元素的地址,那我们现在来看一下题目吧

int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
//这里a在sizeof内部,是单独出现的,所以表示整个数组的大小,因为sizeof单位是字节
//所以大小就是16,一个int是4个字节
printf("%d\n", sizeof(a + 0));
a不是单独出现,所以表示数组首元素的大小,这里加0就还是数组首元素的地址,所以就是4或者8个字节大小

printf("%d\n", sizeof(*a));
//这里的a就是表示首元素的地址,我们对它解引用,那就是第一个元素,所以这里就表示第一个元素的大小

printf("%d\n", sizeof(a + 1));
//a表示数组首元素的地址,所以加1就是跳过一个int,但是本质还是地址,所以还是4/8个字节
printf("%d\n", sizeof(a[1]));
表示第二个元素,是整型,所以就是4个字节
printf("%d\n", sizeof(&a));
&取出的就是整个数组,就是这个数组的地址,是地址大小就是4/8个字节的大小
printf("%d\n", sizeof(*&a));
*&就相当于加减,所以这里就表示sizeof(a)就是整个数组的大小,所以大小就是16
printf("%d\n", sizeof(&a + 1));
我们先取出a的地,表示真个数组的地址,然后加一跳过的就是整个数组,相当于是4后面的地址,是地址就是4/8

printf("%d\n", sizeof(&a[0]));
是地址就是4/8
printf("%d\n", sizeof(&a[0] + 1));
取出第一个元素的地址然后我们加1,那么就是第二个元素的地址,但是他的本质还是地址,是地址答案就是4/8

其实这些题目只要掌握一些规则就可以解决了,比如要知道数组名是首元素的大小,要知道sizeof和&取出的是整个数组的大小,这些问题就可以解决了

//字符数组
char arr[] = { 'a','b','c','d','e','f' };
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));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr + 0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));

下面我们再来看一下字符数组的题目和上面一样的道理

//字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));
还是一样的道理,首先是数组名单独出现在sizeof中,所以表示的就是整个数组的大小
char的大小就是一个字节大小,所以答案就是6
printf("%d\n", sizeof(arr + 0));
arr就是首元素的地址,所以加上0还是首元素的地址,是地址大小就是4/8个字节的大小
printf("%d\n", sizeof(*arr));
arr不是单独出现,所以这里表示的就是首元素的地址,那么对它解引用就是第一个元素
那答案就是一个字节大小
printf("%d\n", sizeof(arr[1]));
这里就是数组索引,表示的就是第二个元素,所以大小也是1个字节
printf("%d\n", sizeof(&arr));
是地址就是4/8
printf("%d\n", sizeof(&arr + 1));
地址4/8
printf("%d\n", sizeof(&arr[0] + 1));
地址4/8
printf("%d\n", strlen(arr));
strlen统计的是'\0'之前的,因为我们这里数组结尾并没有\0所以是随机数
printf("%d\n", strlen(arr + 0));
这里也是一样的
printf("%d\n", strlen(*arr));
这里表示的是第一个元素,但是我们strlen的参数是指针,所以这里表示错误
printf("%d\n", strlen(arr[1]));
表示错误
printf("%d\n", strlen(&arr));
随机数

这里的strlen我们可以上cplusplsu查看

在这里插入图片描述
通过图片我们可以看到它的参数是一个char类型的指针,所以表示的意思就是只能接收指针,我们接收int的时候编译器就会报错


int main()
{
	char* p = "abcdef";

	printf("%d\n", strlen(p));
	printf("%d\n", strlen(p + 1));
	printf("%d\n", strlen(*p));
	printf("%d\n", strlen(p[0]));
	printf("%d\n", strlen(&p));
	printf("%d\n", strlen(&p + 1));
	printf("%d\n", strlen(&p[0] + 1));
}

我们在来看看这个题目,首先p存放不是这个常量字符串,存放的应该是a首元素的地址,那我们对他进行操作就比较容易理解了,让我们来看一下吧


	//printf("%d\n", sizeof(p));//4/8 计算的是指针变量的大小
	//printf("%d\n", sizeof(p + 1));//p+1还是地址,大小是4/8个字节
	//printf("%d\n", sizeof(*p));//1个字节, *p == 'a'
	//printf("%d\n", sizeof(p[0]));//1个字节, p[0]--> *(p+0) --> *p == 'a';

 //	printf("%d\n", sizeof(&p));//4/8个字节,&p 是地址
	//printf("%d\n", sizeof(&p + 1));//&p是地址,&p+1还是地址,是地址就是4/8个字节

	//printf("%d\n", sizeof(&p[0] + 1));
	因为p是数组首元素的地址,其实它的意思就可以是数组名,那我们取出的就是第一个地址元素的地址,然后我们对它进行加1,那么就是的哥元素的地址,是地址大小就是4/8

看了一维数组之后,我们在来看一下二维数组的题目,二维数组其实本质就是一维数组的数组

/二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a[0][0]));
printf("%d\n", sizeof(a[0]));
printf("%d\n", sizeof(a[0] + 1));
printf("%d\n", sizeof(*(a[0] + 1)));
printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(*(a + 1)));
printf("%d\n", sizeof(&a[0] + 1));
printf("%d\n", sizeof(*(&a[0] + 1)));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a[3]));

数组的第一个元素是0,后面数组的内容就是随机值。

//二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));
首先是a是数组名,说过数组名是首元素的地址,但是由于是二维数组,所以这里的意思就是第一行的地址
类型可不是int 而是int (*)[4],所以这里的意思就是第一行的大小,那就是16个字节
printf("%d\n", sizeof(a[0][0]));
表示第一个元素的大小,所以大小就是4个字节
printf("%d\n", sizeof(a[0]));
表示的是第一行的数组名,所以这里的大小也是16
printf("%d\n", sizeof(a[0] + 1));
a[0]就是第一行的数组名,数组名就是首元素的大小,加一就是第一行第二个元素的地址,是地址就是4/8
printf("%d\n", sizeof(*(a[0] + 1)));
a[0]就是第一行的数组名,数组名就是首元素的地址,加一就是第一行第二个元素大小,所以解引用就是一个整型
大小就是4个字节
printf("%d\n", sizeof(a + 1));
表示第二行的大小,因为a是第一行的地址,加1跳过的是一行,所以就是第二行的地址,那大小
就是4/8个字节大小
printf("%d\n", sizeof(*(a + 1)));
解引用出来应该第二行的所有数据,所以大小就是16个字节
printf("%d\n", sizeof(&a[0] + 1));
因为a[0]表示第一行的数组名,所以取地址应该是第一行,是整个第一行,然后进行加1那么就是第二行
的地址,是地址大小就是4/8
printf("%d\n", sizeof(*(&a[0] + 1)));
根据上面的分心,这是第二行的地址,所以解引用是整个第二行,那大小就是16个字节大小

printf("%d\n", sizeof(*a));、
a是数组名,表示第一行的地址,那么解引用就是第一行,大小就是16个字节
printf("%d\n", sizeof(a[3]));
这里a[3]虽然看起来越界了,但是其实没有,我们这里还是可以理解为它是个数组名,因为数组名单独出现在sizeof当中,那么
表示的就是16个字节大小

我们在继续往下面看一些笔试题

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

这个题目其实看完上面的在来看就有点杀鸡用牛刀的感觉哈哈哈
首先a前面有个取地址的符号,那我们取出的a这个数组的整个地址,然后加以的意思就是跳到5
位置后面一个int大小的地方,所以答案就是2,5

//程序的结果是什么?
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

我们在继续往后面看这个题目,我们其实也有文章讲结构体大小对齐的,大家有兴趣可以去看一下,那这里直接告诉大家大小就是20个字节,0x就是表示16进制,然后\p是地址的打印,我们先来看第一个,第一个是结构体类型的大小进行加1,加就是20,那20用16进制表示的14,所以答案就是0x10014,下面这个就有点误导,我们可以看到的是unsigned,这里大家可不要被骗,以为加的是8,其实爱他就是整型加减,加的就是数字1,按这里的答案是0x100001,接下来继续看后面,这里就是加一个整型大小,所以答案就是0x100004

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;
}

这道题也是一样的很有误导性,第一个很简单,&a就是把整个数组取出来,那我们进行加1跳过的就是整个数组的大小,指向的就是4后面的地址,ptr[-1]就是*(ptr-1)那我们就%x也是打印地址,就是我们的4 所以就是00000004,但是后面的就不是这里了,a先强制转换成一个整型,因为a是首元素的地址,
在这里插入图片描述
那我们加一在强转成整型的话,其实就是相当于取到的就是02 00 00 00,打印的就是2000000

#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,答案就是1

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;
}

在来看这个,这个相当于指针减去指针,我们也知道指针减去指针其实就是元素个数是多少
我们这里一定要画图。
所以一个就是以%d打印的就是-4 还有一个是就是-4的补码然后变成16进制就行了,这里我偷懒了,因为我马上要去吃饭了哈哈哈

还有三道题,小编已经饿死了

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;
}

我们在来看一下这个题目,首先取出的是整个二维数组的地址,然后加1跳过的就是10后面的int大小的地址,我们ptr1-1就是访问的就是10,继续看aa是第一行的地址加1就是第二行的地址,然后强转成int* ptr2-1就是5

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

这个画图就可以写出来,大家ctrl+F5看一下结果,受不了了,我要吃饭了,不写了

谢谢大家 今天的分享就到这里,我们下次再见!!!

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

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

相关文章

go-GC垃圾回收

GC GC是自动化内存管理回收机制 虚拟内存函数栈的数据是会根据函数返回而自动销毁的&#xff0c;而堆上的数据是不会随着函数自动销毁的&#xff0c;堆内数据会随着程序运行而逐渐变大&#xff0c;从而导致内存OOM&#xff0c;Go语言就用了GC来清理堆上的内存数据。 如何区分…

leetcode 2602. 使数组元素全部相等的最少操作次数

给你一个正整数数组 nums 。 同时给你一个长度为 m 的整数数组 queries 。第 i 个查询中&#xff0c;你需要将 nums 中所有元素变成 queries[i] 。你可以执行以下操作 任意 次&#xff1a; 将数组里一个元素 增大 或者 减小 1 。 请你返回一个长度为 m 的数组 answer &#xf…

KCC@大连 | 一场关于开源商业的私享脑暴会

KCC&#xff0c;全称 KAIYUANSHE City Community&#xff08;中文&#xff1a;开源社城市社区&#xff09;是由开源社发起&#xff0c;旨在让开源社区在每个城市落地生根的地域性开源组织。 自2023年2月份发起以来&#xff0c;我们已经在南京、上海、深圳、北京、硅谷、新加坡、…

VMware Fusion 13在M2芯片的Mac上安装 Windows 11

首先需要下载Windows 11镜像 以下给出一种官方方法&#xff0c;当然也可以自己去网上搜索&#xff0c;有很多资源 注册微软账号 使用注册的账号登录 访问&#xff1a;https://www.microsoft.com/en-us/windowsinsider/register 使用登录的账号注册Windows 11 Insider Prog…

关于Python数据分析,这里有一条高效的学习路径

无处不在的数据分析 谷歌的数据分析可以预测一个地区即将爆发的流感&#xff0c;从而进行针对性的预防&#xff1b;淘宝可以根据你浏览和消费的数据进行分析&#xff0c;为你精准推荐商品&#xff1b;口碑极好的网易云音乐&#xff0c;通过其相似性算法&#xff0c;为不同的人…

【海报生成器源码】设计海报生成器网站开源源码(更新)

源码简介: 随着社会经济和商业发展&#xff0c;对产品宣传的需求也加大了。如何快速制作海报也成了很大的需求。这里分享的是一个海报生成器网站的最新源代码。 这个海报编辑器有着实用强大的功能&#xff0c;它的最左侧是组件列表。可以在最左侧选择组件&#xff0c;比如文本…

通讯网关软件003——利用CommGate X2Mbt实现Modbus TCP访问OPC Server

本文介绍利用CommGate X2Mbt实现Modbus访问OPC Server。CommGate X2MBT是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;SCADA系统配置OPC Server&#xff0c;现在上位机需要通过Modbus主站软件来获…

基础版本抖音(字节跳动青训)

抖音基础版&#xff08;字节跳动青训项目&#xff09; 一、项目介绍 本抖音项目是基于grpc通讯协议开发的高性能微服务&#xff0c;不仅使用gin作为业务层框架&#xff0c;gorm框架作为持久层框架&#xff0c;还使用预编译sql防止sql注入&#xff0c;同时该项目结合连接池技术…

JDK9特性——模块化REPL工具

文章目录 前言模块化模块化案例 可交互的REPL工具 前言 谈到Java9大家往往第一个想到的就是Jigsaw项目&#xff08;后改名为Modularity&#xff09;。众所周知&#xff0c;Java已经发展超过20年(95年最初发布)&#xff0c;Java和相关生态在不断丰富的同时也越来越暴露出一些问…

ubuntu(20.04)下截图贴图软件——flameshot(带设快捷键)

ubuntu&#xff08;20.04&#xff09;下截图贴图软件——flameshot 一、 安装二、打开Flameshot三、截图快捷键设置 windows习惯了用Snipaste的截图和贴图功能&#xff0c;在ubuntu中也有替代品Flameshot。 一、 安装 首先我们进入官网&#xff0c;并点击download。 在这里可…

轻松鲨-AI文案写作 人工智能聊天

轻松鲨AI助手使用地址&#xff1a;http://www.qingsongsha.com?utm_sourcenavigation_website 或前往苹果App Store下载“轻松鲨APP” 支持AI连续对话聊天&#xff0c;帮你解答各种疑问... 让AI帮你画思维导图写文案&#xff0c;提升工作效率... 内置多场景专业模板&#xff0…

[SQL Server]在应使用条件的上下文(在 ‘)‘ 附近)中指定了非布尔类型的表达式,查询时间大于某个数值时

这种条件查询条件里面不要有空格&#xff0c;一个也不要有 这种条件查询条件里面不要有空格&#xff0c;一个也不要有 $giftsDb::table(drawgot)->where(disabtime,<,"2030-01-03")->select();

安卓判断是否是模拟器,适配主流雷电,MUMU,夜神,逍遥

前言 最近游戏项目组又有新的要求&#xff0c;对于数据上报和数据统计接口&#xff0c;尽可能的具体化&#xff0c;比如是否是模拟器&#xff0c;模拟器的型号&#xff0c;品牌等&#xff0c;都要求统计&#xff0c;后续模拟器玩家在活动发放&#xff0c;安全风控等方面也易于…

Linux Spug自动化运维平台公网远程访问---内网穿透

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

脚本:用python实现五子棋

文章目录 1. 语言2. 效果3. 脚本4. 解读5. FutureReference 1. 语言 Python 无环境配置、无库安装。 2. 效果 以第一回合为例 玩家X 玩家0 3. 脚本 class GomokuGame:def __init__(self, board_size15):self.board_size board_sizeself.board [[ for _ in range(board_…

InfiniBand vs 光纤通道,存储协议的选择

数字时代&#xff0c;数据量爆发增长&#xff0c;企业越来越迫切地追求高吞吐量、低延迟和更高性能的网络基础设施&#xff0c;存储协议的选择变得愈发至关重要。在众多存储协议中&#xff0c;InfiniBand和光纤通道备受关注。本文旨在深入探讨InfiniBand和光纤通道作为存储协议…

python之有限体积法求解一维热传导问题

1、问题描述 考虑均匀发热无限大平板的稳定导热问题&#xff0c;上图中&#xff0c;A、B两面恒温&#xff0c;控制方程为如下形式&#xff1a; 为扩散系数&#xff0c;为材料传热系数&#xff0c;给定厚度&#xff0c;&#xff0c;和分别为100℃和400℃&#xff0c;发热量q为50…

【C++】红黑树插入操作实现以及验证红黑树是否正确

文章目录 前言一、红黑树的插入操作1.红黑树结点的定义2.红黑树的插入1.uncle存在且为红2.uncle不存在3.uncle存在且为黑 3.完整代码 二、是否为红黑树的验证1.IsBlance函数2.CheckColor函数 三、红黑树与AVL树的比较 前言 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在…

气传导耳机什么意思?备受好评的气传导耳机推荐

​气传导耳机是近年来备受关注的一种新型耳机&#xff0c;它采用了独特的设计&#xff0c;将声音通过空气传递到耳朵&#xff0c;从而实现听音乐的效果。与传统的入耳式耳机相比&#xff0c;气传导耳机在听音乐的同时还能听到周围环境声音&#xff0c;提高了安全性和舒适性。如…

开学什么牌子的电容笔质量好耐用?精选4款好用的电容笔

随着新学期开始&#xff0c;我们该准备些什么&#xff1f;随着技术的发展&#xff0c;ipad上出现了各种各样的电容笔。一支好的电容笔&#xff0c;不但可以极大地提升我们的学习效率&#xff0c;也可以极大地提升我们的工作效率。国内厂商生产的这支平替电容笔&#xff0c;无论…