c和c++中struct和typedef struct的区别

1 篇文章 0 订阅

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;在结束花括号后的分号表示结构体设计定义 的结束

标记名是可选的,什么时候可以省略,什么时候一定不能省略呢?

  1. 在一个地方声明/定义结构体,但是想在多个地方使用结构体变量时,不能省略标记名
  2. 如果省略标记名,那在声明结构体的同时就定义了该结构体唯一的变量,该结构体只有这一个变量,如:
			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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值