【C语言】指针详解(二)

news2024/12/24 15:09:03

目录

1.指针变量类型的意义

1.1指针的解引用

1.2指针 +  - 整数

1.3void*指针

2.const修饰指针

2.1const修饰变量

2.2const修饰指针变量


1.指针变量类型的意义

1.1指针的解引用

指针变量的大小和类型无关,只要是指针变量,在同一个平台下,大小都是一样的,为什么还要有各种各样的指针类型呢?

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

//代码1
#include<stdio.h>
int main()
{
	int a = 0x11223344;
	int* p = &a;
	*pa = 0;
	return 0;
}

代码2
#include<stdio.h>
int main()
{
	int a = 0x11223344;
	char* p = (char*) & a;
	*pa = 0;
	return 0;
}

 

 

⭐调试我们可以看到,代码1会将a的4个字节全部改为0,但是代码2只是将a的第一个字节改为0。

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

1.2指针 +  - 整数

先看一段代码,调试观察地址的变化。

代码运行结果如下

int main()
{
	int n = 10;
	char* pc = (char*)&n;
	int* pi = &n;

	printf("&n  =%p\n", &n);
	printf("pc  =%p\n", pc);
	printf("pc+1=%p\n", pc+1);
	printf("pi  =%p\n", pi);
	printf("pi+1=%p\n", pi+1);
	return 0;
}

 

⭐我们可以看出,char*类型的指针变量+1跳过1个字节,int*类型的指针变量+1跳过了4个字节。这就是指针变量的类型差异带来的变化。
🔺结论:指针的类型决定了指针向前或者向后走一步有多大(距离)。

1.3void*指针

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

举例:

int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = &a;
	return 0;
}

 在上面的代码中,将一个int类型的变量的地址赋值给一个char*类型的指针变量。编译器给出了一个警告(如下图),是因为类型不兼容。而使用void*类型就不会有这样的问题

int main()
{
	int a = 10;
	void *pa = &a;
	void *pc = &a;
	
	*pa = 10;
	*pc = 0;
	return 0;
}

 

这里我们可以看到,void*类型的指针可以接收不同类型的地址,但是无法直接进行指针运算。

那么void*类型的指针到底有什么用呢?
一般void*类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。使得一个函数来处理多种类型的数据。

2.const修饰指针

2.1const修饰变量

变量是可以修改的,如果把变量的地址交给一个指针变量,通过指针变量的也可以修改这个变量。但是如果我们希望一个变量加上一些限制,不能被修改,怎么做呢?这就是const的作用。

int main()
{
	int a = 10;
	a = 0;//a是可以修改的
	const int b = 20;
	b = 0;//b是不可修改的
}

上述代码中b是不能被修改的,其实b本质是变量,只不过被const修饰后,在语法上加了限制,只要我们在代码中对b进行修改,就不符合语法规则,就报错,致使没法直接修改n。


但是如果我们绕过n,使用n的地址,去修改n就能做到了,虽然这样做是在打破语法规则

如下代码:

int main()
{
	const int b = 20;
	int* pa = &b;
	*pa = 0;
	printf("%d", b);
}

 此时可以看到通过指针我们成功修改了b的值

我们可以看到这里b确实修改了,但是我们还是要思考一下,为什么b要被const修饰呢?就是为了不能被修改,如果p拿到b的地址就能修改b,这样就打破了const的限制,这是不合理的,所以应该让p拿到b的地址也不能修改b,那接下来怎么做呢?

2.2const修饰指针变量

void test1()
{
	int n = 10;
	int m = 20;
	int* p = &n;
	*p = 20;//ok?
	p = &m;//ok?
	//在这里无论是通过*p修改n的值,亦或是修改指针变量p的值都是可以的。
}
void test2()
{
	int n = 10;
	int m = 20;
	const int* p = &n;
	*p = 20;//ok?
	p = &m;//ok?
	//这里我们用const修饰*p,此时发现无法通过*p修改n的值,但是依然可以修改指针变量p的值。
}
void test3()
{
	int n = 10;
	int m = 20;
	int* const p = &n;
	*p = 20;//ok?
	p = &m;//ok?
	//这里我们用const修饰p,此时发现依然可以通过*p修改变量n的值。但是无法修改指针变量p的值。
}
void test4()
{
	int n = 10;
	int m = 20;
	const int* const p = &n;
	*p = 20;//ok?
	p = &m;//ok?
	//这里我们用const修饰p和*p,此时发现既不能通过*p修改变量n的值。也无法修改指针变量p的值。
}

结论: const修饰指针变量的时候
const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变。
const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

 以上便是我为大家带来的指针详解(二)的内容,若有不足,望各位大佬在评论区指出,谢谢大家!可以留下你们点赞、收藏和关注,这是对我极大的鼓励,我也会更加努力创作更优质的作品。再次感谢大家!  

 

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

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

相关文章

技术人的年终总结报告,请笑纳

背景 年底了&#xff0c;部门间&#xff0c;小组间不可避免的需要写年终总结报告。我相信很多朋友这件事肯定比较反感。认为这些东西都是表面形式&#xff0c;没有任何意义&#xff1b;亦或对于专心搞开发的人&#xff0c;对于这种报告并不擅长&#xff0c;不知道如何下手&…

openGuass:极简版安装

目录 一、openGauss简介 二、初始化安装环境 1.创建安装用户 2.修改文件句柄设置 ​3.修改SEM内核参数 4.关闭防火墙 6.禁用SELINUX 7.安装依赖软件 8.重启服务器 三、安装数据库 1.下载安装包 2.创建安装目录 3.解压安装包 4.执行安装 5.验证安装 四、gsql工具…

stm32DMA

