指针操作:从到*的深度指南
目录
一、取地址操作符(&)
变量在内存中的存储特点:
二、指针变量和解引用操作符(*)
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
。使用指针的好处在于:
-
提供了另一种访问和修改变量的途径
-
使代码更加灵活
-
为后续学习指针的高级用法打下基础
4、关键对比
符号 | 上下文 | 含义 | 示例 |
---|---|---|---|
| 单目运算符 | 取地址 |
|
| 双目运算符 | 按位与 |
|
| 声明/单目运算符 | 解引用 |
|
| 双目运算符 | 乘法 |
|
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;
}
结论:
-
在32位系统中,地址采用32位表示(32个bit位),指针变量的大小为4字节
-
而在64位系统中,地址扩展为64位(64个bit位),相应的指针变量大小增至8字节。
-
指针变量的大小与其指向的数据类型无关,在相同平台下所有指针类型的大小都相同
注意:
-
指针的大小只与系统架构有关,与指针类型无关
-
在编写跨平台程序时需要注意指针大小的差异