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

简介: 自定义类型:结构体(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之前就已经进行自引用了,所以是不可行的。

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

目录
相关文章
|
编译器 Linux C++
自定义类型结构体(中)
自定义类型结构体(中)
42 0
|
C语言 C++
自定义类型结构体(上)
自定义类型结构体(上)
65 0
|
存储 网络协议 编译器
自定义类型结构体(下)
自定义类型结构体(下)
61 0
|
6月前
|
编译器 Linux C语言
自定义类型:结构体(2)
自定义类型:结构体(2)
37 1
|
6月前
|
存储 编译器 Linux
自定义类型——结构体、联合体、枚举
自定义类型——结构体、联合体、枚举
|
存储 编译器
自定义类型——结构体(二)
自定义类型——结构体
|
6月前
|
存储 编译器 Linux
结构体,自定义类型
结构体,自定义类型
59 0
|
11月前
|
网络协议 编译器 C语言
自定义类型:结构体
自定义类型:结构体
90 0
|
11月前
|
存储 编译器 C语言
自定义类型:结构体-2
自定义类型:结构体
63 0
|
11月前
|
存储 编译器 Linux
自定义类型:结构体-1
自定义类型:结构体
43 0