指针的认识(指针变量类型意义、指针运算)

目录

一、指针变量类型的意义

a.通过指针的解引用理解类型意义

b.void* 类型指针

c.const修饰的指针变量

c.1 const放在*号左边​编辑

c.2 const放在*号右边

二、指针运算

a.指针+-整数

​编辑

b.指针 - 指针

​编辑

c.指针的关系运算


一、指针变量类型的意义

        指针变量有不同的类型,在同一平台下,不同类型的指针变量大小是一样的,那么为什么还要分那么多种指针变量类型呢?

a.通过指针的解引用理解类型意义

        对比,下面2段代码,主要在调试时观察内存的变化

对于代码1,一次访问更改四个字节

对于代码2,一次访问更改一个字节

        由于一个int类型数据需要四个字节大小内存空间来存放,所以访问一个整形变量时,应该一次访问四个字节才能拿到完整数据,不同的指针类型就应该一一对应不同类型变量应该决定访问空间大小

        结论:指针的类型决定了,对指针解引用的时候有多大的权限(一次能操作几个字节)。比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

b.void* 类型指针

        在指针类型中有⼀种特殊的类型是 void * 类型的,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进行指针的+-整数和解引用的运算

        为什么要存在 void* 类型的指针呢?主要还是作用于函数接口,一般 void* 类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。使得⼀个函数来处理多种类型的数据。

        举例如下:

struct Stu //学⽣
{char name[20];//名字int age;//年龄
};
//假设按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//strcmp - 是库函数,是专⻔⽤来⽐较两个字符串的⼤⼩的
//假设按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//按照年龄来排序
void test2()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}
//按照名字来排序
void test3()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{test2();test3();return 0;
}

c.const修饰的指针变量

        ⼀般来讲const修饰指针变量,可以放在*的左边,也可以放在*的右边,意义是不一样的

int * p;//没有const修饰
int const * p;//const 放在*的左边做修饰
int * const p;//const 放在*的右边做修饰
c.1 const放在*号左边

由例子可以看出const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变

c.2 const放在*号右边

由例子可以看出const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变

二、指针运算

a.指针+-整数

因为数组在内存中是连续存放的,只要知道第一个元素的地址,就能找到后面的所有元素。(逻辑上连续同样可以,链表就是很好的例子

那么对于数组的遍历我们可以使用指针来完成:

#include <stdio.h>
//指针+- 整数
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", *(p + i));//p+i 这⾥就是指针+整数}return 0;
}

我们观察上述代码可以发现,其实 a[ i ] == *(p + i) ,而数组名又代表首元素地址(此时),那么则a[ i ]  == *(a + i),事实也确实如此。

我们通过 p + i 的方式得到了数组每一个元素的地址,而数组每一个元素都是一个int类型,那么也就意味着,每次 p + i 都使得指针跳动( sizeof(int)* i )个字节,其余类型也同理,不是想当然的跳过 i 个字节。

b.指针 - 指针

指针 - 指针实际上可以得到两个指针间元素个数,当然这是在同一逻辑空间内的(数组),其他非逻辑空间没有意义(随意两指针)。

//指针-指针
#include <stdio.h>
int my_strlen(char* s)
{char* p = s;while (*p != '\0')p++;return p - s;
}
int main()
{printf("%d\n", my_strlen("abc"));return 0;
}

c.指针的关系运算

指针是可以区分大小的,高地址位的指针大于低地址位的指针,存放相同地址的指针变量的指针相同。

//指针的关系运算
#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);while (p < arr + sz) //指针的⼤⼩⽐较{printf("%d ", *p);p++;}return 0;
}

上例就用了 arr + sz 作为while循环结束的条件,arr + sz 指向了数组最后一个元素的下一个元素,当 p 指向 arr + sz 时,即 p == arr + sz 时,循环停止。

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

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

相关文章

【Python】pandas的loc使用方法

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 当你处理数…

【学习】软件测试中如何进行Web网页兼容性测试

在数字时代&#xff0c;Web网页作为信息传递和交流的重要平台&#xff0c;其稳定性和用户体验至关重要。如同一位匠人细致打磨他的工艺品&#xff0c;开发者亦需精心测试网页的兼容性&#xff0c;确保其在各种设备和浏览器上的表现无懈可击。今天&#xff0c;我们就来探讨如何对…

SpringBoot+百度地图+Mysql实现中国地图可视化

通过SpringBoot百度地图Mysql实现中国地图可视化 一、申请百度地图的ak值 进入百度开发者平台 编辑以下内容 然后申请成功 二、Springboot写一个接口 确保数据库里有数据 文件目录如下 1、配置application.properties文件 #访问端口号 server.port9090 # 数据库连接信息 spr…

如何高效管理自己的时间,可以从这几个方向着手

如果你是上班族&#xff0c;天选打工人&#xff0c;你的绝大多数时间都属于老板&#xff0c;能够自己支配的时间其实并不多&#xff0c;所以你可能察觉不到时间管理的重要性。 但如果你是自由职业者或者创业者&#xff0c;想要做出点成绩&#xff0c;那你就需要做好时间管理&am…

ImageButton src图片会照成内存泄露吗 会使native内存增加吗?

在Android开发中&#xff0c;ImageButton 是用来显示按钮的视图组件&#xff0c;它通常用于显示图标或图片。对于ImageButton使用的src属性&#xff08;即按钮上的图片&#xff09;通常不会导致内存泄漏&#xff0c;但是有几种情况可能会导致内存问题&#xff1a; 1. **不正确…

