初识结构体1

Posted 两片空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识结构体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;
}

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

以上是关于初识结构体1的主要内容,如果未能解决你的问题,请参考以下文章

初识C++之结构体

初识结构体1

初识Socket套接字结构体

网编之初识Socket套接字结构体

C语言初阶笔记初识结构体

C语言初阶笔记初识结构体