指针运算
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 9 课,共 63 课。
你已经学会了如何使用 *(array + i) 这样的指针表示法访问数组元素。现在,你将了解一种更强大的技术:指针运算,它可以让你通过简单的递增和递减操作在内存中移动指针。
使用 ++ 递增指针或使用 -- 递减指针时,指针移动的并不只是 1 个字节,而是按它所指向的数据类型的大小移动。对于整数指针,ptr++ 会向前移动 sizeof(int) 个字节,正好指向内存中的下一个整数。
int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // 指向第一个元素(10)
ptr++; // 现在指向第二个元素(20)
ptr++; // 现在指向第三个元素(30)这种自动计算大小的方式,让指针算术变得非常强大且方便。你不必担心字节计算,C 会根据指针的数据类型为你处理内存寻址。
指针运算在循环中遍历数组时特别有用。你可以递增指针,依次访问每个元素,而不是使用数组索引,这通常能让代码更高效。
挑战
简单编写一个 C 程序,通过递增指针来遍历和处理数组,以演示指针算术。程序应完成以下操作:
- 声明一个名为
data、包含 5 个元素的整数数组,并将其初始化为 {12, 24, 36, 48, 60} - 声明一个名为
ptr的整数指针,并将其初始化为指向数组的第一个元素 - 使用一个运行 5 次的 for 循环,仅使用指针算术遍历整个数组
- 在循环中:
- 使用解引用运算符打印
ptr指向的当前值 - 使用
%p格式说明符打印ptr中存储的内存地址 - 使用
ptr++递增指针,使其指向下一个元素
- 使用解引用运算符打印
- 循环结束后,将
ptr重置为指向数组的第一个元素 - 使用指针算术,通过
*(ptr + 2)直接访问并打印第三个元素(索引 2) - 使用指针算术,通过
*(ptr + 4)直接访问并打印最后一个元素(索引 4)
输出应按以下格式显示结果:
Value: 12, Address: [address]
Value: 24, Address: [address]
Value: 36, Address: [address]
Value: 48, Address: [address]
Value: 60, Address: [address]
Third element: 36
Last element: 60这个挑战将检验你对指针递增操作如何根据数据类型的大小自动移动的理解,以及你如何使用指针算术,从基准指针位置的特定偏移处访问数组元素。
亲手试试
#include <stdio.h>
int main() {
// TODO: 在这里编写你的代码
// 声明并初始化数组 'data',值为 {12, 24, 36, 48, 60}
// 声明指针 'ptr',并将其初始化为指向第一个元素
// 使用 for 循环和指针运算遍历数组
// 打印每个值及其地址,然后递增指针
// 重置指针,并使用指针运算访问指定元素
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器