【理解指针(1)】

理解指针(1)

  • 1·什么是内存
  • 2·指针变量和地址
    • 2·1 取地址操作符(&)
    • 2·2 指针变量
    • 2·3 解引用操作符(*)
    • 2·4 指针变量的大小
  • 3·指针变量的意义
    • 3·1指针的解引用
    • 3·2 指针加减整数
    • 3·3 void* 指针
  • 4. const 修饰指针
    • 4·1 const 修饰变量
    • 4·2 const 修饰指针变量

1·什么是内存

我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,其实也是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。每个内存单元也都有⼀个编号有了这个内存单元的编号,CPU就可以快速找到一个内存空间。
在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起了新的名字叫:指针。
所以我们可以理解为:

内存单元的编号=地址=指针

2·指针变量和地址

2·1 取地址操作符(&)

比如,我们现在创建一个整形变量n,想要知道n的地址,就可以用到取地址操作符。

#include<stdio.h>
int main()
{
	int n = 20;
	printf("%p", &n);
	return 0;
}

这里的&n就是取出n的地址,%p是算地址的操作符。

最后我们可以获得 n的地址:

在这里插入图片描述

&n取出的是a所占4个字节中地址较小的字节的地址。

2·2 指针变量

当我们通过取地址操作符拿到的地址是一个数值,这时候我们需要把这个数值储存起

来就需要储存在指针变量中。

#include<stdio.h>
int main()
{
	int a = 20;
	int* p = &a; 
	
	//取出a的地址储存在指针变量p中
	
	return 0;
}

指针变量也是变量,用来存放地址的。

我们看上面的例子,p的类型是int **说明p是指针变量,而int说明p是指向整形类型的对象。

2·3 解引用操作符(*)

C语⾔中,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象。因此需要用到解引用操作符(*)。

