鱼C论坛

 找回密码
 立即注册
查看: 969|回复: 4

[已解决]结构体问题

[复制链接]
发表于 2020-3-21 11:58:04 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 张世来4610484 于 2020-3-21 12:04 编辑
#include <stdio.h>
struct s
{
        int i1;
        struct s *i2,*i0;
};
static struct s a[3]={{2,&a[1],'\0'},{4,&a[2],&a[0]},{6,'\0',&a[1]}};
struct s *ptr=a;
main ()
{
        printf("%d ",ptr->i0);
        printf("%d ",++ptr->i0);

        
}
问题1:把'\0'赋给一个指针是什么意思啊?空指针吗;
问题2:第一次输出是0,第二次输出是12,想问下怎么来的,第二次输出不应该是1吗
++ptr->i0不应该看成ptr->i0的值加1吗,还是把ptr加1再取值?求详细解答下
问题3:把struct s *ptr=a; 我写成 struct s*ptr;ptr=a;就出错了,vc和dev都错,不知道为什么,麻烦你们试一下,什么原因?感谢
最佳答案
2020-3-21 11:58:05
问题1:把'\0'赋给一个指针是什么意思啊?空指针吗;
应该是指向'\0'所在的内存地址,我断点看了汇编代码,好像是指向 0x00000000位置,我印象中好像null与'\0'有区别的,我觉得理解为指针初始化


问题2:第一次输出是0,第二次输出是12,想问下怎么来的,第二次输出不应该是1吗
++ptr->i0不应该看成ptr->i0的值加1吗,还是把ptr加1再取值?求详细解答下
应该看成++(ptr->i0)
你可以百度下++和 -> 的优先级,后者最优先
关于为啥是0和12的问题
请注意,按照道理,ptr->i0是一个指针,但是你人为的强转用%d输出,也就是输出int型
如题所示:
ptr->i0是指向a[0]里面的第三个元素,也就是'\0',参考问题一的解答,ptr->i0= 0x00000000,如果你转成int型,不就是0吗?
继续,指针的++和--是依据指向变量的类型而言的自加和自减,struct s 的长度是 int int int =12个单位长度,那么++一次的单位长度是12
++ptr->i0 相当于才 0x00000000位置,偏移了12个单位,移到了0x0000000C的位置,转成十进制,就是12了

问题3:把struct s *ptr=a; 我写成 struct s*ptr;ptr=a;就出错了,vc和dev都错,不知道为什么,麻烦你们试一下,什么原因?感谢
请注意下你这个 struct s *ptr=a;的位置,ptr它是一个全局变量,你在函数体外面对全局变量进行赋值操作,感觉怪怪的
这么写就没问题了
struct s *ptr ;

int main()
{
        ptr = a;
        printf("%s ", ptr->i0);
        printf("%d ", ++ptr->i0);
        system("pause");
        return 0;

}

最佳答案

查看完整内容

问题1:把'\0'赋给一个指针是什么意思啊?空指针吗; 应该是指向'\0'所在的内存地址,我断点看了汇编代码,好像是指向 0x00000000位置,我印象中好像null与'\0'有区别的,我觉得理解为指针初始化 问题2:第一次输出是0,第二次输出是12,想问下怎么来的,第二次输出不应该是1吗 ++ptr->i0不应该看成ptr->i0的值加1吗,还是把ptr加1再取值?求详细解答下 应该看成++(ptr->i0) 你可以百度下++和 -> 的优先级,后者最优先 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-21 11:58:05 | 显示全部楼层    本楼为最佳答案   
问题1:把'\0'赋给一个指针是什么意思啊?空指针吗;
应该是指向'\0'所在的内存地址,我断点看了汇编代码,好像是指向 0x00000000位置,我印象中好像null与'\0'有区别的,我觉得理解为指针初始化


问题2:第一次输出是0,第二次输出是12,想问下怎么来的,第二次输出不应该是1吗
++ptr->i0不应该看成ptr->i0的值加1吗,还是把ptr加1再取值?求详细解答下
应该看成++(ptr->i0)
你可以百度下++和 -> 的优先级,后者最优先
关于为啥是0和12的问题
请注意,按照道理,ptr->i0是一个指针,但是你人为的强转用%d输出,也就是输出int型
如题所示:
ptr->i0是指向a[0]里面的第三个元素,也就是'\0',参考问题一的解答,ptr->i0= 0x00000000,如果你转成int型,不就是0吗?
继续,指针的++和--是依据指向变量的类型而言的自加和自减,struct s 的长度是 int int int =12个单位长度,那么++一次的单位长度是12
++ptr->i0 相当于才 0x00000000位置,偏移了12个单位,移到了0x0000000C的位置,转成十进制,就是12了

问题3:把struct s *ptr=a; 我写成 struct s*ptr;ptr=a;就出错了,vc和dev都错,不知道为什么,麻烦你们试一下,什么原因?感谢
请注意下你这个 struct s *ptr=a;的位置,ptr它是一个全局变量,你在函数体外面对全局变量进行赋值操作,感觉怪怪的
这么写就没问题了
struct s *ptr ;

int main()
{
        ptr = a;
        printf("%s ", ptr->i0);
        printf("%d ", ++ptr->i0);
        system("pause");
        return 0;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-21 12:25:35 | 显示全部楼层
对指针加1可不是把指针对应的内存地址加1,而是让这个指针指向下一个数据,如果指针指向int,加1就是指向下一个int,如果指针指向struct s,加1就是指向下一个struct s
struct s包含一个int和两个指针
4 + 4 + 4 = 12
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-21 13:03:03 | 显示全部楼层
人造人 发表于 2020-3-21 12:25
对指针加1可不是把指针对应的内存地址加1,而是让这个指针指向下一个数据,如果指针指向int,加1就是指向下 ...

那加1以后,具体指向了谁啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-21 14:22:15 | 显示全部楼层
张世来4610484 发表于 2020-3-21 13:03
那加1以后,具体指向了谁啊

指向紧挨着的下一个对象,如果当前对象的地址是0,当前对象的大小是12
那么加1以后这个指针就指向12的位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表