指针进阶(4)看一下这些与指针有关的题你都会做吗?

9efbcbc3d25747719da38c01b3fa9b4f.gif

 c语言中的小小白-CSDN博客c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm=1001.2014.3001.5343

给大家分享一句我很喜欢我话:

知不足而奋进,望远山而前行!!!

铁铁们,成功的路上必然是孤独且艰难的,但是我们不可以放弃,远山就在前方,但我们能力仍然不足,所有我们更要奋进前行!!!

今天我们更新了指针相关常见题型内容,

🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

一、例子1

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

我们先来看第一个例子,先创建一一维数组,然后第三行代码将创建一个指针ptr,指向变量a后面的内存位置。它通过使用 &a 获取变量a的地址,然后将其强制转换为 int* 类型指针。接下来,+1 操作将指针指向下一个 int 类型的内存位置。

然后看这张图片,第一个输出的是*(a+1),a是一个数组名,它在这里代表的是第一个元素的地址,然后+1,也就是输出第二个元素,所以第一个输出2,然后看*(ptr+1),ptr我们已经说了,代表的是&a+1,这里的&a代表的是整个数组的地址,然后+1之后其实是跳过整个数组,这里我们呢再来说一下表示整个数组的两种情况:

表示整个数组的地址

1. &arr 表示的是 整个数组 的 地址

2.sizeof(arr)中的arr表示的 是整个 数组

(此外的都表示首元素地址,或首行地址等等)

然后我们继续说这个题,此时跳过整个数组之后,&a+1代表的位置已经在图片中表示出来了,所以此时ptr-1在解引用代表的就是5这个元素了,所以会输出2,5

二、例子2

struct Test{int Num;char *pcName;short sDate;char cha[2];short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

再看上述这串代码,这串代码的问题是,在x86的环境下,假设结构体的大小是20个字节,那么这串代码会输出什么,先来说一下x86环境是什么意思,其实就是在32位平台下

我们先来分析一下这串代码,我们创建了一个结构体,Test,然后在最后加了一个*,所以这是一个结构体指针,然后创建了一个结构体指针变量p,然后0x100000其实就是p里面存放的值,作为一个地址,然后我们前面说了结构体大小为20个字节,所以加1也就是跳过了20个字节,所以第一个应该是加20,但是0x100000是一个十六进制的数,因此将20转化为十六进制,结果就是0x100014。

然后我们看第二个,我们先把它强制类型转化成long,它就不再是指针了,然后整型值+1,其实就是+1,所以结果是0x100001,

最后我们来看第三个,第三个是强制类型转化为了int*类型,那么+1其实就是加4了,因为一个int*类型占据四个字节嘛,所以此时就是输出0x100004了

三、例子3

#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,3,5};

然后接着往下走,创建一个指针p,然后令p=a[0],这里的a[0]就是第一行的数组名,数组名又表示首元素地址,然后输出p[0],也就是输出1.

下面我们运行代码看一下:

看来我们的推论是正确的。

四、例子4

#include <stdio.h>
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;
}

在x86平台上,你认为这串代码会输出什么呢,

先来分析一下这串代码, int(*p)[4],创建一个数组指针,然后p指向的是四个整形元素的

然后把a赋给p,

然后我们看输出的元素是指针-指针类型的,指针-指针得到的是指针之间的元素个数的绝对值。

我们再来看一下p=a这一行,这是什么意思呢?我们知道,a是二维数组,然后二维数组的数组名代表着首元素地址,也就是第一行的地址,

看一下这张图,绿色包含的这一块就是a所代表的地方。然后我们看&p[4][2],这个其实就是             *(*(p+4)+2),但是p有自己的类型,p指向的数组是四个整形元素的,所以每次+1往后跳四个元素,

所以&p[4][2]就指向紫色填充的地方。然后这两个指针相减,之间有四个元素,然后低地址-高地址,所以结果是负数,换成二进制就是1000000000000000000000000000100(原码)111111111111111111111111111111011(反码)111111111111111111111111111111100(补码)

然后因为打印是按十六进制打印,补码换成十六进制就是FFFFFFFC

然后看第二个,以%d形式打印,就是打印-4。

五、例子5

#include <stdio.h>
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;
}

先看ptr1,%aa是取出的整个二维数组的地址所以加1就是跳过整个二维数组,所以打印*(ptr-1)结果就是10了

再看ptr2,

ptr2是图片中的这样,所以*(ptr2-1)就是打印5了。

六、例子6

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

下面我们再来看一下这串代码,这串代码首先创建了一个数组a,然后每个元素都是一个char*类型

然后创建一个二级指针pa,存放char*类型的数组a的地址,a代表数组的首元素,然后pa++,所以pa就等于at

七、例子7

#include <stdio.h>
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;
}

