C语言结构体超详细讲解

 更新时间:2022年04月13日 18:53:19   作者:初学C语言者  
C语言结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等基本类型组成的。你可以认为结构体是一种聚合类型

前言

本文开始学习结构体的知识点,主要内容包括:

  • 结构体类型的声明
  • 结构体初始化
  • 结构体成员访问
  • 结构体传参

1、结构体的声明

1.1 结构的基础知识

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

1.2 结构的声明

struct tag
{
	member-list;
}variable-list;

下面几种方式都一样,定义了学生的结构体类型,内容包括:名字、年龄、性别、学号

//举例1
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
};//分号不能丢

//举例2
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s1,s2,s3;//定义了3个结构体类型的变量

//举例3
typedef struct stu stu;

//举例4
typedef struct stu
{
	char name[20];
	int age;
	char sex[8];
	float score;
}stu;

int main()
{
	struct stu stu4;//局部变量
	struct stu stu5;
	stu stu6;//全局变量
	return 0;
}

1.3 结构成员的类型

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

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

struct Point
{
	int x;
	int y;
}p1; //声明类型的同时定义变量p1

struct Point p2; //定义结构体变量p2

//初始化:定义变量的同时赋初值。
struct Point p3 = { x, y };

struct Stu //类型声明
{
	char name[15];//名字
	int age; //年龄
};
struct Stu s = { "zhangsan", 20 };//初始化

struct Node
{
	int data;
	struct Point p;
	struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化

struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

2、结构体成员的访问

2.1 点操作符访问

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

struct S s;
strcpy(s.name, "zhangsan");//使用.访问name成员
s.age = 20;//使用.访问age成员

2.2 ->操作符访问

指向一个结构体的指针,结构体指针访问指向变量的成员,变量名 ->成员

struct Stu
{
	char name[20];
	int age;
};
void print(struct Stu* ps)
{
	printf("name = %s age = %d\n", (*ps).name, (*ps).age);
//使用结构体指针访问指向对象的成员
	printf("name = %s age = %d\n", ps->name, ps->age);
}

3、结构体传参

3.1 参数是结构体类型的变量

struct point
{
	int x;
	int y;
}p1 = {10,20};

struct s//结构体
{
	char c;
	struct point sp;
	double d;
	char arr[20];//字符串
};

void print1(struct s ss)//传参结构体
{
	printf("%c\n", ss.c);
	printf("%d\n", ss.sp.x);
	printf("%d\n", ss.sp.y);
	printf("%lf\n", ss.d);
	printf("%s\n", ss.arr);
}
int main()
{
	struct point p1 = { 100, 200 };//定义1个变量,并初始化
	struct s ss = { 'w',{100,20},5.5,"hello" };//初始化
	ss.c = 'b';
	ss.sp.x = 1000;
	ss.sp.y = 2000;
	ss.d = 3.14;
	//ss.arr = "wolrd";错误的方法
	strcpy(ss.arr, "world");//字符串赋值函数
	print1(ss);//打印结构体变量
}

3.2 参数是结构体类型的变量的地址

struct point
{
	int x;
	int y;
}p1 = {10,20};

struct s
{
	char c;
	struct point sp;
	double d;
	char arr[20];//字符串
};
void print2(struct s* ss)//传参地址
{
	printf("%c\n", ss->c);
	printf("%d\n", ss->sp.x);
	printf("%d\n", ss->sp.y);
	printf("%lf\n", ss->d);
	printf("%s\n", ss->arr);
}
int main()
{
	struct s ss = { 'w',{100,20},5.5,"hello" };//初始化
	ss.c = 'b';
	ss.sp.x = 1000;
	ss.sp.y = 2000;
	ss.d = 3.14;
	//ss.arr = "wolrd";错误的方法
	strcpy(ss.arr, "world");
	print2(&ss);//打印结构体变量
}

3.3 结构体传参对比

上面两种函数实现的效果一样,见下图:

在这里插入图片描述

函数print1接受的是结构体类型变量,是形参,另外开辟了空间,将实参拷贝了一份,占用内存空间大

在这里插入图片描述

- 函数print2接受的是结构体类型的地址,定义结构体类型的指针接收地址,只开辟了空间存放地址,占用内存空间小

在这里插入图片描述

**要注意:**函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。因此,结构体传参的时候,要传结构体的地址,即函数 print2 比函数 print1 效果好。

总结

结构体内容较少,要牢记定义形式,和传地址的用法。

下一篇将学习一些VS的调试技巧,编程出现bug,通过调试能发现问题,并改进程序,这一步非常重要。在学语言的同时,适当的学习工具的使用,能够达到事半功倍的效果。

到此这篇关于C语言结构体超详细讲解的文章就介绍到这了,更多相关C语言 结构体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈QT内存泄漏

    浅谈QT内存泄漏

    本文主要介绍了浅谈QT内存泄漏,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++实现LeetCode(16.最近三数之和)

    C++实现LeetCode(16.最近三数之和)

    这篇文章主要介绍了C++实现LeetCode(16.最近三数之和),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ 函数指针详细总结

    C++ 函数指针详细总结

    这篇文章主要介绍了C++ 函数指针内容,下面文章围绕C++ 函数指针的相关资料展开详细内容,包括函数指针的进阶内容,需要的朋友可以参考一下,希望对大家有所帮助
    2021-11-11
  • C语言关于时间复杂度详解

    C语言关于时间复杂度详解

    大家好,本篇文章主要讲的是C语言关于时间复杂度详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C/C++详解实现二层转发

    C/C++详解实现二层转发

    数据链路层是开放系统互连 (OSI) 模型中的第二层,该层用于通过 LAN 等单一网络进行通信的节点,第二层数据包不能从一个网络传输到另一个网络。而二层转发是根据报文的目的MAC直接进行转发,转发过程中不用对报文的头部做任何的修改
    2022-05-05
  • C语言中的自定义类型之结构体与枚举和联合详解

    C语言中的自定义类型之结构体与枚举和联合详解

    今天我们来学习一下自定义类型,自定义类型包括结构体、枚举、联合体,小编觉得挺不错的,现在就分享给大家,也给大家做个参考
    2022-06-06
  • C++ Boost Assign超详细讲解

    C++ Boost Assign超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-12-12
  • C++ string字符串的使用和简单模拟实现

    C++ string字符串的使用和简单模拟实现

    C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数和字符串是分离的,本文给大家介绍了C++ string字符串的使用和简单模拟实现,感兴趣的朋友可以参考下
    2024-06-06
  • C语言打印各种图案实例代码

    C语言打印各种图案实例代码

    大家好,本篇文章主要讲的是C语言打印各种图案实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言实现二叉树的搜索及相关算法示例

    C语言实现二叉树的搜索及相关算法示例

    这篇文章主要介绍了C语言实现二叉树的搜索及相关算法,结合具体实例形式分析了基于C语言创建、遍历、搜索等相关算法与实现技巧,需要的朋友可以参考下
    2017-06-06

最新评论