服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言结构体超详细讲解

C语言结构体超详细讲解

2022-11-08 13:56初学C语言者 C/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 结构体传参对比

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

C语言结构体超详细讲解

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

C语言结构体超详细讲解

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

C语言结构体超详细讲解

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

总结

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

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

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

原文链接:https://blog.csdn.net/taibudong1991/article/details/123968636

延伸 · 阅读

精彩推荐
  • C/C++c语言冒泡排序和选择排序的使用代码

    c语言冒泡排序和选择排序的使用代码

    算法中排序是十分重要的,而每一个学习计算机的都会在初期的时候接触到这种排序,下面这篇文章主要给大家介绍了关于c语言冒泡排序和选择排序使用的相...

    路在何方い12002022-11-02
  • C/C++C++17中的std::optional的具体使用

    C++17中的std::optional的具体使用

    这篇文章主要介绍了C++17中的std::optional的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    hzSomthing8292021-10-19
  • C/C++C语言 表、栈和队列详解及实例代码

    C语言 表、栈和队列详解及实例代码

    这篇文章主要介绍了C语言 表、栈和队列详解及实例代码的相关资料,需要的朋友可以参考下...

    C语言中文网7912021-04-29
  • C/C++Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

    Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

    这篇文章主要介绍了Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例,需要的朋友可以参考下...

    吓人的猿4602021-08-25
  • C/C++C++快速排序的分析与优化详解

    C++快速排序的分析与优化详解

    这篇文章主要介绍了C++快速排序的分析与优化,非常经典的算法,分析也较为详尽,需要的朋友可以参考下...

    C++教程网4992021-01-27
  • C/C++华为面试题答案找出最大长度子字符串

    华为面试题答案找出最大长度子字符串

    华为面试题:找出最大长度子字符串,打印并且返回长度。 例如 str = "abc123abcd234abcdefgha324adsdawqdasdaseqqwe345abchded",看下面的代码实现吧...

    C语言教程网9302021-01-11
  • C/C++C和指针小结(推荐)

    C和指针小结(推荐)

    下面小编就为大家带来一篇C和指针小结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧...

    C语言教程网5012021-04-06
  • C/C++C++11中union的使用方法示例

    C++11中union的使用方法示例

    这篇文章主要给大家介绍了关于C++11中union的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    源代码6142021-07-02