2026-01-20
分类:服务器百科
阅读(8) 评论(0)
一、核心概念
地址:内存中每个字节的唯一编号(类似门牌号),64 位系统占 8 字节,32 位系统占 4 字节,以十六进制表示(如0x7ffeefbff5c4)。
指针:本质就是内存地址,是一个固定数值,用于指向对应内存空间。
指针变量:专门存储地址的变量(类似记录门牌号的本子),可修改存储的地址,进而访问不同内存数据。
二、关键操作符
&(取地址符):获取变量的内存首地址,语法&变量名,返回值为该变量地址,类型为 “指向该变量类型的指针”(例:int a=10; &a 得到a的地址,类型为int*)。
*(解引用符):通过地址访问内存数据,分两种场景:
- 读操作(右值):*指针变量,获取指针指向地址的内存数据(例:int* p=&a; *p 得到a的值 10)。
- 写操作(左值):*指针变量=数值,将数值写入指针指向的内存(例:*p=20 使a的值变为 20)。
互逆关系:*&a == a、&*p == p。
三、指针变量的定义与初始化
定义语法:数据类型 *指针变量名;
- 数据类型:指针指向的内存数据类型(如 int、char、double),决定指针运算偏移量和解引用访问内存大小。
- 注意:多个指针变量定义时,每个变量前需加*(例:int* p1, *p2;,避免写成int* p1, p2;,后者p2为普通 int 变量)。
- 常见示例:int* p;(指向 int)、char* str;(指向 char)、double* d_p;(指向 double)。
初始化(杜绝野指针):
- 指向已定义变量:int a=10; int* p=&a;(最常用,确保指向有效)。
- 初始化为空指针:int* p=NULL;(NULL 本质是 0,指向0x0不可读写地址,使用前需判断p!=NULL)。
- 指向连续内存:int arr[5]={1,2,3,4,5}; int* p=arr;(数组名arr是首元素地址)。
四、指针的核心特性
大小:与指向类型无关,仅由操作系统位数决定。64 位系统中所有指针变量均为 8 字节,32 位系统中均为 4 字节。
运算规则(地址偏移):
- 支持++、–、+、-运算,本质是地址偏移,偏移量 = 指向数据类型的大小。
- 示例:int* p(int 占 4 字节),p++偏移 4 字节;char* str(char 占 1 字节),str++偏移 1 字节;double* d_p(double 占 8 字节),d_p++偏移 8 字节。
五、核心实战场景
函数传址调用:
- 解决 “传值调用无法修改外部变量” 的问题,将变量地址传入函数,函数内部通过指针操作地址,直接修改外部变量。
- 价值:突破函数作用域限制,避免依赖全局变量(易混乱)或单个返回值(局限性)。
操作数组与字符串:
- 数组名是 “指向首元素的指针常量”(不可修改指向),指针偏移遍历数组比下标访问更高效,可直接指向数组任意位置,灵活性更高。
- 字符串是 “以\\0结尾的字符数组”,字符指针是主流操作方式,可灵活遍历、修改(针对可修改的字符数组)。
动态内存管理:
- 结合malloc、calloc等函数,程序运行时动态分配内存,函数返回分配内存的首地址,赋值给指针后操作,用完用free释放。
- 价值:解决数组大小固定的问题,适合数据量不确定的场景(如变长字符串、动态扩容数据集),是链表、栈、队列等复杂数据结构的基础。
评论前必须登录!
注册