C语言中为什么 假如定义一个*p=&a,然后为什么这个*p++与*(p+1)是相等的?

这*p++是如何理解的?*(p+1)又如何理解?
2024-11-06 09:44:50
推荐回答(5个)
回答1:

根本就不是一样的

#include
#include

int main( int argc, char** argv )
{
int a[] = {1, 3, 5, 7, 9};
int *p = a;
int *q = a;

printf("%d\n", *p++);//输出1
printf("%d\n", *p);//输出3
printf("%d\n", *(q+1));//输出3
printf("%d\n", *q);//输出1

return 0;
}

开始p和q都指向数组a的第一个元素a[0]

*p++就是取p当前指向内存空间的值,然后指针向后移动一个数据单元
相当于如下代码:
*p;//先取指向空间的值,即a[0]的值1
p++;//指针向后移动一个数据单元,此时p指向数组a的第二个元素a[1]
所以*p++的值为1,p指向a[1]

*(q+1)就是先把指针向后移动一个数据单元a[1],然后取a[1]的值
这个时候q的值并没有变,还是指向一个元素a[0],但是*(q+1)的值却是a[1]的值
*(q+1)的值为3,q还是指向a[0]

所以*p++和*(p+1)根本就不是一样的,也不相等

回答2:

*p=&a 以后,*p就指向变量a所在的地址了
执行 *p++ 以后,实际是把这个地址增加了1 ,也就是*p 这个指针由原来指向变量a所在地址,变成了指向变量a之后的下一个地址,比如原来变量a的内存地址是01,*p就指向1 ,执行*p++后,现在*p 就指向内存地址02了。
而*(p+1) 是指把当前p所指向的地址加上一个单元,即比*p所指向的变量a所在地址 大一个地址单位的指针。这种情况不是指针p移动,而是把比p大一个单元的(p+1)当成一个新指针。
无论 *p++ 还是 *(p+1) 实际上都是指向的同一个地址(变量a所在位置的后一个地址),因此,它们是等价的。

回答3:

int *p.这是一个指针变量,它就是一个只能用来装地址的变量。p++就等于p+1啊,他们都是指向一个位置的,如在vc下,一个整形数据占4字节,p=2000(地址,二进制的,这样写方便你懂),*p++是说用后p指向的地址向下移一位,所以p=2004;p++是用完后就加,*(p+1)说的是指向2004这个地址!

回答4:

*p++=*(p++)=*(p+1)
首先是运算符的优先级,*p++=*(p++); 其次,对于指针的自加,系统已经根据指针所指的数据类型进行了处理,故p++与p+1的作用相同

回答5:

第一个是先指后加注意p的值不在与原来的值一样了
第二是先加后指p的值不变