自定义类型:结构体(1)

1.结构体的声明

​
struct Stu
{
  char name[20];
  int  age;
  int  higt;
}stu;

关键词+结构体名字

{

结构体成员;

}结构体变量名;

2.结构体的初始化

结构体的初始化有两种:

    2.1按结构体成员顺序初始化
​
struct Stu
{
  char name[20];
  int  age;
  int  higt;
};

int main()
{
 struct Stu s1={ "xiaocheng",20,185};
 return 0;
}

​
2.2按指定的顺序初始化
​
struct Stu
{
  char name[20];
  int  age;
  int  higt;
};

int main()
{
 struct Stu s2={.age=20,.name="xiaocheng",.higt=185};
 return 0;
}

​

3.结合体的特殊声明

在声明结构体类型时候,可以不完全声明,也就是匿名结构体类型

​
struct 
{
  char name[20];
  int  age;
  int  higt;
}x;

上面的结构体声明中没有结构体标签,是匿名结构体。

下面有一个问题:

​
struct 
{
  char name[20];
  int  age;
  int  higt;
}x;

​
struct Stu
{
  char name[20];
  int  age;
  int  higt;
}*p;

p=&x;

​

​

上面代码是不合法的,编译器会把上面两个结构体当成两种不同的类型,会出现警告。

匿名的结构体类型创建之后,如果不重新进行命名,基本上只能用一次。

4.结构体的自引用

我们学习了结构体的创建和初始化之后,那么如果想要做到结构体引用结构体,类似递归的操作,要怎么做呢?

看下面一段代码是否可行:

​
struct Stu
{
  char name[20];
  int  age;
  int  higt;
  struct Stu next;
};

答案是不行的,上面代码中在结构中包含⼀个类型为该结构本身的成员,这样的话结构体的内存就会变的无穷大。

正确的自引用方式:

​
​
struct Stu
{
  char name[20];
  int  age;
  int  higt;
  struct Stu* next;
};


​

如果对匿名的结构体进行自引用的话可不可以呢?

首先对匿名结构体进行自引用时要先给它重新命名,看下面一段代码:

​
​
typedef struct 
{
  char name[20];
  int  age;
  int  higt;
  Stu* next;
}Stu;


​

这样其实也是不行的,因为c语言是一种编译型代码,是一行一行的往下面执行的,在对匿名结构体重命名为Stu之前就已经进行自引用了,所以是不可行的。

正确的解决方案就是:自引用就不要使用匿名结构体了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值