首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言一道简单的有关问题.请一下

2012-03-09 
C语言一道简单的问题.请高手指点一下.程序是这样的:inta2,*p&a,*q&aprintf( %d%d\n ,*p++,*(q++))p

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

指针部分多找点材料看,也会对你有帮助的..

热点排行