初识结构体

目录

1.结构体的声明

2.结构体成员的访问

3.结构体传参


1.结构体的声明

1.1结构体的基础知识

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

1.2结构的声明

struct tag//类型名
{
    member-list;//成员变量
}variable-list;//变量列表 

//结构体类型的声明
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[8];//性别
	float score;//成绩

}s1,s2,s3;
//s1,s2,s3是通过struct Stu类型创建的变量
//s1,s2,s3是全局变量

//typedef 类型重定义/重命名

typedef struct Stu Stu;

int main()
{
	//s4,s5是局部变量
	//struct Stu才是结构体类型,不能随便省略struct
	struct Stu s4;
	struct Stu s5;
    Stu s6;
	return 0;
}
//第二种方法
typedef struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[8];//性别
	float score;//成绩

}Stu;

int main()
{
	//s4,s5是局部变量
	//struct Stu才是结构体类型,不能随便省略struct
	struct Stu s4;
	struct Stu s5;
    Stu s6;
	return 0;
}

1.3结构成员类型

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

1.4结构体的变量定义和初始化

struct Point
{
	int x;
	int y;
}p1 = {10,15};

struct S
{
	char c;
	struct Point sp;
	double d;
	char arr[20];
};


int main()
{
	struct Point p = { 100,300 };
	struct S ss = { 'w',{100,20},5.5,"hello" }; 
	
	return 0;
}

2.结构体成员的访问

struct Point
{
	int x;
	int y;
}p1 = {10,15};

struct S
{
	char c;
	struct Point sp;
	double d;
	char arr[20];
};

void print1(struct S s)
{
	printf("%c\n", s.c);
	printf("%d %d\n", s.sp.x, s.sp.y);
	printf("%lf\n", s.d);
	printf("%s\n", s.arr);
}

void print2(struct S* ps)
{
	printf("%c\n", ps->c);
	printf("%d %d\n", ps->sp.x, ps->sp.y);
	printf("%lf\n", ps->d);
	printf("%s\n", ps->arr);
}


int main()
{
	struct Point p = { 100,300 };
	struct S ss = { 'w',{100,20},5.5,"hello" }; 
 	ss.c = 'b';//修改
	ss.sp.x = 1000;
	ss.sp.y = 55;
	ss.d = 4.44;
	strcpy(ss.arr, "world");//strcpy 字符串拷贝
 
	//printf("%c\n", ss.c);
	//printf("%d %d\n", ss.sp.x, ss.sp.y);
	//printf("%lf\n", ss.d);
	//printf("%s\n", ss.arr);

	//print1(ss);//打印struct S类型的变量
	
	print2(&ss);

	return 0;
}
 


//结构成员访问操作符
//.     结构体变量.结构体成员
//->    结构体指针->结构体成员

3.结构体传参

struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s);  //传结构体
print2(&s); //传地址
return 0;
}

上面的 print1 和 print2 函数哪个好些?

答案是:首选print2函数。

原因:

函数传参的时候,参数是需要压栈的。(压栈就是实参传递给形参)

如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的

下降。

结论:

结构体传参的时候,要传结构体的地址

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}

int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = Add(a, b);//先传b再传a

	return 0;
}

每一次函数调用都要在内存的栈区上开辟一块空间

栈区:局部变量(函数参数)

堆区:动态内存开辟(malloc free callcc realloc)

静态区:静态变量 全局变量

栈是一种数据结构

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hey pear!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值