h-b-z-d-j-s-m 发表于 2022-10-16 16:57:07

指针结构体

#include<stdio.h>
struct ks
{
        int a;
        int *b;
}s,*p;
int main()
{
        int n=1,i;
        printf("\n");
        for(i=0;i<4;i++)
        {
                s.a=n;
                s.b=&s.a;
                n=n+2;
        }
        p=&s;
        p++;
        printf("%d,%d\n",(++p)->a,(p++)->a);
        return 0;
}
为啥输出7,3?

jackz007 发表于 2022-10-16 17:17:28

本帖最后由 jackz007 于 2022-10-16 17:20 编辑

      gcc 编译、运行:
D:\\C>g++ -o x x.c

D:\\C>x

7,3
      使用 VC 6.0 编译、运行:
D:\\C>cl x.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

x.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:x.exe
x.obj

D:\\C>x

5,3

D:\\C>
就是说:
【gcc】:
7,3
【VC6.0】:
5,3
      可见,结果因编译器而异,这种问题不适合讨论。
      如果不想自找麻烦,劝楼主不要写这样的代码。

人造人 发表于 2022-10-16 20:42:32

jackz007 发表于 2022-10-16 17:17
gcc 编译、运行:

      使用 VC 6.0 编译、运行:


可是他要考试呀,没办法
考试就是喜欢考这些
我建议是,考试只能是死记硬背,管他什么原理,背过就能考过

howzyao 发表于 2022-10-21 23:16:53

这种代码确实不好。
实际确实就是ks定义成了数组,又定义成p,是可以指向这个同类的数组。
你指向的是这个数组中的首元素地址,而不是s,这个我觉得有点不明白。此时,你的p自加后,是元素往后呢?还是s整个结构往后(实际上s无法往后了)
但看到你能成功运行,我又只能认为p可以指向元素,元素的本质呢,还是ks,看这绕的,简直不利于入门嘛。
但确实有些认为设置认识障碍的意味。
页: [1]
查看完整版本: 指针结构体