【C语言学习】初识结构体

1. 结构体的引入

在前面已经介绍了整形(int,long,···),浮点型(flaot,double),字符型(char),还介绍了数组(存储具有相同类型数据的集合),字符串等。但是在实际问题中仅有这些数据类型是不够的,有时候我们需要好几种类型来描述一个复杂对象,例如一个学生的信息就需要学号(字符串),姓名(字符串),年龄(整形)等等,这些数据类型都不同但是他们又是表示一个整体,要存在联系,那么我们就需要一个新的数据类型—结构体。

2. 结构体的定义

2.1 定义结构体的一般格式

struct 结构名
{
	类型 变量名;
	类型 变量名;
	...
} 结构变量;

例如,一个描述学生信息的结构体:

struct student
{
	char no[20]; //学号
	char name[20]; //姓名
	char sex[5]; //性别
	int age; //年龄
}stu[100];

像上面这里,我们就定义了表示100个学生信息的结构体。如果没有结构体,我们可能要用400行代码才能表示完100个学生的信息,这就是结构体的好处。
注意:结构体变量可以写可不写,但是后面的分号不能省略。

2.2 定义结构体的特殊形式

匿名结构体:没有结构名,它只能使用一次,用过一次就不能再使用。

struct 
{
	类型 变量名;
	类型 变量名;
	...
} 结构变量;

如下例所示

//代码1
struct 
{
	char b;      
	char name[20];        
	int a;         
}x;

//代码2
struct 
{
	char b;      
	char name[20];        
	int a;         
}a[10],*p;

不能把变量x的地址放到*p中去。匿名结构体的成员虽然一样,但是在编译器看来,他们的类型是不一样的,所以编译器会报错(不兼容)。

3. 结构体的初始化

在对结构体变量初始化时,要对结构体成员一 一赋值,不能跳过前面成员变量,而直接给后面成员赋初值,但是可以只赋值前面几个,对与后面未赋值的变量,如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即 ’\0’。

3.1 定义时直接赋值

struct student
{     
	char name[20];      
	char sex;  
	int num;         
}stu1={"zhangsan",'m',1234};
或者
struct student
{     
	char name[20];  
	char sex;      
	int num;         
};
struct student stu1={"zhangsan",'m',1234};

注意:字符为’ ’,字符串为" "。

3.2 定义结构体之后逐个赋值

struct student
{     
	char name[20];  
	char sex;      
	int num;         
}stu;
int main()
{
	stu.name="zhangsan";
	stu.sex='m';
	stu.num=1234;
	return 0;
}

3.3 定义之后任意赋值

struct student
{     
	char name[20];  
	char sex;      
	int num;         
}stu1;
int main()
{
	stu1.sex='m';
	stu1.num=1234;
	stu1.name="zhangsan";
	return 0;
}

这样写的好处时不用按照顺序来进行初始化,而且可以对你想要赋值的变量直接进行赋值,而不想赋值的变量可以不用赋值。
注意:如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了。

4. 结构体成员的访问

结构体成员访问操作符有 "·"和 “->”两种。

//"·"操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);

//"->"操作符
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps-
>id);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值