结构体问题
本帖最后由 张世来4610484 于 2020-3-21 12:04 编辑#include <stdio.h>
struct s
{
int i1;
struct s *i2,*i0;
};
static struct s a={{2,&a,'\0'},{4,&a,&a},{6,'\0',&a}};
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都错,不知道为什么,麻烦你们试一下,什么原因?感谢 问题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',参考问题一的解答,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可不是把指针对应的内存地址加1,而是让这个指针指向下一个数据,如果指针指向int,加1就是指向下一个int,如果指针指向struct s,加1就是指向下一个struct s
struct s包含一个int和两个指针
4 + 4 + 4 = 12
人造人 发表于 2020-3-21 12:25
对指针加1可不是把指针对应的内存地址加1,而是让这个指针指向下一个数据,如果指针指向int,加1就是指向下 ...
那加1以后,具体指向了谁啊 张世来4610484 发表于 2020-3-21 13:03
那加1以后,具体指向了谁啊
指向紧挨着的下一个对象,如果当前对象的地址是0,当前对象的大小是12
那么加1以后这个指针就指向12的位置
页:
[1]