typedef是c语言定义的一个类型重名
C语言中结构体的使用,归纳起来有几种方式
1. C结构体声明/定义
struct book
{
char title[MAXTITL];//一个字符串表示的titile 题目 ;
char author[MAXAUTL];//一个字符串表示的author作者 ;
float value;//一个浮点型表示的value价格;
};//注意分号不能少,这也相当于一条语句;
这个声明描述了一个由两个字符数组和一个float变量组成的结构体,但是注意,他并没有创建一个实际的数据对象,而是描述了一个组成这类对象的元素,【因此,我们也有时候将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象】。
下面介绍一下上面的结构体声明;
1,首先使用关键字struct,他表示接下来是一个结构体。
2;后面是一个可选的标志(book),它是用来引用该结构体的快速标记。因此我们以后就会可以这样创建数据对象
struct book library;//把library设为一个可以使用book结构体的结构体变量,则library这个变量就包含了其book结构体中的所有元素
3;接下来就是一个花括号,括起了结构体成员列表,及就是每个成员变量,使用的都是其自己的声明方式来描述,用分号来结束描述;
列如;
char title[MAXTITL];字符数组就是这样声明的,用分号结束;
注意;其中每个成员可以使用任何一种c数据结构甚至是其他的结构体,也是可以的
4;在结束花括号后的分号表示结构体设计定义 的结束
标记名是可选的,什么时候可以省略,什么时候一定不能省略呢?
- 在一个地方声明/定义结构体,但是想在多个地方使用结构体变量时,不能省略标记名
- 如果省略标记名,那在声明结构体的同时就定义了该结构体唯一的变量,该结构体只有这一个变量,如:
struct {
int a;
folat b;
}name;
结构体定义的一般形式为:
struct 结构体标志名 {
成员变量;
};
2. 创建结构体变量
struct book i_book; //struct book 的作用就相当于 int float 的作用一样
struct book i_book 相当于:
struct book {
char title[MAXTITL];//一个字符串表示的titile 题目 ;
char author[MAXAUTL];//一个字符串表示的author作者 ;
float value;//一个浮点型表示的value价格;
}i_book;
3. typedef 与 结构体
//定义/声明一个结构体 Student
typedef struct{
int a;
float b;
}Student;
如上的定义相当于:
typedef struct {int a; folat b;} Student;
//创建变量
Student Xiaoming;//创建xiaoming变量
而:
typedef struct Stu{int a; float b;} Student;
相当于
typedef A B;
其中 A 是struct Stu{int a; float b;};
B 是 Student
//使用Student 来创建变量
Student xiaoming ;
//使用Stu 创建变量
struct Stu lihua;
C语言中struct和typedef struct的区别
最近跟着雷神的博客学习FFMPEG,在看FFMPEG的源码的时候发现有些语句写法和自己平时见的不太一样,比如下面的语句:
struct SwsContext *img_convert_ctx;
明明SwsContext 是一个结构体类型名称,为什么前边还要加一个struct,而且这个结构体的定义也是用typedef struct SwsContext { …};明白过来FFMPEG的源码是用c写的,不是用c++,所以在用c++编译器编译FFMPEG的库头文件的时候要用extern "C"{ XXX.h ...}
。
不能用c++的语法规则来读FFMPEG的源码。这里总结一下c++和c在定义结构体的过程中的不同。
1.在c语言中定义一个结构体若用typedef struct,即
//定义1
typedef struct Number
{
int a;
int b;
};
//定义2
struct Number
{
int a;
int b;
};
//定义1和定义2使用时,都应该这样定义一个结构体变量
struct Number num1;
因为定义1相当于:
typedef A ; //没有指明替代的名称
但是如果写成如下格式:
//定义3
typedef struct Number
{
int a;
int b;
}Num;
//定义3使用时,这样申请一个结构体变量。
Num num1;//或者 struct Number num1;
//定义4
typedef struct
{
int a;
int b;
}Num;
//使用定义4
Num num1;
通过以上各个定义总结:
1.如果使用typedef来定义结构体时:型如typedef struct aaa { ..}bbb;
其中aaa是可以省略的,那么用bbb(如果有的话)来定义一个结构体变量时,可以直接用bbb xxx;
就行。但用aaa来定义一个结构体变量时,则需要使用struct aaa xxx;
2.不使用typedef来定义结构体时,声明该类型变量都需要加上struct,即struct aaa xxx;
但应该注意如下定义形式:
struct {
int a;
int b;
}OnlyStruct;
//使用形式
OnlyStruct.a=10;
OnlyStruct.b=20;
上边OnlyStruct结构体由于没有类型名,只能用于OnlyStruct这一个变量,无法再申请该类型结构体的其他变量。
##2.C++struct和typedef struct的区别
如果在c++中定义一个结构体如:
//定义1
struct Number
{
int a;
int b;
};
//使用定义1声明该类型结构体变量
Number num;//方式1
struct Number num;//方式2