最后我们来看一下这串代码,这串代码是这些代码中最复杂的一个,大家一定要跟着我的思路慢慢理解,

首先我们来画一个图,来表示这个代码的基本思路

这就是一个代码的大致思路。

然后我们看第一个**++cpp,这个代码限制性++这一步,++后cpp指向的便是c+2这里,然后两次解引用,我们便得到P的地址,然后输出P这个数组的字符串,便会输出POINT

然后我们看*--*++cpp+3,此时我们要知道cpp指向的是c+2这里,因为优先级我呢提,所以我们先执行cpp前面的内容,++cpp,那么此时cpp便指向c+1这里,然后解引用,再--,便指向E这里,然后解引用,然后再+3,所以此时就会输出ER这个字符串。

然后我们再来看一下第三个,*cpp[-2]+3,这里cpp[-2]的意思其实就是*(cpp-2),然后由上面可得cpp此时位于c那里,然后-2就会位于c+3的位置,然后再解引用,此时会指向F这里,然后+3,就会输出了ST

最后我们来看一下cpp[-1][-1]+1,转换成*(*(cpp-1)-1)+1,我们知道此时cpp还是位于c+1的位置,因为cpp[-2]不会改变cpp的位置然后cpp-1,得到c+2,然后再-1,再次得到c+1指向的位置,也就是N,然后再+1,也就输出EW了

总结:

这就是我们今天讲解的全部题目了,希望大家好好看一下,把这些题都搞懂,那么指针的学习也就合格了。

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

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

相关文章

【E3S独立出版】2024年第二届绿色建筑国际会议(ICoGB 2024)

会议简介 Brief Introduction 2024年第二届绿色建筑国际会议(ICoGB 2024) 会议时间&#xff1a;2024年5月22日-24日 召开地点&#xff1a;意大利米兰 大会官网&#xff1a;www.icogb.org ICoGB 2024由意大利米兰理工大学主办&#xff0c;西安交通大学&#xff0c;葡萄牙米尼奥大…

什么是Java内存模型

当问到 Java 内存模型的时候&#xff0c;一定要注意&#xff0c;Java 内存模型&#xff08;Java Memory Model&#xff0c;JMM&#xff09;它和 JVM 内存布局&#xff08;JVM 运行时数据区域&#xff09;是不一样的&#xff0c;它们是两个完全不同的概念。 1.为什么要有 Java …

【校园安全】支小蜜防校园霸凌语音识别系统的好处

在校园安全领域&#xff0c;防校园霸凌语音识别系统的出现&#xff0c;为预防和应对校园霸凌行为提供了新的技术手段。本文将探讨防校园霸凌语音识别系统的好处&#xff0c;并分析其在校园安全建设中的重要作用。 通过安装在校园各个角落的语音识别设备&#xff0c;系统能够捕…

蓝桥杯倒计时 36天-DFS练习2

文章目录 黄金二叉树混沌之力2 黄金二叉树 思路一&#xff1a;递推做法 #include<bits/stdc.h> using namespace std;const int N 1e510;int A[N]; int B[N]; int n,sum;int main( ){cin>>n;for(int i1;i<n;i)cin>>A[i];int left,right;for(int i1;i<…

用Python爬取古诗文网的各类古诗

fetch-gushiwen 用途 可以拿去用于个人知识库、知识图谱的创建等其他学习用途。 使用 输入古诗文网的链接&#xff0c;即可爬取该页面所有诗歌的诗名&#xff0c;作者&#xff0c;朝代&#xff0c;内容&#xff0c;译文&#xff0c;注释&#xff0c;赏析&#xff0c;创作背…

[MRCTF2020]Transform1

