C语言结构体超详细讲解

目录
  • 前言
  • 1、结构体的声明
    • 1.1 结构的基础知识
    • 1.2 结构的声明
    • 1.3 结构成员的类型
    • 1.4 结构体变量的定义和初始化
  • 2、结构体成员的访问
    • 2.1 点操作符访问
    • 2.2 ->操作符访问
  • 3、结构体传参
    • 3.1 参数是结构体类型的变量
    • 3.2 参数是结构体类型的变量的地址
    • 3.3 结构体传参对比
  • 总结

前言

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

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

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语言 结构体内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入浅出理解C语言初识结构体

    目录 1.定义和使用结构体变量 结构体的基础知识 自己建立结构体类型 struct 结构体名 类型名 成员名: 声明结构体的形式 结构体的初始化 2. 结构体成员的访问 3.结构体传参 1.定义和使用结构体变量 结构体的基础知识 结构是一些值的集合,这些值称为成员变量.结构的每个成员可以是不同类型的变量. 自己建立结构体类型 结构的成员可以是标量.数组.指针,甚至是其他结构体. struct 结构体名 {成员表列}:↓ 注意:结构体类型的名字由一个关键字 struct 和结构体名组合而成的(例如

  • 一起来看看C语言世界中的结构体

    目录 一.结构体的概念: 二.结构体变量的定义和初始化 结构体变量的定义 (1)单独定义 (2)混合定义(在定义结构体的同时定义结构体变量) 结构体变量的初始化 三.结构体变量的使用("."与"->"的使用) (1)"."的使用(1级运算符,结合方向从左到右): (2)"->"的使用(1级运算符,结合方向从左到右): 总结 一.结构体的概念: 结构体是由一批数据聚合而成的结构型数据. 引入结构体,程序设计人员就可以

  • C语言结构体(struct)的详细讲解

    目录 引言 1. 动态内存管理 2. 结构体 2.1 定义语法 2.2 定义示例 2.3 初始化 2.4 结构体赋值 2.5 结构体数组 2.6 结构体指针赋值 3. 学生管理系统 附:结构体变量的存储原理 总结 引言 当前文章介绍动态堆空间内存分配与释放,C语言结构体定义.初始化.赋值.结构体数组.结构体指针的相关知识点,最后通过一个学生管理系统综合练习结构体数组的使用. 1. 动态内存管理 C语言代码----->编译----->链接------>可执行的二进制文件(windows下x

  • C语言结构体详细图解分析

    目录 结构体 结构体的声明 结构体变量的定义和初始化 结构体大小计算 结构体 结构是一些值的集合,这些值称为成员变量.结构的每个成员是不同类型的变量. 为什么要有结构体 比如说,描述一个学生时,需要有 名字 性别 年龄 身高 来一起描述,需要不同的变量,便有了结构体类型来描述 结构体的声明 struct tag { member-lest//成员列表 }variable-list;//变量列表 例如一个学生 struct stu { char name[20]; char sex[5]; int

  • C语言 详细分析结构体的内存对齐

    目录 一.结构体 二.结构体内存对齐 1.非嵌套结构体的大小 2.含嵌套结构体的大小 三.为什么要内存对齐 1.平台原因(移植原因) 2.性能原因 一.结构体 结构体 (struct)是一种数据结构,可以包含很多数据类型,可以实现比较复杂的数据结构. 常见的int,char类型变量,我们可以一眼看出占多少字节,但对于结构体,可就有点难度了. 让我们来猜猜以下程序的输出 struct S1 { char c1; int i; char c2; }; struct S2 { char c1; cha

  • C语言的结构体你了解吗

    目录 结构体内存对齐 结构体传参 结构体实现位段 什么是位段 位段在内存中的存储 位段的问题 总结 结构体内存对齐 当我们创建一个结构体变量时,内存就会开辟一块空间,那么在创建结构体变量时内存到底是怎么开辟空间的呢?会开辟多大的空间呢?我们来看一下下面的代码 struct S { int i; char c; char b; }; struct G { char c; int i; char b; }; int main() { struct S u; struct G g; printf("%

  • C语言中结构体实例解析

    目录 一.结构体定义 二.实例演示 结构体作为函数参数 结构体指针 三.typedef struct 和 struct的区别 1.声明不同 2.访问成员变量不同 3.重新定义不同 总结 一.结构体定义 C语言结构体由一系列相同或者不同类型的数据构成的集合,结构体类型就是以struct关键字定义的数据类型. 结构体的格式如下: struct 结构名称 { 结构体所包含的数据成员,包括变量数组等 } 结构变量 ;//结构变量可以指定一个或多个 举例: struct Student { char na

  • C语言详解热门考点结构体内存对齐

    目录 一.为什么存在内存对齐 二.如何计算?(考点) 三.手撕代码 一.为什么存在内存对齐 大部分的参考资料都是如是说的: 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的:某些硬件平台只能再某些地址处取某些特定类型的数据,否则抛出硬件异常. 2.性能原因:数据结构(尤其是栈)应该尽可能地再自然边界上对齐.原因在于,为了访问未对其的内存,处理器需要作两次内存访问:而对齐的内存访问仅需要一次访问. 总体来说:结构体的内存对齐是拿空间来换取时间的做法 二.如何计算?(考点)

  • C语言结构体超详细讲解

    目录 前言 1.结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2.结构体成员的访问 2.1 点操作符访问 2.2 ->操作符访问 3.结构体传参 3.1 参数是结构体类型的变量 3.2 参数是结构体类型的变量的地址 3.3 结构体传参对比 总结 前言 本文开始学习结构体的知识点,主要内容包括: 结构体类型的声明 结构体初始化 结构体成员访问 结构体传参 1.结构体的声明 1.1 结构的基础知识 结构是一些值的集合,这些值称为成

  • C语言 struct结构体超详细讲解

    目录 一.本章重点 二.创建结构体 三.typedef与结构体的渊源 四.匿名结构体 五.结构体大小 六.结构体指针 七.其他 一.本章重点 创建结构体 typedef与结构体的渊源 匿名结构体 结构体大小 结构体指针 其他 二.创建结构体 先来个简单的结构体创建 这就是一个比较标准的结构体 struct people { int age; int id; char address[10]; char sex[5]; };//不要少了分号. 需要注意的是不要少了分号. 那么这样创建结构体呢? s

  • C语言结构体简单入门讲解

    结构体 定义:用于存储不同的数据类型,存储在同一块内存空间里面 关键字 struct 标签 结构体名称 成员 例如: struct student { char name[20]: char sex; int age; float grade; }: 结构体后面不要忘记加分号 结构体至少需要一个标签,证明身份 结构体的使用 .访问指针 →访问 #include <stdio.h> #include <string.h> struct student { char name[20];

  • C语言超详细讲解结构体与联合体的使用

    目录 结构体 offsetof-宏 位段 枚举 联合体(共用体) 结构体 结构体内存对齐问题: 当我们在计算结构体的大小时,我们便需要清楚的知道结构体内存对齐是什么. 存在内存对齐的原因可细分为两个: 平台原因: 不是所有的硬件平台都能方位任意地址上的任意数据:某些硬件平台只能在某些地址处取某些特定类型的数据,否则会抛出硬件异常. 性能原因: 首先内存对齐可以提高程序的性能,当访问未对其的内存空间时,有时候处理器需要进行两次访问,而当访问对齐的内存时,只需要一次就够了.这同时也被叫做 用空间换取

  • C语言自定义类型超详细梳理之结构体 枚举 联合体

    目录 一.什么是结构体 1.结构体实现 2.匿名结构体类型 3.结构体自引用 4.结构体的内存对齐 5.结构体位段  二.什么是枚举 1.枚举类型的定义 2.枚举的优点 三.联合(共用体) 1.什么是联合(共用体) 2.联合(共用体)的定义 3.联合(共用体)的初始化 总结 一.什么是结构体 结构是一些值的集合,这些值称为成员变量.结构的每个成员可以是不同类型的变量. //结构体声明 struct tag //struct:结构体关键字,tag:标签名,合起来是结构体类型(类型名) { memb

  • C语言数据结构超详细讲解单向链表

    目录 1.链表概况 1.1 链表的概念及结构 1.2 链表的分类 2. 单向链表的实现 2.1 SList.h(头文件的汇总,函数的声明) 2.2 SList.c(函数的具体实现逻辑) 2.2.1 打印链表 2.2.2 搞出一个新节点(为其他函数服务) 2.2.3 链表尾插 2.2.4 链表头插 2.2.5 链表尾删 2.2.6 链表头删 2.2.7 查找节点 2.2.8 在pos位置之前插入 2.2.9 在pos位置之后插入 2.2.10 删除pos位置 2.2.11 删除pos之后位置 2.

  • C语言 超详细讲解算法的时间复杂度和空间复杂度

    目录 1.前言 1.1 什么是数据结构? 1.2 什么是算法? 2.算法效率 2.1 如何衡量一个算法的好坏 2.2 算法的复杂度 2.3 复杂度在校招中的考察 3.时间复杂度 3.1 时间复杂度的概念 3.2 大O的渐进表示法 3.3 常见时间复杂度计算举例 4.空间复杂度 5. 常见复杂度对比 1.前言 1.1 什么是数据结构? 数据结构(Data Structure)是计算机存储.组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合. 1.2 什么是算法? 算法(Algorit

  • C语言超详细讲解数据结构中双向带头循环链表

    目录 一.概念 二.必备工作 2.1.创建双向链表结构 2.2.初始化链表 2.3.动态申请节点 2.4.打印链表 2.5.销毁链表 三.主要功能 3.1.在pos节点前插入数据 尾插 头插 3.2.删除pos处节点数据 尾删 头删 3.3.查找数据 四.总代码 List.h 文件 List.c 文件 Test.c 文件 五.拓展 一.概念 前文我们已经学习了单向链表,并通过oj题目深入了解了带头节点的链表以及带环链表,来画张图总体回顾下: 在我们学习的链表中,其实总共有8种,都是单双向和带不带

  • C语言超详细讲解队列的实现及代码

    目录 前言 队列的概念 队列的结构 队列的应用场景 队列的实现 创建队列结构 队列初始化 队列销毁 入队列 出队列 队列判空 获取队列元素个数 获取队列头部元素 获取队列尾部元素 总代码 Queue.h 文件 Queue.c 文件 Test.c 文件 前言 队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 队列和前文所学的栈

随机推荐