初识C语言结构体

在标准C语言中,使用结构可以把不同类型的数据存储在一起。结构作为一种复杂的数据结构类型,在C语言程序中首先要定义,然后才能进行结构变量的定义和使用。

1、结构的定义
结构是由 不同类型的数据组成的。组成结构的每个数据称为该结构的成员项,简称成员。在程序中使用结构时,首先要对结构的组成进行描述,称为结构的定义。结构的定义是宣布该结构是由几个成员项组成,以及每个成员项具有什么数据类型。

结构定义形式如下:

struct 结构名
{
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名n;
};

Example:

struct Example         //定义一个结构Example
{
	char name[20];     //成员
	char sex;
	int age;
	int tel;
};


小结:
1)结构定义以关键字 struct 作为标识符,其后是定义的结构名,二者形成了特定结构的类型标识符。结构名是自定义的,其命名规则与变量名相同。结构名是这一组数据集合体的名字,虽然结构体是由开发者自己定义的新数据类型,但编译系统把结构名Example与int、char等基本数据类型名同等看待,即结构名就可以像基本数据类型名一样,用来说明具体的结构变量。
2)在结构名下面的一对花括号中的是组成该结构的各个成员项。每个成员项由其数据类型和成员组成。每个成员项后用分号";"作为结束符。整个结构的定义也用做分号作为结束符。
3) 在程序执行时,定义的结构,系统并不为其分配内存空间。结构的定义仅仅是定义了一种特定的数据构造使用内存的模式。只有用它来创建结构变量时,系统会为这个变量分配内存,其内存空间的大小是结构体中所有变量类型占用内存空间的总和。
4)在程序中,结构的定义可以在函数内部也可以函数外部。在函数内部定义的结构,其可见性仅限于该函数内部,而在函数外部定义的结构,在所在文件定义或说明的位置以后都是可见的。


2、结构变量的定义
程序一旦定义了一个结构体,就相当于定义了一个新的结构类型,那么就可以把结构名像int、double等关键字一样使用。

结构变量定义其格:

<存储类型> struct 结构名 结构变量名;

其中存储类型可以省略。

Example:

struct Example info;   //定义了一个Example类型的结构变量info,此时系统会为info变量分配内存空间,其空间大小为:Example中成员类型所占内存空间总和.

小结:
1)在程序中,结构变量的定义要在结构定义之后,对于尚未定义的结构,不能用它对任何结构进行说明。
2)在一些简单的程序设计中,结构的定义和结构变量的定义可以同时进行,在这种情况下,有时会省略结构名,这时被定义的结构变量直接在结构定义的花括号后给出。

Example:

struct Example
{
	char name[20];
	char sex;
	int age;
	int tel;
}info;

3)一个结构变量占用内存的实际大小,可以用sizeof运算求出。一般形式如下:sizeof(Example)。

struct Date
{
    int month;
    int day;
    int year;
};

int main(void)
{
    printf("%d",sizeof(today));
    return 0;
}

结果为12个字节。


3、结构变量的访问
结构不同与数组。由于数组是相同类型的数据集合,所以数组使用下下标方式访问,而结构成员都有自己的名字,它们是同过名字来访问的,此外在结构说明的同时可以给各个成员项赋初值,即对结构进行初始化。

结构的成员一般用以下形式表示:

结构变量名.成员名

当中的点"."符号是C语言的一个运算符,它规定的运算是访问结构的成员。它第一运算优先级中的一种运算,它的结合规律是左向右。

Example:

struct Example          //定义一个结构体Example;
{
	char name[20];
	char sex;
	int age;
	int tel;
};

int main(void)
{
	struct Example info;         //声明一个结构体变量
	printf("姓名%s\n",info.name); //引用输出结构体变量成员
	printf("性别%s\n",info.sex);
	printf("年龄%d\n",info.age);
	printf("电话%d\n",info.tel);
	return 0;
}


需要注意的是,当结构成员是[非]字符串指针变量时,要注意它的使用形式上的特点。

Example:

struct Example
{
	int *age;    //int类型的指针变量
} info;

如果这样引用:

info.age

这实际是是引用了一个指针,即:一个内存地址;要想得到这个内存内的数据就要作如下引用:

*info.age 

"."运算符的级别高于"*"运算符,所以,访问成员在先,而访问目标运算在后。

4、结构的初始化
在结构说明的同时,可以给这个结构的每个成员赋初值,称为结构的初始化。 结构初始化的一般形式如下:

struct 结构名 结构变量={初始数据};

其中:花括号中包围的初始数据之间用逗号分隔,初始数据的个数与结构成员项的个数应该相同,它们是按先后顺序一一对应赋值的。此外,每个初始数据必须符合与其对应的成员项的数据类型。
Example:

struct Example     //创建结构体 Example
{
	char *name;
	char sex;
	int age;
	long tel;
	char *adr;
};

struct Example info = {"李明",'M',20,457684,"北京市朝阳区"};   //结构变量赋初值


或者如下赋值:

struct Example info;	//声明结构体变量 info
info.name = "李明";   //结构体成员赋值
info.sex = 'M';
info.age = 20;
info.tel = 456527;
info.adr = "北京市朝阳区";

结构体综合应用:

#include <stdio.h>
struct Example        //定义结构体 Example
{
	char *name;
	char sex;
	int age;
	long tel;
	char *adr;
};


int main(void)
{
	struct Example info;  //声明结构体变量 info
	info.name = "李明";   //结构体成员赋值
	info.sex = 'M';
	info.age = 20;
	info.tel = 456527;
	info.adr = "北京市朝阳区";


	printf("姓名\t性别\t年龄\t电  话\t\t住址\n");
	printf("%s\t%c\t%d\t%ld\t\t%s",info.name,info.sex,info.age,info.tel,info.adr);
	return 0;
}


运行结果:

姓名    性别    年龄    电  话          住址
李明    M       20      456527          北京市朝阳区
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值