#include<stdio.h>
int main()
{
	int a = 20;
	int* p = &a;
	printf("%d\n", a);
	*p = 30;
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述

*p是指通过p存放的地址,找到指向的空间。*p其实就是a变量,由例子可以直观的看出,当没有*p = 30;这一行之前,a的值就是20,当给*p重新赋值后,a的值就发生了改变,由这个我们也可以得出*p=a这个结论。

2·4 指针变量的大小

• 32位平台下地址是32个bit位,指针变量⼤⼩是4个字节。

• 64位平台下地址是64个bit位,指针变量⼤⼩是8个字节。

在这里插入图片描述

同样的代码在不同的平台下,指针变量大小都不一样,由此我们可以知道 :指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,大小都是相同的。

3·指针变量的意义

3·1指针的解引用

在这里插入图片描述

上面两个例子,我们经过调试后可以发现左边的例子将a的4个字节全部改为1,而右边
的例子将a的一个字节改为了1,所以我们可以得到一个结论:指针的类型决定了,对
指针解引用的时候有多大的权限(⼀次能操作几个字节)。

3·2 指针加减整数

#include<stdio.h>
int main()
{
	int a = 20;
	int* p = &a;
	char* pa = (char)&a;
	printf("%p\n", p);
	printf("%p\n", p+1);
	printf("%p\n", pa);
	printf("%p\n", pa+ 1);
	return 0;
}

在这里插入图片描述
上面的例子是指针类型差异带来的变化。结论:指针的类型决定了指针向前或者向后走⼀步有多大(距离)。

3·3 void* 指针

这种类型的指针可以⽤来接受任意类型地址。
但是也有局限性, void* 类型的指针不能直接进行指针的**±整数**和解引用的运算。

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

在这里插入图片描述
我们可以看到错误原因,但是我们使用void*类型就不会有这个错误原因。

#include<stdio.h>
int main()
{
	int a = 10;
	void* p = &a;
	void* pa = &a;
	*p = 20;
	*pa = 0;
	return 0;
}

在这里插入图片描述
由上面两个例子我们可以知道 void* 类型的指针可以接收不同类型的地址,但是无法直接进行指针运算。

4. const 修饰指针

4·1 const 修饰变量

变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。
但如果我们想要给变量加上一些限制,不让它被修改,这样的话,我们就可以用到const

在这里插入图片描述
因为const已经给m加上限制了,所以,m不能像上面的n 那样重新赋值。

4·2 const 修饰指针变量

将const 放在*左边和右边的意义都不一样。

int const * p=&a;//放在*左边
int* const p=&a;//放在*右边

当我们把*放在左边:

在这里插入图片描述

const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。

在这里插入图片描述
const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

(由于指针的内容很多,所以后期还会用的。(。•ˇ‸ˇ•。)!!!)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

和数软件:区块链技术的爆发与冲击

什么是区块链&#xff1f;它是如何发展而来的&#xff1f;应用在哪些领域&#xff1f;将会对我国的社会经济产生哪些重大影响&#xff1f; 什么是区块链 区块链作为一种底层技术&#xff0c;最早的实践是数字货币。根据最早的中本聪定义&#xff0c;区块链实质上是一种基于网…

202109 CSP认证 | 脉冲神经网络

3. 脉冲神经网络 好久之前第一次写的时候完全对第三题没感觉&#xff0c;提交上去得了个0 分… 这次自己再写了一遍&#xff0c;花的时间不多&#xff0c;写的时候感觉逻辑也不是特别难。最后是超时了&#xff0c;感觉第三题开始涉及到优化了&#xff0c;不仅仅是暴力模拟就可以…

纪年哥的文物挽救木牌

左&#xff08;江南制造局&#xff0c;曾国藩书天道酬勤&#xff0c;李鸿章少荃印&#xff0c;光绪三十四年制造&#xff09; 中&#xff08;汉阳兵工厂&#xff0c;民国二十六年制造&#xff0c;公元1937年七月七日&#xff0c;抗日战争全面爆发&#xff09; 右&#xff08;…

二 centos 7.9 磁盘挂载

上一步 一 windso10 笔记本刷linux cent os7.9系统-CSDN博客 笔记本有两个盘,系统装在128G的系统盘上,现在把另外一个盘挂载出来使用 lsblk 发现磁盘已经分好了,直接挂载就好了,参考文章:Centos7.9 挂载硬盘_centos7.9挂载硬盘-CSDN博客 永久挂载 lsblk -f分区格式化 mkfs…

upload-labs通关记录

文章目录 前言 1.pass-012.pass-023.pass-034.pass-045.pass-056.pass-067.pass-078.pass-089.pass-0910.pass-1011.pass-1112.pass-1213.pass-1314.pass-1415.pass-1516.pass-1617.pass-1718.pass-1819.pass-19 前言 本篇文章记录upload-labs中&#xff0c;所有的通过技巧和各…

首席翻译张璐老师,今年见不到了

她是我的偶像&#xff0c;张璐&#xff0c;连续多年在重量级会议上担任翻译。 2010年&#xff0c;张璐作为翻译出现&#xff0c;是五年来国家级媒体发布会首次起用女翻译。 2011年3月14日的媒体发布会。张璐再任会议翻译。 2012年的媒体发布会&#xff0c;张璐任翻译。 2013年&…

制定一份完美的测试计划,让您的产品质量更上一层楼!

大家好&#xff0c;我是彭于晏。今天学习测试计划如何书写。 虽然很多人日常工作中都知道测试计划是什么&#xff0c;但是写好测试计划&#xff0c;其实并不容易。今天就来一起学习下测试计划如何书写。 什么是测试计划&#xff1f; 测试计划是一份为软件产品所准备的详细文档…

帮管客CRM jiliyu接口存在SQL漏洞 附POC软件

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 帮管客CRM简介 微信公众号搜索:南风漏洞复现文库…

yolo模型中神经节点Mul与Sigmoid 和 Conv、Concat、Add、Resize、Reshape、Transpose、Split

yolo模型中神经节点Mul与Sigmoid 和 Conv、Concat、Add、Resize、Reshape、Transpose、Split 在YOLO&#xff08;You Only Look Once&#xff09;模型中&#xff0c;具体作用和用途的解释&#xff1a;

接口自动化测试从入门到高级实战!

接口测试背景和必要性 接口测试是测试系统组件间接口&#xff08;API&#xff09;的一种测试&#xff0c;主要用于检测内部与外部系统、内部子系统之间的交互质量&#xff0c;其测试重点是检查数据交换、传递的准确性&#xff0c;控制和交互管理过程&#xff0c;以及系统间相互…

深入浅出计算机网络 day.1 概论③ 电路交换、分组交换和报文交换

人无法同时拥有青春和对青春的感受 —— 04.3.9 内容概述 01.电路交换、分组交换和报文交换 02.三种交换方式的对比 一、电路交换、分组交换和报文交换 1.电路交换 计算机之间的数据传送是突发式的&#xff0c;当使用电路交换来传送计算机数据时&#xff0c;其线路的传输效率一…

Rust教程:How to Rust-从开始之前到Hello World

本文为第0篇 专栏简介 本专栏是优质Rust技术专栏&#xff0c;推荐精通一门技术栈的蟹友&#xff0c;不建议基础的同学&#xff08;无基础学Rust也是牛人[手动捂脸]&#xff09; 感谢Rust圣经开源社区的同学&#xff0c;为后来者提供了非常优秀的Rust学习资源 本文使用&…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Image)

Image为图片组件&#xff0c;常用于在应用中显示图片。Image支持加载PixelMap、ResourceStr和DrawableDescriptor类型的数据源&#xff0c;支持png、jpg、jpeg、bmp、svg、webp和gif类型的图片格式。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&am…

【C/C++】常量指针与指针常量的深入解析与区分(什么是const int * 与 int * const ?)

目录 一、前言 二、const 的简单介绍 三、常量指针 &#x1f50d;介绍与分析 &#x1f4f0;小结与记忆口诀 四、指针常量 &#x1f50d;介绍与分析 &#x1f4f0;小结与记忆口诀 五、总结与提炼 六、共勉 一、前言 在【C/C】的编程中&#xff0c;指针与const关键字的组合…

大模型笔记:幻觉 hallucination

1 介绍 “幻觉” (Hallucination)&#xff0c;指模型生成自然流畅&#xff0c;语法正确但实际上毫无意义且包含虚假信息即事实错误的文本&#xff0c;以假乱真&#xff0c;就像人产生的幻觉一样。 举个例子就是&#xff0c;即使现在的chatgpt-4&#xff0c;你问他一些有确切…

面向切面编程(AOP)介绍(横切关注点、通知(增强)、连接切入点、切面)

1. 面向切面编程思想AOP AOP&#xff1a;Aspect Oriented Programming面向切面编程 AOP可以说是OOP&#xff08;Object Oriented Programming&#xff0c;面向对象编程&#xff09;的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构&#xff0c;用于模拟公…

Qt 实现诈金花的牌面值分析工具

诈金花是很多男人最爱的卡牌游戏 , 每当你拿到三张牌的时候, 生活重新充满了期待和鸟语花香. 那么我们如果判断手中的牌在所有可能出现的牌中占据的百分比位置呢. 这是最终效果: 这是更多的结果: 在此做些简单的说明: 炸弹(有些地方叫豹子) > 同花顺 > 同花 > 顺…

CSS3基础2

CSS3 用户界面 resize 示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

Oracle LeetCode 高频 SQL 50 题(进阶版)

https://leetcode.cn/studyplan/sql-premium-50/ 一、查询 1821. 寻找今年具有正收入的客户 selectcustomer_id from Customers where year 2021 group by customer_id having sum(revenue) > 0183. 从不订购的客户 select c.name as Customers from Customers c left j…

Windows-Wireguard-Watchdog,Wireguard服务端DDNS客户端自动重连

Windows-Wireguard-Watchdog 背景&#xff1a;Wireguard服务端是动态IP&#xff0c;Wireguard客户端配置的服务端地址是域名 Endpoint xx.xxx.com:51820&#xff0c;写的DDNS脚本检测到IP变更会自动更新域名解析。每次宽带重拨IP就会变更&#xff0c;由于客户端重连使用的不是…