c 指针运算问题?修改一、代码:
int a[]={1,2,3,4,5}; int *p; p=a; *(p++)=10; int i; for (i=0; i<sizeof(a)/sizeof(int); i++) { printf("a[%d]=%d\n",i,a[i]); }
输出:a[0]=10a[1]=2a[2]=3a[3]=4a[4]=5二、问题明明指针往下移了,为什么a[0]=10,而不是a[1]=10?
业精于勤,荒于嬉;行成于思,毁于随。
p++++在后等价于
p++
++
*(p)=10; p++
不同于++p
++p
(p++)=10 中(p++)返回的是0的下标,所以结果就是这样的。其实你这句等价于p++,结果是一样的
p++会返回未自增前的值,并且在表达式求值阶段结束p才会自加,这里*p++可以看作是一个子表达式。
*p++
p++ 不熟练就少用,节省不了多少开销,简单的一个先运算后赋值和先赋值后运算的问题。
#include <stdio.h> int main() { int a[]={1,2,3,4,5}; int *p; p=a; *(p+1)=10; p++; int i; for (i=0; i<sizeof(a)/sizeof(int); i++) { printf("a[%d]=%d\n",i,a[i]); } }
p++和p是一模一样的,++p才等于(p+1),但不管怎样,这两个东西存在以后后面的代码中p=p+1。(如果还不懂,自己翻书)
有个简单的方法便于你理解:你可以依次打印p、p++((p++)取的还是p++这个标量值,或者此处你可以输出&((p++)))、p三者的值,看了结果你就明白了*(p++)内存的地址还是p,之后才变为p+1
“前缀++”和“后缀++”的区别,c/c++中经典考题
p++
++
在后等价于
不同于
++p
(p++)=10 中(p++)返回的是0的下标,所以结果就是这样的。其实你这句等价于p++,结果是一样的
p++
会返回未自增前的值,并且在表达式求值阶段结束p才会自加,这里*p++
可以看作是一个子表达式。p++ 不熟练就少用,节省不了多少开销,简单的一个先运算后赋值和先赋值后运算的问题。
p++和p是一模一样的,++p才等于(p+1),但不管怎样,这两个东西存在以后后面的代码中p=p+1。(如果还不懂,自己翻书)
有个简单的方法便于你理解:你可以依次打印p、p++((p++)取的还是p++这个标量值,或者此处你可以输出&((p++)))、p三者的值,看了结果你就明白了*(p++)内存的地址还是p,之后才变为p+1
“前缀++”和“后缀++”的区别,c/c++中经典考题