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

为何不能用*p[3]打印数组元素?数组指针赋值疑问解析

数组指针与普通变量指针的常见疑问解答

1. 为什么*p[3]无法访问数组元素,而p[3]可以?

这是因为运算符优先级:[]的优先级高于*,所以*p[3]会被编译器解析为*(p[3])。

在你的代码里,p是int*类型的指针,p[3]本身已经是一个int类型的值(等价于*(p+3)),对一个int值做解引用操作(*)是非法的,编译器会报错。

而p[3]本质是C/C++提供的语法糖,它和*(p + 3)完全等价:先让指针p向后偏移3个int的内存位置,再对这个地址解引用,最终得到数组第4个元素的值。

2. 为什么普通变量指针需要加*访问值,数组指针用p[3]就可以?

其实p[3]底层就是*(p + 3),只是写法更直观。

对于指向普通变量的指针e,*e是直接对指针指向的地址解引用,获取变量的值;而数组指针用下标访问时,编译器自动帮你完成了指针偏移+解引用这两步操作,所以不需要额外加*。

本质上两者都是解引用,只是数组下标是更便捷的语法形式。

3. 为什么是int *p = array而非int *p = &array?

这是因为数组名的隐式转换规则:

  • 当array作为赋值表达式的右值时,会自动隐式转换为指向数组首元素的指针,类型是int*,和p的类型匹配,所以int *p = array是合法的。
  • 而&array是取整个数组的地址,它的类型是int (*)[5](指向包含5个int的数组的指针),和int*类型不兼容,直接赋值会触发编译错误。

如果非要用&array,需要把p声明为数组指针:

int (*p)[5] = &array;
// 此时访问元素需要先解引用指针得到数组,再用下标
std::cout << (*p)[3];

你的代码示例

#include <iostream>

int main(){

    int array[5] = {3, 3, 4, 6, 7};
    int *p = array;
    std::cout << p << "\n" << p[3];

    int b = 5;
    int *e = &b;
    std::cout << "\n" << e << " " << *e;
}   

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:25:21