DMA 文章目录 DMADMA简介DMA功能框图DMA请求DMA请求通道 **仲裁器** DMA 数据配置从哪里来到哪里去外设到存储器存储器到外设存储器到存储器 DMA初始化结构体讲解配置DMA TO P(外设)代码例子 DMA简介 DMA(Direct Memory Access)—直接存储器存取&#xff0c;是单片机的一个外设…

TCP/IP 传输层协议

传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP&#xff08;Transmission Control Protocol&#xff09;和用户数据包协议UDP&#xff08;User Datagram Protocol&#xff09;。 TCP协议 TCP是一种面向连接的传输层协议&#…

2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会成功举办

12月16日&#xff0c;2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会于北京西郊宾馆成功举办。活动吸引了来自行业内众多一流专家、学者参与&#xff0c;共同探讨和展示了他们在智能运维领域的最新研究成果和技术应用&#xff0c;为智能运维技术的学术研究、生产实…

【计算机网络】TCP心跳机制、TCP粘包问题

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多计算机网络知识专栏&#xff1a;计算机网络&#x1f525; 给大家跳段…

低代码和纯代码:双向奔赴,共创未来ing……

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0c;…

工业缺陷检测深度学习方法综述——学习笔记(评价:这篇华科大的文章错误百出,学术一点都不严谨,别误人子弟了好吧。。。)

文章目录 摘要1 引言2 问题定义与研究现状2.1 问题定义2.2 问题难点与挑战2.2.1 数据难点2.2.2 任务挑战 2.3 研究概述 3 检测算法3.1 缺陷模式已知3.1.1 传统方法简述3.1.2 深度学习方法 3.2 缺陷模式未知3.2.1 传统方法简述3.2.2 深度学习方法(1) 基于图像相似度的方法(i) 基…

芋道前端框架上线之后发现element-ui的icon图标全部乱码

前言 最近发现线上有人反映图标全部是乱码&#xff0c;登录上去看确实乱码&#xff0c;刷新就好最后一顿搜&#xff0c;发现是sass版本不兼容导致的图标乱码问题 解决办法 1.先把sass升级到1.39.0 2.来到vue.config.js文件配置代码-如果是芋道前端框架不用配置自带 css: {lo…

I.MX6ULL_Linux_驱动篇(48)linux I2C驱动

I2C 是很常用的一个串行通信接口&#xff0c;用于连接各种外设、传感器等器件。本章我们来学习一下如何在 Linux 下开发 I2C 接口器件驱动&#xff0c;重点是学习 Linux 下的 I2C 驱动框架&#xff0c;按照指定的框架去编写 I2C 设备驱动。本章同样以 I.MX6U-ALPHA 开发板上的 …

一些错误的集合

目录 第一章、1.1&#xff09;前端找不到图片1.2&#xff09;1.3&#xff09;1.4&#xff09; 第二章、2.1&#xff09;2.2&#xff09;2.3&#xff09; 第三章、3.1&#xff09;3.2&#xff09;3.3&#xff09; 第四章、4.1&#xff09;4.2&#xff09;4.3&#xff09; 友情提…

ZKP Pasta Curves

Mina book[https://o1-labs.github.io/proof-systems/specs/pasta.html?highlightpasta#pasta-curves]学习笔记 Pasta Curves Pasta Curves is a fascinating innovation in cryptography designed by Zcash. What are the Pasta Curves The Pasta Curves are a pair of e…

走过的2023:在挑战中领悟,在仿徨中成长

转眼间就到了2023年的最后一个月&#xff0c;回顾这短暂而又有意义的一年&#xff0c;可以用12个字总结&#xff1a;在挑战中领悟&#xff0c;在仿徨中成长。这篇文章我会从技术成长、职场生活、读书感悟和个人生活等几个方面&#xff0c;总结一下过去的这一年&#xff0c;梳理…

视觉设计必备!这6款工具让你事半功倍!

视觉设计师是做什么的 不同类型的行业将聘请视觉设计师&#xff0c;工作内容可能涉及设计网站、游戏、电影和其他数字设计项目。通过以下关于视觉设计师的工作描述和薪酬描述&#xff0c;我们可以进一步了解视觉设计师。 视觉设计师职位描述&#xff1a; 遵循品牌指南&#…

WEB 3D技术 three.js rotation元素旋转控制

我们在官网中搜索 Euler 循环用的 就不是三维向量了 而是欧拉角对象 但欧拉角也是绕着某个轴进行旋转 我们有两个这样的元素 官网中的 order 比较特殊 它是先旋转完 x轴 然后旋转 y轴 最后旋转z轴 order也是它默认的值 一般来讲 我们用 就改 x y z就够了 order 一般不需要 …

基于Java+Vue+uniapp微信小程序大学生心理健康服务设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

DOM是什么?

1、概述 &#xff08;1&#xff09;DOM代表文档对象模型&#xff0c;是 HTML 和 XML 文档的接口&#xff08;API&#xff09; &#xff08;2&#xff09;当浏览器第一次读取&#xff08;解析&#xff09;HTML文档时&#xff0c;会创建一个基于 HTML 文档的大对象&#xff0c;…

js中的Array.from()和Array.of()方法的用法详情

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…

获取请求体中json数据并解析到实体对象

目录 相关依赖 前端代码 后端代码 测试结果 相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version> </dependency> <dependency><groupId>comm…

[软件] Image2LCD v4.0

介绍 通过打开图片, 可以提取图片的像素特征, 生成.c文件, 或者二进制文件等, 提供人们根据需要选择. 16位真彩色 每一个像素点需要用16位来表示, 分别是RGB, R: 5位 G: 6位, B: 5位, 共两个字节. 配置 tftLCD180显示屏, 官方给的参考代码, 需要如下所示设置.