结构体stuct
来源:互联网 发布:淘宝删除未发货订单 编辑:程序博客网 时间:2024/06/07 19:00
一.结构类型定义和结构变量
在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组(数组用来存储同质数据)来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。
结构是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构既是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。
1.结构的定义
定义一个结构的一般形式为:
struct 结构名
{ 成员表列 };//这里的分号不要少了
成员表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为: 类型说明符 成员名;
例如: struct stu
{ int num;
char name[20];
char sex;
float score; };
2.typedef struct与struct的区别
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部基本数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量取一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
新类型名表中可以有多个标示符,它们之间以逗号分隔。typedef double area,volume;//给double取两个别名area,volume;
typedef与结构结合使用
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
这语句实际上完成以下两个操作:
1) 定义一个新的结构类型
struct tagMyStruct
{
int iNum;
long lLength;
};
我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。(在C++中可以使用上述声明变量方式)
2) typedef为这个新的结构起了一个名字,叫MyStruct。
typedef struct tagMyStruct MyStruct;
因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。
当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
C语言允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。
根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。
解决这个问题的方法有多种:
1)、
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
2)、
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。
3)、规范做法:
typedef uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );
这个以前没有看到过,个人认为是预定义一个uint32的指针函数,uint16*, uint32 为函数里的两个参数; 应该相当于#define uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );
struct在代码中常见两种形式:
struct A
{
//...
};
struct
{
//...
} A;
这其实是两个完全不同的用法:
前者叫做“结构体类型定义”,意思是:定义{}中的结构为一个名称是“A”的结构体。
这种用法在typedef中一般是:
typedef struct tagA //故意给一个不同的名字,作为结构体的实名
{
//...
} A; //结构体的别名。
后者是结构体变量定义,意思是:以{}中的结构,定义一个名称为"A"的变量。这里的结构体称为匿名结构体,是无法被直接引用的。
也可以通过typedef为匿名结构体创建一个别名,从而使得它可以被引用:
typedef struct
{
//...
} A; //定义匿名结构体的别名为A
3.在C和C++中struct和typedef struct的区别
在C和C++有三种定义结构的方法。
typedef struct {
int data;
int text;
} S1;
//这种方法可以在c或者c++中定义一个S1结构
struct S2 {
int data;
int text;
};
// 这种定义方式只能在C++中使用,而如果用在C中,那么编译器会报错
struct {
int data;
int text;
} S3;
这种方法并没有定义一个结构,而是定义了一个s3的结构变量,编译器会为s3分配内存。
void main()
{
S1 mine1;// OK ,S1 是一个类型
S2 mine2;// OK,S2 是一个类型
S3 mine3;// OK,S3 不是一个类型
S1.data = 5;// ERROR,S1 是一个类型
S2.data = 5;// ERROR,S2 是一个类型
S3.data = 5;// OK,S3是一个变量
}
另外,对于在结构中定义结构本身的变量也有几种写法
struct S6 {
S6* ptr;
};
// 这种写法只能在C++中使用
typedef struct {
S7* ptr;
} S7;
// 这是一种在C和C++中都是错误的定义
如果在C中,我们可以使用这样一个“曲线救国的方法“
typedef struct tagS8{
tagS8 * ptr;
} S8;
如果在c程序中我们写:
typedef struct
{
int num;
int age;
}aaa,bbb,ccc;
这相当于
typedef struct
{
int num;
int age;
}aaa;
typedef aaa bbb;
typedef aaa ccc;
也就是说aaa,bbb,ccc三者都是结构体类型。声明变量时用任何一个都可以,在c++中也是如此。但是你要注意的是这个在c++中如果写掉了typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。
4.在C中,struct不能包含函数。在C++中,对struct进行了扩展,可以包含函数。
- stuct stat结构体
- 结构体stuct
- winapi stuct
- stuct、emun、union
- Python--stuct模块 pack unpack
- Stuct, spring, hibernate集成开发备忘
- typedef 和 stuct 的区别用法
- C# Stuct和Class的区别
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 结构体
- 正则表达式的用法
- Windows 7和Ubuntu 14.04下分别搭建Android开发环境过程和遇到的问题
- Yii笔记
- BaiduMap SDK的使用流程
- KVC、KVO和谓词
- 结构体stuct
- 使用ret2libc攻击方法绕过数据执行保护
- 黑马程序员------OC基础-----关键字
- Spring多数据源配置
- ABAP 总结常用术语简称解析
- Objective-C 重要组成
- 常量、三元运算符
- 字符串-03. 字符串的冒泡排序(20)
- POJ 2251 Dungeon Master(BFS)