You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中指向整个数组的指针如何工作?相关疑问解答

指向整个数组的指针到底是什么?

首先明确:指向数组的指针在物理上确实指向数组第一个元素的起始地址,但它和普通元素指针的核心区别在于类型——这也是它被描述为“指向整个数组”的原因。

1. 类型的本质差异

比如定义一个数组:int arr[5];

  • 普通元素指针:int* p = arr;,类型是int*,代表指向单个int的指针。
  • 指向整个数组的指针:int (*pArr)[5] = &arr;,类型是int (*)[5],代表指向包含5个int的数组的指针。

这里的关键是,这个指针的类型里包含了数组的长度信息,编译器会根据这个类型来处理它的运算和解引用逻辑。

2. 指针运算的区别

指针的自增/自减运算,移动的字节数由它的类型决定:

  • 普通指针p++:会移动sizeof(int)字节(通常4字节),指向数组的下一个元素。
  • 指向数组的指针pArr++:会移动sizeof(int[5])字节(即5*4=20字节),相当于跳过整个数组,指向内存中紧接当前数组的下一个同类型数组。

3. 解引用的差异

  • 解引用普通指针*p:得到的是单个int元素,比如*p等价于arr[0]。
  • 解引用指向数组的指针*pArr:得到的是整个数组本身,而数组名在表达式中会隐式转换为指向第一个元素的指针,所以(*pArr)[0]才等价于arr[0]。

代码示例

#include <iostream>
int main() {
    int arr[5] = {1,2,3,4,5};
    int* p = arr;
    int (*pArr)[5] = &arr;

    // 地址值完全相同
    std::cout << "p的地址: " << p << std::endl;
    std::cout << "pArr的地址: " << pArr << std::endl;

    p++;
    std::cout << "p++后的地址: " << p << std::endl; // 偏移4字节
    pArr++;
    std::cout << "pArr++后的地址: " << pArr << std::endl; // 偏移20字节

    return 0;
}

总结

“指向整个数组”是语义层面的描述,不是说指针物理上能“覆盖”整个数组的内存,而是这个指针的类型绑定了数组的长度,运算和解引用逻辑都是围绕“整个数组”来设计的。这种指针在处理多维数组时尤为实用——比如二维数组int arr[3][5],它的每一行都是一个包含5个int的数组,指向行的指针就是int (*)[5]类型。

内容的提问来源于stack exchange,提问作者Humble Penguin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:12:15