<p>指针运算的核心规则是“指针类型决定步长”,即指针加减整数时按其所指数据类型的大小进行偏移,而非简单的地址数值加减;例如int指针加1会增加4字节(假设int为4字节),char指针加1则增加1字节,因此ptr + n的实际地址变化为n * sizeof(所指类型);这种机制使得指针能正确遍历数组元素,如int数组首地址为0x1000时,p + 1指向0x1004,p + 2指向0x1008;同类型指针可相减得到其间元素个数,如&arr[3] - &arr[1]结果为2,表示相隔两个int元素;但指针之间不能相加,因无实际意义且被编译器禁止;理解类型决定步长是掌握指针算术的关键所在。</p>

指针运算的核心规则和地址加减的实际含义,关键在于理解“指针类型决定步长”这一点。它不是简单的数值加减,而是基于数据类型大小的偏移。
指针与整数的加减运算
当你对指针进行加减一个整数的操作时,比如
ptr + n
ptr - n
n
ptr + n
ptr
n
n * sizeof(指针所指向的数据类型)
ptr - n
ptr
n
n * sizeof(指针所指向的数据类型)
实际含义与例子
这种设计的目的是让指针能够方便地遍历数组或访问连续内存中的同类数据。加减运算的结果是另一个指向同类型数据的指针。
假设有一个
int
int arr[5] = {10, 20, 30, 40, 50};int *p = arr;
p
arr[0]
p + 1
arr[1]
p
0x1000
int
p + 1
0x1000 + (1 * 4) = 0x1004
p + 2
arr[2]
0x1000 + (2 * 4) = 0x1008
p - 1
arr[-1]
0x1000 - (1 * 4) = 0x0FFC
不同类型指针的步长
不同数据类型大小不同,因此指针加减的“步长”也不同。
指针**:
通常占 1 字节。
指针**:
通常占 2 字节。
指针**:
通常占 4 字节。
指针**:
通常占 8 字节。
指针之间的减法
两个同类型指针可以相减(
ptr1 - ptr2
ptrdiff_t
&arr[3] - &arr[1]
2
int
2 * sizeof(int) = 8
int
指针之间的加法
两个指针不能直接相加(
ptr1 + ptr2
基本上就这些,理解“类型决定步长”是掌握指针算术的关键。
以上就是指针运算有哪些规则 地址加减运算的实际含义的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号