当前位置: 首页 > news >正文

指针操作:从到*的深度指南

目录

一、取地址操作符(&)

变量在内存中的存储特点:

二、指针变量和解引用操作符(*)

1、指针变量

2、指针类型的解析

3、解引用操作符

4、关键对比

5、记忆技巧

& 的优先级

* 的上下文依赖

三、指针变量的大小

指针变量的大小取决于系统的寻址能力:

验证代码:

结论:

注意:


一、取地址操作符(&)

        理解了内存和地址的关系后,我们来看C语言中的具体实现。在C语言中创建变量其实就是向内存申请空间。例如:

#include <stdio.h>
int main()
{int a = 10;return 0;
}

        这段代码创建了一个整型变量a,内存中申请了4个字节的空间用于存放整数10。每个字节都有其唯一的地址,假设这4个字节的地址分别是:0x006FFD70、0x006FFD71、0x006FFD72、0x006FFD73

要获取变量a的地址,我们需要使用取地址操作符(&):

#include <stdio.h>
int main()
{int a = 10;printf("%p\n", &a); // 打印a的地址return 0;
}

        运行结果可能会输出类似006FFD70的地址值。需要注意的是,&a取出的是a所占4个字节中地址最小的那个字节的地址(即首地址)。

变量在内存中的存储特点

        虽然整型变量占用4个字节,但只要知道了第一个字节的地址,就可以通过这个地址访问到后续的3个字节,从而获取完整的整型数据。


二、指针变量和解引用操作符(*)

1、指针变量

        通过取地址操作符获取的地址(如0x006FFD70)是一个数值,有时我们需要存储这个地址以便后续使用。存储地址的变量称为指针变量。

示例:

#include <stdio.h>
int main()
{int a = 10;int *pa = &a; // 定义指针变量pa并存储a的地址return 0;
}

        指针变量是一种特殊的变量,专门用于存储内存地址。存储在指针变量中的值都会被解释为内存地址。

2、指针类型的解析

观察指针变量的定义int *pa

  • *表示pa是一个指针变量

  • int表示pa指向的是一个整型(int)类型的对象

对于不同类型的变量,需要使用相应类型的指针:

char ch = 'w';
char *pc = &ch; // pc是指向char类型的指针

3、解引用操作符

获取地址后,我们可以通过解引用操作符(*)来访问或修改该地址指向的值:

#include <stdio.h>
int main()
{int a = 100;int *pa = &a;*pa = 0; // 通过指针修改a的值return 0;
}

这里*pa = 0等价于a = 0。使用指针的好处在于:

  1. 提供了另一种访问和修改变量的途径

  2. 使代码更加灵活

  3. 为后续学习指针的高级用法打下基础

4、关键对比

符号

上下文

含义

示例

&

单目运算符

取地址

&a

&

双目运算符

按位与

a & b

*

声明/单目运算符

解引用

*p

*

双目运算符

乘法

a * b

5、记忆技巧

& 的优先级

  • 出现在赋值右侧时表示取地址
  • 出现在表达式中间时表示按位与

* 的上下文依赖

  • 在变量声明中(如 int *p)表示指针类型
  • 作为单目运算符时表示解引用
  • 在算术运算中表示乘法

三、指针变量的大小

        根据前面的内容我们知道,32位机器拥有32根地址总线。每根地址线输出的电信号转换为数字信号后为1或0,因此32根地址线产生的二进制序列就是一个地址,这个地址由32位组成,⼀个地址就是32个bit位,需要4个字节来存储。由于指针变量用于存储地址,因此指针变量的大小必须为4个字节。

        同理,在64位机器上,假设有64根地址线,一个地址就是由64位二进制数组成的序列,存储这样的地址需要8个字节的空间,因此64位机器上的指针变量大小为8个字节。所以:

指针变量的大小取决于系统的寻址能力:

  • 32位系统:地址总线是32位,因此地址需要4个字节存储

  • 64位系统:地址总线是64位,因此地址需要8个字节存储

验证代码:

#include <stdio.h>
int main()
{printf("%zd\n", sizeof(char *));printf("%zd\n", sizeof(short *));printf("%zd\n", sizeof(int *));printf("%zd\n", sizeof(double *));return 0;
}

结论

  1. 在32位系统中,地址采用32位表示(32个bit位),指针变量的大小为4字节

  2. 而在64位系统中,地址扩展为64位(64个bit位),相应的指针变量大小增至8字节。

  3. 指针变量的大小与其指向的数据类型无关,在相同平台下所有指针类型的大小都相同

注意:

  • 指针的大小只与系统架构有关,与指针类型无关

  • 在编写跨平台程序时需要注意指针大小的差异

http://www.dtcms.com/a/333490.html

相关文章:

  • JavaWeb开发_Day13
  • Cortex-Debug和openocd之间的关系?如何协同工作?
  • 《人形机器人的觉醒:技术革命与碳基未来》——触觉反馈系统:电子皮肤的概念、种类、原理及在机器中的应用
  • 攻防世界—fakebook(两种方法)
  • docker重启或系统重启后harbor自动启动
  • 深入理解C++正则表达式:从基础到实践
  • ReasonRank:从关键词匹配到逻辑推理,排序准确性大幅超越传统方法
  • Apifox接口测试工具
  • Unity输入系统:旧版Input_System
  • 第四章:大模型(LLM)】06.langchain原理-(3)langchain 数据连接方法
  • kubernetes(4) 微服务
  • 前往中世纪 送修改器(Going Medieval)免安装中文版
  • AI大模型配置项
  • 【mysql数据库全部重点知识】
  • 企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
  • 昆仑万维重磅发布Mureka V7.5与MoE-TTS,AI音乐与语音合成再升级!
  • 嵌入式学习 day52 IMX6ULL裸机开发-I2C
  • 基于Spring Boot的智能民宿预订与游玩系统设计与实现 民宿管理系统 民宿预订系统 民宿订房系统
  • 蓝桥杯 二叉树
  • [ CSS 前端 ] 网页内容的修饰
  • linux下找到指定目录下最新日期log文件
  • liteflow
  • CSS从入门到精通完整指南
  • 【学习笔记】Java并发编程的艺术——第8章 Java中的并发工具类
  • Python工具箱系列(六十二)
  • 写作在学习中的重要性
  • 【完整源码+数据集+部署教程】脑部健康状态检测系统源码和数据集:改进yolo11-AIFI
  • 力扣top100(day04-05)--堆
  • **标题:发散创新之力,探索隐私计算的未来**隐私计算,作为当下数字化时代的热门话题,正受
  • MCP简单入门及简单操作案例(高德地图调用实现酒店查询天气查询等[Lima]示范)