C语言结构体详解

目录

1.结构体的定义与产生

2.结构体的使用

1.结构体的创建

2.结构体变量的创建和使用

3.结构体与指针

4.结构体传参


1.结构体的定义与产生

结构体是什么?结构体本质上是一种数据类型,但它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。所以C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,也就是结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问和修改内部变量。

结构体是怎么产生的?在实际问题中,一组数据往往有很多种不同的数据类型。例如,登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄,char型的性别,float型的成绩。又例如,对于记录一本书,需要 char型的书名,char型的作者名,float型的价格。在这些情况下,使用简单的基本数据类型甚至是数组都是很困难的。而结构体则可以有效的解决这个问题。

2.结构体的使用

1.结构体的创建

我们可以直接创建一个结构体,内部可以包含数组,整形,浮点型...甚至还可以是另一个结构体,这些内部的数据类型称为结构体成员,但是要注意一定不要初始化任何一个结构体成员。

我们在创建结构体的同时还可以自由修改该结构体的名称。

typedef struct stu//前面加上typedef
{
	char name[10];
	int grade;
	double hight;
	double weight;
}stu;//后面加上修改后的名称(在分号里面)

. 注意:结构体创建时并不会在内存中开辟空间,创建结构体变量时才会开辟空间。

 这样我们便创建了一个结构体。

2.结构体变量的创建和使用

我们可以在创建结构体的同时创建结构体变量

struct Str
{	
	char name[20];
	int age;
	char id[9];
}s1,s2;//注意在分号里面呀!

 也可以在主函数内部创建,创建方法和普通的数据类型相同(数据类型+变量名称+赋值),使用时在变量名称后面加上一个点,再选择具体结构体成员

 

int main()
{
	stu s1 = { "小明", 140, 180.5, 144.5 };//字符串用“”,字符用‘’
	printf("%s\n", s1.name);
	printf("%d\n", s1.grade);
	printf("%.1f\n", s1.hight);
	printf("%.1f\n", s1.weight);
	return 0;
}

3.结构体与指针

 我们利用指针也可以访问结构体成员,方法和普通指针的使用方法类似:结构体类型+*ps=&结构体变量,与数组相同,这个地址也是结构体变量的第一个结构体成员的地址。

struct Str
{	
	char name[20];
	int age;
	char id[9];
};
int main()
{
	struct Str s1 = { "小明", 12, "20090102" };//成员变量.成员名
	struct Str*ps = &s1;//取出地址存入指针
	printf("%d", (*ps).age);
	printf("%d", ps->age);//同上等价
	printf("%d", s1.age);//同上等价
	return 0;
}

 我们使用指针时用指针变量p指向结构体成员,短横线+大于号就像一个形象的箭头,很好理解。

 

 

4.结构体传参

由于结构体包含多个数据类型,当我们将一个结构体变量传入函数中需要创建一个临时的拷贝,会占用较大空间,于是我们选择将结构体的地址传入函数,用指针完成对结构体变量的操作,避免了空间的占用。

typedef struct stu
{
	char name[10];
	int grade;
	double hight;
	double weight;
}stu;
void print(stu*ps1)
{
	printf("%s\n",ps1->name);
	printf("%d\n",ps1->grade) ;
	printf("%.1f\n", ps1->hight);
	printf("%.1f\n", ps1->weight);
}
int main()
{
	stu s1 = { "小明", 140, 180.5, 144.5 };
	print(&s1);
	return 0;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值