请教高手C语言问题

这个程序结果是7,3
我想知道为什么请问为什么是这个结果 ,请把过程写清楚点
#include<stdio.h>
struct ks
{ int a;
int *b;
}s[4],*p;
void main()
{
int n=1,i;
printf("\n");
for(i=0;i<4;i++)
{
s[i].a=n;
s[i].b=&s[i].a;
n=n+2;
}
p=&s[0];
p++;
printf("%d,%d\n",(++p)->a,(p++)->a);
}

struct ks
{
int a;
int *b;
}s[4],*p;
void main()
{
int n=1,i;
printf("\n");
for(i=0;i<4;i++) //这个循环会将大小为4的每个数组的a设置为1,3,5,7 指针b同时指向其地址
{
s[i].a=n;
s[i].b=&s[i].a; //这里的&是取址
n=n+2; //主要是从1开始的,而且每一步都是+2
}
p=&s[0]; //这里取s[0]的地址,哪么p就是指向数组的第一个节点。
p++; //p++ 则p指向s[1] s[1].a=3
printf("%d,%d\n",(++p)->a,(p++)->a); //这里要注意的是,从右往左算,(p++)先提供p再自增,则p(++)->a=3.然后自增,而++p是先自增,所以p已经指向s[3]了,p->a=7,所以输出为7,3
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-03-22
你最后一句不要这么写,不同的编译器会产生不同的效果:
printf("%d,%d\n",(++p)->a,(p++)->a);
应该不同的编译器在这个地方的规定是不大一样的,你是要实现什么效果可以改成(p+1),或者其他,一个好的编程员应该尽量避免使用这样的句子,这样的编程习惯不好,很容易混乱。。。
我用VC6.0编译的结果是5跟3,可能TC里面编译出来的结果是7跟3
不一样的,你也不要太较真了
第2个回答  2008-03-22
#include<stdio.h> //包函头文件
struct ks
{ int a;
int *b;
}s[4],*p; //自定义一个结构体
void main() //主函数入口
{
int n=1,i; //定义整型变量n等于1
printf("\n"); //输出一个换行符
for(i=0;i<4;i++)
{
s[i].a=n;
s[i].b=&s[i].a;
n=n+2; //循环结束之后,S[0]=1,s[1]=3,s[2]=5,s[3]=7
}
p=&s[0]; //p是指向S[0]的指针
p++; //P自加1,所以P是指向S[1]的指针
printf("%d,%d\n",(++p)->a,(p++)->a); //(++p)是指先把P加1再做->命令,即P先指向S[2],故是5,(P++)->是指先让P指再S[1],再P自加1,故是3
}
第3个回答  2008-03-22
printf("%d,%d\n",(++p)->a,(p++)->a);时,(++p)-->a相当于循环三遍时的数组值,所以是7,而,(p++)->a相当于循环一遍时的数组值
第4个回答  2008-03-22
for(i=0;i<4;i++)
{
s[i].a=n;
s[i].b=&s[i].a;
n=n+2;
}

这段程序之后:
s[0].a=1,
s[1].a=3,
s[2].a=5,
s[3].a=7

之后p=&s[0]使p指向s[0],p++使p指向s[1]

在printf()函数中:

先计算(p++)->a(值为3),将3压入堆栈,之后由于p++的作用使p指向了s[2];

再计算(++p)->a,由于++p使p指向了s[3],所以这个表达式返回s[3].a的值,即7,压入堆栈。

然后,printf()函数从堆栈中取值,首先出栈的是7,输出7,第二个出栈的是首先入栈的3,输出3。

所以得到
7,3

有关printf()函数堆栈相关的内容,请参考下面的网页:

参考资料:http://wiki.cprogram.cn/index.php/Printf%E5%87%BD%E6%95%B0%E8%BF%9B%E6%A0%88%E9%A1%BA%E5%BA%8F

相似回答
大家正在搜