有关C语言指针问题

2025-05-13 23:00:41
推荐回答(3个)
回答1:

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

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

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

poppylx的2,3解释反了。

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

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

回答2:

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

回答3:

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

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

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

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