6.C语言结构体

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

1.结构体的声明

 

以上图为例

结构体类型就是          struct student

结构体成员就是         char name[20]  ,int age,char sex[5]

结构体变量就是         s1,s2,s3

1.1结构体成员的类型

结构体成员可以是标量、数组、指针,甚至是其他结构体。

1.2类型的重命名

2.结构体变量的定义初始化

2.1结构体变量的定义

2.2结构体变量的初始化

3.结构体成员的访问

3.1结构体变量访问结构体成员

结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数

struct Stu
{
	char name[20];
	int age;
};

#include<string.h>
int main()
{
	struct Stu s1 = { 0 };
	//s1.name = "zhangsan";//错误的 name是数组名,数组名是数组首元素的地址,
	//strcpy(s1.name, "zhangsan");//这样是正确的
	char arr[] = { "zhangsan" };
	strcpy(s1.name, arr);      //把逗号左边字符串复制给右边,strcpy可以用数组名来操作
	printf("%s\n", s1.name);
	s1.age = 20;
	printf("%d\n", s1.age);
	return 0;
}

3.2结构体指针访问指向变量的成员

struct Stu
{
	char name[20];
	int age;
};

void print(struct Stu* p)
{
	printf("%s\n", p->name);  // 结构体可以直接用p->name来访问结构体成员
	printf("%s\n", (*p).name);//对指针变量p解引用得到的就是stryct Stu s
}

int main()
{
	struct Stu s = { "zhangsan",18 };
	print(&s);//结构体地址传参
}

4.结构体传参

4.1结构体传参(传值)

写一个函数打印结构体中的存放数据

struct Stu
{
	char name[20];
	int age;
};

void print(struct Stu s1)//函数创建结构体变量,把结构体变量s的值赋值s1
                         //然后打s1
{
	printf("%s %d", s1.name, s1.age);
}

int main()
{
	struct Stu s = { "zhangsan",18 };
	print(s);//这里就是直接传值,
	return 0;
}

4.2结构体地址传参

#include<string.h>
struct Stu
{
	char name[20];
	int age;
};

void set(struct Stu s1)
{
	strcpy(s1.name, "zahngsan");
	s1.age = 18;
}

void print(struct Stu s1)//函数创建结构体变量,把结构体变量s的值赋值s1
                         //然后打s1
{
	printf("%s %d", s1.name, s1.age);
}

int main()
{
	struct Stu s = { 0 };
	//写一个函数,给s中存放数据
	set(s);

	//写一个函数,打印s中的数据(前面刚刚写过)
	print(s);

	return 0;
}

非常明显这样写是错误的,在传参的时候,形参紧紧只是实参的一份临时拷贝,

对实参根本没用影响

正确做法

​
#include<string.h>
struct Stu
{
	char name[20];
	int age;
};

void set(struct Stu* p)//传递的是结构体变量s的地址,用指针接收
{
	strcpy((*p).name, "zhangsan");
	(*p).age = 18;//用解引用操作符通过地址找到结构体变量s
}


void print(struct Stu s1)//函数创建结构体变量,把结构体变量s的值赋值s1
						 //然后打s1
{
	printf("%s %d\n", s1.name, s1.age);
}

int main()
{
	struct Stu s = { 0 };
	//写一个函数,给s中存放数据
	set(&s);//这里应该用地址传参

	//写一个函数,打印s中的数据(前面刚刚写过)
	print(s);

	return 0;
}

​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值