C语言集合(结构体)

一、结构体的定义

什么是结构体?
数组是相同元素的集合,结构体可以是不同类型的集合

(一)结构体的声明

以下示例,即声明了一个结构体,也创建了一个结构体variable_list。

struct tag         //结构体类型是struct tag
{
	member_list;  //成员变量列表
}variable_list;   //变量列表,注意要有分号

注意:区分创建一个结构体和对结构体类型重命名(typedef)

struct stu
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
}S1;

下面这个代码是对struct stu类型重命名为stu类型。

typedef struct stu
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
}stu;

stu S1;

(二)结构体成员的类型

成员类型:标量;数组;指针;甚至是其他结构体

struct school
{
	char name[10];
	int num;
};

struct stu
{
	char name[20];
	int age;
	int *p;
	struct school sc;
};

(三)结构体变量的定义和初始化

  1. 在结构体定义时就创建结构体变量并对其初始化,这个结构体变量就是全局变量。
struct school
{
	char name[10];
	int num;
}sc1 = {"NY",96};
  1. 定义之后,再初始化,注意结构体成员初始化的顺序。

按照顺序依次初始化:

struct stu
{
	char name[20];
	int age;
	int *p;
	struct school sc;
};

int main()
{
	struct stu s1 = { "Xiaoming",12,NULL,{"NY",96} };
	return 0;
}

依靠.成员名进行初始化:

struct stu
{
	char name[20];
	int age;
	int *p;
	struct school sc;
};

int main()
{
	struct stu s1 = { .name="Xiaoming",.p=NULL,.age=12,.sc={"NY",96} };
	return 0;
}

二、结构体成员的访问

注意:对结构体的数组成员进行访问时,传递的是数组首元素地址。

struct stu
{
	char name[20];
	int age;
	int *p;
	struct school sc;
};

int main()
{
	struct stu s1 = { .name="Xiaoming",.p=NULL,.age=12,.sc={"NY",96} };

	s1.age = 10;
	strcpy(s1.name, "Xiaohong");
	s1.name[0] = 'L';

	return 0;
}

结构体地址可以使用(*p).也可以使用p->

struct stu
{
	char name[20];
	int age;
	int *p;
	struct school sc;
};

int main()
{
	struct stu s1 = { .name="Xiaoming",.p=NULL,.age=12,.sc={"NY",96} };

	//s1.age = 10;
	//strcpy(s1.name, "Xiaohong");
	//s1.name[0] = 'L';

	struct stu* p = &s1;
	p->age = 10;
	p->name[0] = 'L';

	return 0;
}

三、结构体传参

注意:结构体传参要传结构体地址,传变量只会创建临时变量,出函数,临时变量销毁,不会对原结构体变量产生影响。另外,结构体过大,创建临时变量会导致系统开销过大。

struct stu
{
	char name[20];
	int age;
	int *p;
	struct school sc;
};

void print(struct stu* p)
{
	printf("%d", p->age);
}

int main()
{
	struct stu s1 = { .name="Xiaoming",.p=NULL,.age=12,.sc={"NY",96} };
	struct stu* p = &s1;
	print(p);

	return 0;
}
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值