解引用与指针运算
通过指针读取内存,并使用指针运算遍历数组
解引用与指针运算 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
通过指针读取
一元 * 运算符会读取指针所指向的值。
int x = 42;
int* p = &x;
std::cout << *p; // 42通过指针写入
您也可以在赋值语句的左侧使用 *p,向目标写入值。
*p = 100;
std::cout << x; // 100箭头运算符
对于指向结构体或类的指针,p->member 是 (*p).member 的简写。请使用箭头,这是约定用法。
struct Point { int x, y; };
Point pt{3, 4};
Point* p = &pt;
std::cout << p->x; // 3指针算术基础
您可以对指针加减整数。结果以元素大小为步长移动,而不是以字节为步长。
int a[5] = {10, 20, 30, 40, 50};
int* p = a; // points to a[0]
p = p + 2; // now points to a[2]
std::cout << *p; // 30遍历数组
指针算术可以模拟索引操作。a[i] 和 *(a + i) 完全相同,而且 p[i] 可用于任何指针。
int a[] = {1, 2, 3, 4};
int* p = a;
for (int i = 0; i < 4; ++i) {
std::cout << *(p + i) << " ";
}两个指针之差
对同一数组中的两个指针做减法,会得到它们之间相隔的元素数量,类型为 std::ptrdiff_t。
int a[5];
int* first = a;
int* last = a + 5;
std::ptrdiff_t len = last - first; // 5比较指针
您可以使用 == 和 != 比较指针是否相等;只有当它们指向同一数组中的元素时,才能使用 < 比较顺序。
使用指针迭代
符合惯用写法的 C 风格迭代使用两个指针——起始指针和结束指针。
int a[] = {1, 2, 3, 4, 5};
for (int* p = a; p != a + 5; ++p) {
std::cout << *p << " ";
}允许指向末尾之后
您可以计算出指向最后一个元素之后一位的指针(即“结束”指针),但不能对它进行解引用。
指针算术的常见陷阱
常见错误包括:
- 越过数组边界
- 混用指针类型(
int*+char*) - 忘记算术运算以元素为单位,而不是以字节为单位
优先使用迭代器或范围
现代 C++ 更倾向于使用迭代器和范围库,而不是直接进行原始指针算术。在 C API 和非常底层的代码中,指针仍然十分重要。
快速检查
如果 p 是一个 int*,指向一个 4 字节整数的开头,那么 p + 1 指向什么位置?
回顾
*p 可以读取或写入目标。p->member 访问结构体成员。指针算术以元素大小为步长移动。请谨慎使用——在现代代码中,迭代器和范围通常是更安全的选择。
常见问题解答
「解引用与指针运算」课时是免费的吗?
是的 — 「解引用与指针运算」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「解引用与指针运算」这节课中我会学到什么?
通过指针读取内存,并使用指针运算遍历数组 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「解引用与指针运算」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。