如果p是个指针变量,为什么P[i]回完全等价与*(p+i) *(p+i)是什么意思?

如题所述

p作为一个指针变量,p[i]表示p指向的一段连续内存中的第i个偏移位置,等同于数组下标调用。
*(p+i)就是去p指向的位置偏移i个偏移量,然后*解引用取得那个点的值。
例如:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = a;
int i = 5;
此时p指向a数组的首地址,即a[0]的位置,设为0x8000F000。因为是int 型的指针,则其偏移量为 int 型所占字节数,以int 型所占字节数为4来说,此时p的偏移量为4字节
则p+i指向a[5]的地址,即 0x8000F000 + 5*4的位置,*(p+i)就取得a[5]的值了

如果取p = &a;
则p+1指向的不是a[1],而是a[10],刚好越界的那个点。因为此时p的偏移量以整个数组a的长度来计算,+1就加到了数组的末尾。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-02-27
c 语言 p[i] 中 的中括号 [] 不是标点符号,而是 地址 “运算符”(C 语言奇葩之一)。
p[i] 地址 等于 p+i
执行下面语句,可以看看,它们是地址,两种计算方法得到的一样吧!
double p[]={1,2,3,4};
int i;
for (i=0;i<4;i++) printf("%u\n",p+i);
for (i=0;i<4;i++) printf("%u\n",&p[i]);
----------------------
语句里 指针前加个星号,就是 该地址里存放的 数值。
语句里 p[i] 表示 是 &p[i] 地址 里的 值。
语句里 *(p+i) 是 p+i 地址里存放的 数值.
上面计算知道 指针 p+i 和 &p[i] 地址 一样。
他们的数值 p[i] == *(p+i)
-------------------
c 语言里,实质上只有 一维数组(多维,通过[]运算,还是1维),而指针是没有分配存储单元的一维数组,或者说一维数组是分配了存储单元的指针。
上面例子,为简单起见,直接写 double p[]={1,2,3,4};
愿意 写 声明 double a[]={1,2,3,4}, *p; 语句: p = &a[0]; 或 p=a; 都可以。本回答被提问者和网友采纳
第2个回答  2013-07-20
p[i]跟数组等效,但不是数组,理解这个问题,你需要理解数组与指针的区别。数组的首地址在编译后是不可变的并且编译器已经获取了其地址值。比如说操作数组p的第i个元素的值,编译器只需要进行2步,1.编译器获取第i元素的地址,2.读取或写入值。指针它的指向是可变的,所以编译器在对其操作时会进行3步,1.读取指针p的值,2.基于指针的类型进行偏移(假定指针为int类型,cpu为32为,这p[i]的地址值就为,p的值加上4*i),3.对其进行操作。*(p+i)也可以同样进行这样理解,基于首地址的一个偏移。希望对你有帮助,写的匆忙,有错求指点
第3个回答  推荐于2016-02-19
c语言p[i]中的中括号[]不是标点符号,而是 地址 “运算符”。
p[i] 地址等于 p+i
执行下面语句
double p[]={1,2,3,4};
int i;
for (i=0;i<4;i++) printf("%u\n",p+i);
for (i=0;i<4;i++) printf("%u\n",&p[i]);
语句里,指针前加个星号,就是该地址里存放的数值。
语句里,p[i]表示是&p[i]地址里的值。
语句里 *(p+i)是p+i地址里存放的数值.
上面计算知道指针p+i和&p[i]地址一样。
他们的数值p[i] == *(p+i)
c语言里,实质上只有一维数组(多维,通过[]运算,还是1维),而指针是没有分配存储单元的一维数组,或者说一维数组是分配了存储单元的指针。
上面例子,为简单起见,直接写 double p[]={1,2,3,4}。
第4个回答  2013-07-19
这个是不能随便这么写的。因为p必须是数组的指针,可以不是指针。因为数组的内存分布是连续的,p+i,实质是指向p数组的第i个元素的指针,*(p+i)就是这个指针的内容,所以与p[i]相同。其实i就是个偏移量。理论上p是一个地址,p+i值为p+i*单个元素的字节长度
相似回答