初识结构体1

1.结构体声明与定义

- 为什么有结构体
计算机是为了解决人生活上的问题,当生活中需要记录一个人的信息时,需要记录这个人的不同类型的信息。比如名字,年龄,住址,电话等等。这是就形成了结构体。

结构体是一些相同或者不同类型变量的集合,这些变量称为成员变量。
结构体成员可以是常量,数组,指针,或者其它结构体。

- 结构体的声明
一般形式:
struct 结构体名{
结构体成员
};
此时的 struct 结构体名 (可自己定义) 相当于 结构体类型。例如整形类型 int,字符类型 char等。
当结构体类型过长时,一般可以用typedef 进行类型重命名。

- 结构体定义

例如定义一个学生信息的结构体。

struct student{
	char name[16];
	int age;
	char telphone[16];
};
//typedef对结构体类型重命名
typedef struct student{
	char name[16];
	int age;
	char telphone[16];
}stu_s;//stu_s 相当于struct student结构体类型

- 结构体初始化
利用上面定义的学生结构体信息。

	struct student t = { "Tom", 19, "13677777777" };
	stu_s j = { "Jim", 18, "17699999999" };//typedef重定义后可以这样使用

此时定义了两个结构体变量 t和j。
注意:结构体变量可以整体初始化,不可以整体赋值。

	stu_s j ;
	j = { "Jim", 18, "17699999999" };//错误

2.结构体成员的访问

结构体访问可以通过两种方式访问。

- 利用结构体直接用‘.’点操作符访问。
例如:

#include<stdio.h>
struct student{
	char name[16];
	int age;
	char telphone[16];
};

int main(){
	struct student t = { "Tom", 19, "13677777777" };
	t.age = 20;
	strcpy(t.name, "Jim");
	printf("%s\n", t.name);
	printf("%d\n", t.age);
	return 0;
}

输出:
在这里插入图片描述
这样就实现了访问结构体成员name和age,并且实现了对这两个成员赋值。注意,由于name是字符串,不能直接对其赋值,要使用函数strcpy();

- 当一个结构体指针变量指向一个相同结构体类型的结构体时,可以通过‘->’指向操作符访问结构体成员。

#include<stdio.h>
struct student{
	char name[16];
	int age;
	char telphone[16];
};
int main(){
	struct student t = { "Tom", 19, "13677777777" };
	struct student *p = &t;
	printf("%s\n", p->name);
	printf("%d\n", p->age);
	printf("%s\n", (*p).name);
	printf("%d\n", (*p).age);
	return 0;
}

输出:
在这里插入图片描述
这里*p就是t,此时也可以使用‘.’点操作符访问结构体成员。

3.结构体传参

调用函数时要在栈中开辟空间形成栈帧,当结构体进行传参,如果结构体过大时,会导致函数在栈中开辟空间过大,导致开销过大,性能下降。
所以,当结构体传参时,要传结构体的地址,用指针进行接收。

#include<stdio.h>
struct student{
	char name[16];
	int age;
	char telphone[16];
};

void print(struct student *p){
	printf("%s\n", p->name);
}


int main(){
	struct student t = { "Tom", 19, "13677777777" };
	print(&t);
	return 0;
}

输出:
在这里插入图片描述
PS:

#include<stdio.h>
struct student{
	char name[16];
	int age;
	char telphone[16];
};

int main(){
	struct student t = { "Tom", 19, "13677777777" };
	struct student *p = &t;
	printf("%p\n", &t);
	printf("%p\n", t.name);
	printf("%p\n", p);
	return 0;
}

输出:
在这里插入图片描述
结论:结构体地址与第一个结构体成员地址相同。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值