栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 -- 结构体基础

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 -- 结构体基础

C语言 -- 结构体基础
  • 结构体的声明
  • 结构变量的定义和初始化
  • 结构体成员的访问
  • 结构体传参

结构体的声明

结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。

结构体的声明:

struct tag
{
	number-list;
}variable-list;
  • 在C语言中要求number-list至少有一个成员变量,而C++允许空结构体
  • variable-list不是必须的。

考虑到兼容性问题,可以使用关键字typedef,假设定义一个学生类:

typedef struct Stu
{
	char name[10];
	int age;
	char sex[3];
	int stu_id;
}Stu; //注意分号不能丢

结构成员的类型:整型、字符、数组、指针,也可以是其他结构体。

结构变量的定义和初始化
typedef struct Stu
{
	char name[10];
	int age;
	char sex[3];
	char stu_id[5];
}Stu; //注意分号不能丢

typedef struct School
{
	char name[20];
	Stu stu; //结构体的嵌套
}School;

void main()
{
	//定义变量的同时进行初始化
	Stu stu1 = { "张三", 10, "男", "0324" };

	//结构体嵌套的初始化
	School sch = { "希望小学", {"李四", 8, "男", "2001"} };
}
结构体成员的访问
  • 结构体的成员变量是通过点操作符(.)访问的,例如:
#include
typedef struct Stu
{
	char name[10];
	int age;
	char sex[3];
	char stu_id[5];
}Stu; //注意分号不能丢

void print(Stu stu)
{
	printf("name: %snage: %dnsex: %snstu_id: %s", 
		stu.name, stu.age, stu.sex, stu.stu_id);
	printf("n----------------n");
}

void main()
{
	//定义变量的同时进行初始化
	Stu stu1 = { "张三", 10, "男", "0324" };
	print(stu1);

	Stu stu2;
	//stu2.name = "李四"; //这样是错误的
	strcpy(stu2.name, "李四");
	stu2.age = 19;
	strcpy(stu2.sex, "男");
	strcpy(stu2.stu_id, "0889");	
	print(stu2);
}
  • 结构体指针是通过(->)访问结构体的成员变量的,例如:
typedef struct Stu
{
	char name[10];
	int age;
	char sex[3];
	char stu_id[5];
}Stu; //注意分号不能丢

void print(Stu *pstu)
{
	printf("name: %snage: %dnsex: %snstu_id: %s",
		pstu->name, pstu->age, pstu->sex, pstu->stu_id);
	printf("n----------------n");
}

void main()
{
	//定义变量的同时进行初始化
	Stu stu1 = { "张三", 10, "男", "0324" };
	Stu* pstu1 = &stu1;
	print(pstu1);

	Stu stu2;
	Stu* pstu2 = &stu2;

	strcpy(pstu2->name, "李四");
	//当然 (*pstu2).name, 这种方式也可以
	//strcpy((*pstu2).name, "李四");
	pstu2->age = 19;
	strcpy(pstu2->sex, "男");
	strcpy(pstu2->stu_id, "0889");

	print(pstu2);
}
结构体传参

观察如下代码:

#include
typedef struct Stu
{
	char name[10];
	int age;
	char sex[3];
	char stu_id[5];
}Stu;

void print1(Stu *pstu) //结构体指针传参
{
	printf("name: %snage: %dnsex: %snstu_id: %s",
		pstu->name, pstu->age, pstu->sex, pstu->stu_id);
	printf("n----------------n");
}

void print2(Stu stu) //结构体传参
{
	printf("name: %snage: %dnsex: %snstu_id: %s",
		stu.name, stu.age, stu.sex, stu.stu_id);
	printf("n----------------n");
}

void main()
{

	Stu stu1 = { "张三", 10, "男", "0324" };
	Stu* pstu1 = &stu1;
	print1(pstu1);

	print2(stu1);
}

上面的代码中,print1和print2哪个函数好些?

首选是print1函数,原因如下:

函数传参的时候,参数是需要压栈的。如果传递一个结构体对象,因为结构体所占内存较大,参数压栈的系统开销就比较大。而如果是指针传参,指针的大小就是4字节或者8字节,开销较小。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/589837.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号