回 帖 发 新 帖 刷新版面

主题:还是关于指针

先贴代码:


    int zippo[4] = {10, 20, 30, 40};
    int * p = zippo;

    printf("取值%d 地址%p\n", *p, p);    /* 第一条printf */
    printf("取值%d 地址%p\n", *p, p++); /* 第二条printf */

我心里认为打印的结果是:
取值10 地址0X22FF60
取值10 地址0X22FF60
因为第二条printf指针p使用的的++是后缀形式,可是真正的打印结果却很诡异
取值10 地址0X22FF60
取值20 地址0X22FF60

间接取值的结果为什么不一样?那从代码和实际打印的结果来看,好像顺序反了。。。


为了弄明白事情真相,我又改了代码:
    int zippo[4] = {10, 20, 30, 40};
    int * p = zippo;

    printf("取值%d 地址%p\n", *p, p);    /* 第一条printf */
    printf("地址%p 取值%d\n", p++, *p); /* 第二条printf */

我心里认为结果是:
取值10 地址0X22FF60
地址0X22FF60 取值20

实际结果却是:
取值10 地址0X22FF60
地址0X22FF60 取值10

我觉得事情越来越诡异,顺序好像是反过来的……第二条printf的取值应该是zippo的第二个元素20啊,怎么会是10呢,纳闷。


我又改了代码,把两条printf语句整合成一条:
    int zippo[4] = {10, 20, 30, 40};
    int * p = zippo;

    printf("取值%d 地址%p 地址%p 取值%d\n", *p, p, p++, *p);

我认为结果是:取值10 地址0X22FF60 地址0X22FF60 取值20

可是实际打印结果是:取值20 地址0X22FF64 地址0X22FF60 取值10

天啊,这都怎么回事啊?是编译器的问题还是自己的问题啊,那个地址是编译器给的,抄出来希望能更好讲述我的问题。我真是二丈和尚摸不着头脑啊,想了几天还是找不出个能解释这种现象的理由,实在是太郁闷了。

求讲解、求指点。最好能详细一些,我不知道因为怎样百度能找到我想要的答案……所以,求助没有办法的办法,我也知道自己想出来能自己最有帮助,可我实在是想不出,为何结果是这样的。哪里有说得不对请指出,我使用的编译器是Dev-c++

回复列表 (共16个回复)

11 楼

[quote] c标准并没有把它规定死,把它留给实现者来决定。[/quote]
這就叫未定義,也就是C++標準未提及的事情。
[quote]
未定义的行为并不是错误,可以这样用(但最好不要这样用,除非您完全不要考虑移植)。[/quote]
是這個意思,確實應盡量避免,因為你不知道升級了編譯器后,它是不是還是用原來的規則。

12 楼

谭浩强的《C程序设计》上提到了这一点,还特别强调了以下

13 楼

比如说为什么printf("取值%d 地址%p\n", *p, p++); 这样的语句是未定义的呢?
------------------------------
哪有这么写的 ,printf("取值%d 地址%p\n", *p, p++); 

应该是:printf("取值%d 地址%d\n", *p, p++); 地址也是整数输出 32位整数1

14 楼

其实这个问题一个牵扯到了编译器!另外一个是牵扯到执行顺序!
int zippo[4] = {10, 20, 30, 40};
    int * p = zippo;

    printf("取值%d 地址%p\n", *p, p);    /* 第一条printf */
    printf("取值%d 地址%p\n", *p, p++); /* 第二条printf */

我心里认为打印的结果是:
取值10 地址0X22FF60
取值10 地址0X22FF60
因为第二条printf指针p使用的的++是后缀形式,可是真正的打印结果却很诡异
取值10 地址0X22FF60  
取值20 地址0X22FF60  ====>这个地方你觉得诡异,是因为你用的编译器是由右往左压参,先取了p的 值打印然后自加,再赋给p相当与p=p+1,再当你打印*p的时候就取到了*(p+1)<=>zippo[1]的值,也就是20.
然而这个问题在不同的编译器里是不同的结果的,没有标准答案的!

15 楼

[quote]比如说为什么printf("取值%d 地址%p\n", *p, p++); 这样的语句是未定义的呢?
------------------------------
哪有这么写的 ,printf("取值%d 地址%p\n", *p, p++); 

应该是:printf("取值%d 地址%d\n", *p, p++); 地址也是整数输出 32位整数1
[/quote]
呵呵,別誤導。

16 楼

感谢所有帮助我的人,谢谢。 由于这几天有些事情,所以,没怎么上BBS,就忘了这贴的事,现在又有新问题,我回来求助,所以……

我来回复

您尚未登录,请登录后再回复。点此登录或注册