为何不能用*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
相关产品推荐
相关产品推荐