NVIDIA发布重磅AI创新,黄仁勋在COMPUTEX大会预示计算未来

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Facebook开户|Facebook广告投放指南

家人们中午好~今天的文章由我们帅气逼人的大帅哥Zoey为大家分享&#xff08;狗头&#xff09;~有想要通过Facebook广告掘金的家人们&#xff01;今天就跟大家分享一下Facebook广告投放的底层逻辑和实用技巧&#xff0c;帮助大家少走弯路&#xff0c;快速入门~ 基础知识&#x…

韶关学院携手泰迪智能科技“见习研学”活动圆满结束

为进一步深化校企合作&#xff0c;落实高校应用型人才培养。5月31日&#xff0c;韶关学院与广东泰迪智能科技股份有限公司联合开展学生企业见习活动。专业教师林思思以及来自韶关学院140名学生参与此次见习活动&#xff0c;泰迪智能科技培训业务部经理钟秋平、校企合作经理吴桂…

easy-es插入大数据报错 Connection is closed

easy-es报错描述 Caused by: java.lang.reflect.InvocationTargetException: nullat sun.reflect.GeneratedMethodAccessor198.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Metho…

kafka,RocketMq,Pulsar对比

1、陆续地在工作中&#xff0c;用到了这三个消息组件&#xff0c;然而原来用过的慢慢就忘记了

网络编程介绍(二)(端口、通信协议)

端口 标记正在计算机设备上运行的应用程序的&#xff0c;被规定为一个 16 位的二进制&#xff0c;范围是 0~65535 。 分类 周知端口&#xff1a; 0~1023 &#xff0c;被预先定义的知名应用占用&#xff08;如&#xff1a; HTTP 占用 80 &#xff0c; FTP 占用 21 &#xff…

Python正则表达式多行匹配:深入探索与实践

Python正则表达式多行匹配&#xff1a;深入探索与实践 在Python编程中&#xff0c;正则表达式是一种强大的文本处理工具&#xff0c;用于匹配和操作复杂的字符串模式。其中&#xff0c;多行匹配是正则表达式应用中的一个重要场景&#xff0c;它允许我们在跨越多行的文本中查找…

git 基于某个提交号更新代码

场景&#xff1a;版本有严重缺陷&#xff0c;需要进行回退&#xff0c;找不到上一次发布的包&#xff0c;又不想进行回退代码进行发布&#xff0c;可以基于上一次发布版本的提交号进行发布。 git 基于某个提交号更新代码 要基于某个特定的提交&#xff08;commit&#xff09;…

Spring异步任务@Async的默认线程池执行器是如何初始化的

Spring异步任务Async的默认线程池执行器&#xff0c;是从哪里来&#xff1f;是如何初始化的&#xff1f; 结论先行 异步任务Async的默认线程池执行器是通过TaskExecutionAutoConfiguration#applicationTaskExecutor自动注入的。 异步任务的线程池执行器是如何初始化的&#…

NextJS延迟加载字体

在定义 font-face 的 CSS 中&#xff0c;如果浏览器解析到该规则&#xff0c;它会立即尝试加载指定的字体文件&#xff0c;而不等待 JavaScript 的执行。这意味着在没有调用 JavaScript&#xff08;如 Font Face Observer&#xff09;之前&#xff0c;浏览器会自动加载 font-fa…

Python攻防入门:揭秘安全与风险之舞

Python攻防入门&#xff1a;揭秘安全与风险之舞 Python&#xff0c;作为一门广泛应用的编程语言&#xff0c;既被无数开发者用于构建各类应用程序&#xff0c;也成为安全领域攻防双方的重要工具。本文将带领读者走进Python攻防的世界&#xff0c;从四个方面、五个方面、六个方…

【Java数据结构】详解Stack与Queue(二)

&#x1f512;文章目录: 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.栈的应用场景 2.1逆序打印链表 2.2逆波兰表达式求值 2.3括号匹配 2.4出栈入栈次序匹配 2.5最小栈 3. 栈 虚拟机栈 栈帧的区别 4.总结 1.❤️❤️前言~&#x1f973…

零基础构建基于LangChain的聊天机器人(6)

之前的文章&#xff1a; 零基础构建基于LangChain的聊天机器人(1)零基础构建基于LangChain的聊天机器人(2)零基础构建基于LangChain的聊天机器人(3)零基础构建基于LangChain的聊天机器人(4)零基础构建基于LangChain的聊天机器人(5) 设计聊天机器人 现在已经了解了业务需求、数…

关于实习中git的使用

小小实习生,给公司共享了代码,但是还没人审核,所以先创一个test分支 git add . git commmit git push --set-upstream origin niutest 先创建这么个测试环境,等到有人审核通过了,再进行合并 公司的git流程大致是: 开发一个新功能 1.建立一个对应的feat-chat 分支 git…

python-画矩形

题目描述 根据输入的四个参数&#xff1a;a,b,c,f 参数&#xff0c;画出对应的矩形。 前两个参数a,b 为整数&#xff0c;依次代表矩形的高和宽&#xff1b; 第三个参数c 是一个字符&#xff0c;表示用来填充的矩形符号&#xff1b; 第四个参数f 为整数&#xff0c;0 代表空心&a…