C语言一道简单的问题.请高手指点一下.
程序是这样的:
int a=2 ,*p=&a,*q=&a;
printf( "%d %d\n ",*p++,*(q++));
p=&a;q=&a;
printf( "%d %d\n " ,*p,(*q)++);
结果是: 2 2
3 2
我想请问一下,如何时得出上面的答案呢? 运算顺序的先后过程是怎么样?
[解决办法]
我运行了楼主的程序,结果是
2,2
2,2
printf( "%d %d\n ",*p++,*(q++));
是输出p,q的内容之后,然后p,q的指针分别加1;
而后 p=&a;q=&a;
使得p,q又指向a的地址,
执行printf( "%d %d\n " ,*p,(*q)++);
先是输出a地址里的内容,然后做了,(*q)++;即运行完后a的内容就变成了3了.
[解决办法]
int a=2 ,*p=&a,*q=&a;
printf( "%d %d\n ",*p++,*(q++));
/* ***************************
首先*和++具有相同的优先级,并且语句是按照从右向左的顺序结合的
运行*(q++) 指针q所指向的内存地址++ 即取指针q指向内存位置的下一个位置的值
*p++相当于 *(p++) ,参照上述优先级原则
运行顺序 *q > > > q++ > > > *p > > > p++ 输出的是*q 和 *p的值
补充概念:
数组a[]中没有带下表的a本身就是一个指向数组a[]开头的指针
数组在通常情况下对任意类型的数组x表达式x[i]=*(x+i)
现有a[]且*q = a[1]; 则*(q+1) = a[2]
因为数组在内存中是连续划分内存的,所以以上解释可以实现,
但具体到一个变量,因内存存放变量不一定是连续的,所以无法估计数值,
即我们无法知道以上语句运算完成后*q和*p的值
运行输出 2 2
p q 都指向 a所在内存地址的下一个位置
********************************* */
p=&a;q=&a;
//p q "重新 " 指向 a所在内存地址
printf( "%d %d\n " ,*p,(*q)++);
// 运行顺序 *q > > > (*q)++ (即a++) > > > *p (此时 a = 3)
结果是: 2 2
3 2
我想这部分牵涉到运算顺序的问题,而不是具体的指针问题所以用这个例子来解释会好一点
参照运算结果可以很快的发现规律.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int b[4]= {0,1,2,3};
int *p=b,*q=b;
printf( "%d %d\n ",*p++,*(q++));
printf( "%d %d\n ",*p, *q);
printf( "%d %d\n " ,*p,(*q)++);
printf( "%d ", b[1]);
system ( "pause ");
return 0;
}
输出结果:
0 0
1 1
2 1
2
指针部分多找点材料看,也会对你有帮助的..