有关C语言指针问题

来源:百度知道 编辑:UC知道 时间:2024/09/28 17:34:10
下面三个程序,在我没有运行之前跟我想的结果不一样,想不通。
望了解指针的详解一下。
(1)
void F(int *p)
{
printf("%d,%d\n",*p,(*p)++);
}
void main(void)
{
int x=6;
F(&x);
F(&x);
}

(2)
void F(int *p)
{
printf("%d,%d\n",*(p++),(*p)++);
}
void main(void)
{
int a[2]={6,10};
F(a);
F(a);
}

(3)
void F(int *p)
{
printf("%d,%d\n",*p++,(*p)++);
printf("%d,%d\n",*p++,(*p)++);

}
void main(void)
{
int a[2]={6,10};
F(a);
F(a);
}
大家都说得很有道理。
事实上我在用C语言写和C++写出来的显示结果也是不一样的。
比如我将第一个的输出语句改为:cout<<*p++<<","<<(*p)++<<endl;
结果相差甚远。C语句显示是6,6//7,7
可C++运行的结果却是7,6//8,7
也就是跟楼下说的一样。我是在VC6.0下运行的。不信大家可以去试。脑子都乱了。

跟你想法不一样是很正常的,并不表明你的想法是错的。
因为这三个写法都是ANSI C中所讲的undefined behavior。即其运行时的行为是不确定的,随编译器而异。

简单地说,这是很垃圾的代码。自己千万不要写。如果是试题,那出题人是垃圾——也许他还以为是很高明的题目。

纠正一下其他几位的说法:
printf即使是自右向左传递参数,也不表明会从右向左逐个计算实参。VC我就试过,它是从右向左传递参数,但取值不是这样轮流来——TC倒是

poppylx的2,3解释反了。

再补充一点:逗号表达式倒是有确定的从左到右的求值顺序。但函数列表不是逗号表达式,虽然形式上是逗号隔开的。

老谭的书如果还给这种代码的行为作出固定的解释而不澄清,那真是误人子弟。

第一个程序我的编译器运行结果
7,6
8,7
原因是printf函数按自右而左(各个编译器会有所不同,有的自左往右,具体试验下就行了)的求实参的顺序,首先(*p)++输出p指向的单元的值6然后再自增1变为7,此时p指向的单元的值也改变为7了,也就是x=7了,然后再输出*p,就是7,所以是7,6.
在主调函数main调用被调函数F时,采取的是单向值传递的方式,也就是不能通过改变形参的值来改变实参的值,而在采用指针做函数参数的时候,在被调函数中,如果形参指针指向的单元的值改变的话,所对应的实参指针指向的单元也会改变。
其它的程序也是这么分析就可以了,建议把指针那章多看看,C语言的精髓啊

呵呵 这题很高明啊 通过这个题你至少学到4点
1. 世界上不止一种编译器,也不是所有的编译器都一样。所以不一定所有人的答案都一样。

2.*p++表示当前指针所指向的值加1

3.(*p)++表示当前指针位置加1,即指向下一个元素。

4.指针和数组的组织关系。