a[33]"9,10,15,23,7,24,12,6,1,16,3,17,32,29,11,30,27,22,4,13,19,20,21,2,25,5,31,8,18,26,28,14" b[33]"103,121,123,127,117,43,60,82,83,121,87,94,93,66,123,45,42,102,66,126,76,87,121,65,107,126,101,60,92,69,111,98,77" python代码 a3 [103…

前端实现一个绕圆心转动的功能

得知了转换关系&#xff0c;我们就可以定义一个变量 angle 来表示我们这个 div 做圆周运动时绕圆心转过的角度&#xff0c;则弧度&#xff08;radian&#xff09; 为 radian &#xff08;angle*π&#xff09;/180 我们先在草稿纸上演练一遍我们的逻辑是否可行。让我们先准备一…

2024蓝桥杯每日一题(差分)

一、第一题&#xff1a;空调 解题思路&#xff1a;差分 希望P减掉T后就相当于从0到New_P&#xff0c;想到得到New_P只需要对全0数组进行若干次区间加操作&#xff0c;所以只需要对New_P数组进行差分&#xff0c;累加正数和负数&#xff0c;哪个绝对值大答案就是那个。 …

数据库安全的重要性

数据库作为信息系统的核心&#xff0c;不仅承载着海量的关键数据&#xff0c;还负责向各类用户提供高效、可靠的信息服务。在网络技术高度发展的今天&#xff0c;数据库的安全性显得尤为关键。为了防范不法分子的攻击&#xff0c;维护数据完整性和可靠性&#xff0c;数据库安全…

【Windows】VMware虚拟机应用(二):安装ubuntu-14.04.4

一、下载安装包 ubuntu-14.04.4-server-amd64.iso 注&#xff1a;因为我是用已有的安装包&#xff0c;所以&#xff0c;这里就不写下载步骤了。 二、安装引导 以管理员身份运行 VMware Workstation Pro 注&#xff1a;如果不是管理员身份运行&#xff0c;在安装系统时会出现…

二叉搜索树:查找+插入+删除+性能分析

文章目录 一、搜索树1.二叉搜索树的查找2.二叉搜索树的插入3.二叉搜索树的删除4.性能分析 一、搜索树 二叉搜素树 &#xff08; 二叉排序树 ) 1.要么是空树 2.如果左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 3.如果右子树不为空&#xff0c;则右子树上所…

7款前端实战型项目特效分享(附在线预览)

分享7款实用性的前端动画特效 其中有canvas特效、css动画、svg动画等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 CSS春节灯笼特效 基于CSS实现的灯笼特效 灯笼会朝左右两个方向来回的摆动着 以下效果图只能体现…

关于Vue3的一些操作

1. 设置浏览器自动打开 在package.json 中设置 dev: vite --open 2.给src文件夹配置别名 在vite.config.ts配置文件中添加以下内容 3. 如果2中有红色波浪线的问题 ***安装一个文件包***npm install types/node3. 在tsconfig.json配置文件中&#xff0c;找到配置项compi…

Windows下Node.js安装保姆级教程

一、Node.js 下载 访问Node.js官网&#xff0c;点击下载Node.js 下载完成后即可在下载文件中查看安装包 二、安装 一&#xff09;点击安装包开始安装&#xff0c;进入Weclcome界面点击Next 二&#xff09;勾选同意协议&#xff0c;点击Next 三&#xff09;根据需要选择安装路…

Open CASCADE学习|表面着色显示模型

模型表面着色具有如下作用&#xff1a; 视觉增强&#xff1a;通过为模型表面添加着色&#xff0c;可以使其更加生动和逼真&#xff0c;提高视觉体验。 信息区分&#xff1a;在复杂的模型中&#xff0c;不同的部分或组件可能需要通过不同的颜色来区分&#xff0c;以便更清晰地…

简介maven核心:pom项目对象模型

Maven Maven 意思是知识的积累者&#xff0c;最初是为了简化 Jakarta Turbine 项目中的构建过程。有几个项目&#xff0c;每个项目都有自己的 Ant 构建文件&#xff0c;它们都略有不同。JAR 被检入 CVS。我们想要一种标准的方式来构建项目&#xff0c;清楚地定义项目的组成&am…

Redis缓存预热-缓存穿透-缓存雪崩-缓存击穿

什么叫缓存穿透? 模拟一个场景: 前端用户发送请求获取数据,后端首先会在缓存Redis中查询,如果能查到数据,则直接返回.如果缓存中查不到数据,则要去数据库查询,如果数据库有,将数据保存到Redis缓存中并且返回用户数据.如果数据库没有则返回null; 这个缓存穿透的问题就是这个…

电力物联网系统设计

电力物联网系统设计 简介 在新能源行业从业多年&#xff0c;参与和负责过大大小小的的项目&#xff0c;发电侧、电网侧、用户侧系统都有过实际的项目经验&#xff0c;这些项目或多或少都有物联网采集方面的需求&#xff0c;本篇文章将会对电力行业物联网经验做一个总结分享。 …

【Spring知识体系】1.1 Java 注解(Annotation)

文章目录 1.1 注解&#xff08;Annotation&#xff09;1.1.1 什么是注解1.1.2 内置注解1.1.3 元注解&#xff08;5种&#xff09;1.14 自定义注解1.15 注解使用场景介绍※ 本文小结 1.1 注解&#xff08;Annotation&#xff09; 1.1.1 什么是注解 注解的定义&#xff1a;它提…

基于工业边缘网关的机械状态监测与故障诊断应用

机械设备工作于各种各样的环境&#xff0c;在运行过程中必然受到力、温度、摩擦等多种物理、化学作用,使机械设备状态和性能变化,进而产生“隐性故障”。随着机械设备“隐性故障”的长期累积&#xff0c;可能造成设备损伤损坏&#xff0c;甚至影响系统整体生产和运营&#xff0…