在C++编程中,指针是一个既强大又容易让人困惑的概念。特别是当指针与数组结合使用时,很多初学者会感到迷茫。本文将围绕C++指向数组的指针这一核心主题,用通俗易懂的语言、清晰的图示和实用的代码示例,帮助你彻底掌握这一知识点。
首先我们要明确两个概念:
我们先看一个普通指针的例子:
#include <iostream>using namespace std;int main() { int arr[5] = {10, 20, 30, 40, 50}; int *p = arr; // p 是一个指向 int 的指针,指向 arr[0] cout << "p[0] = " << p[0] << endl; // 输出 10 cout << "p[1] = " << p[1] << endl; // 输出 20 return 0;} 这里的 p 是一个普通的 int* 类型指针,它只“知道”自己指向一个 int 类型的数据。当我们对 p 进行加减操作时,它每次移动 sizeof(int) 字节(通常是4字节)。
而指向数组的指针则不同。它的声明方式如下:
int (*p)[5]; // p 是一个指针,指向一个包含5个int元素的数组 注意括号!int *p[5] 和 int (*p)[5] 完全不同:
int *p[5]:这是一个包含5个 int* 指针的数组。int (*p)[5]:这是一个指向“包含5个int的数组”的指针。#include <iostream>using namespace std;int main() { int arr[5] = {1, 2, 3, 4, 5}; int (*p)[5] = &arr; // 注意:这里取的是整个数组的地址 // 通过指针访问数组元素 for (int i = 0; i < 5; ++i) { cout << "(*p)[" << i << "] = " << (*p)[i] << endl; } // 指针算术:如果还有另一个相同大小的数组 int arr2[5] = {6, 7, 8, 9, 10}; p = &arr2; // 现在 p 指向 arr2 cout << "\nNow pointing to arr2:\n"; for (int i = 0; i < 5; ++i) { cout << "(*p)[" << i << "] = " << (*p)[i] << endl; } return 0;} 在这个例子中,p 是一个 C++指向数组的指针,它的类型是 int (*)[5]。当你对 p 执行 p + 1 时,它会跳过整个5个 int 的空间(即20字节),而不是像普通指针那样只跳4字节。
虽然在日常编程中不常用,但在以下场景中非常有用:
void func(int (*matrix)[10]))arr = p; 是非法的)。int (*p)[5] 不能指向 int arr[3],因为数组大小不同。* 和 [] 的结合顺序会导致完全不同的含义。掌握数组指针是深入理解C++内存模型和指针机制的重要一步。虽然初看起来有些复杂,但只要记住:
“int (*p)[N] 表示 p 是一个指针,它指向一个包含 N 个 int 的数组。” 通过不断练习和对比普通指针与指针与数组的关系,你会逐渐建立起清晰的认知。希望这篇C++指针教程能为你打下坚实的基础!
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129084.html