首页 > 其他分享 >【C语言初阶】结构体

【C语言初阶】结构体

时间:2024-04-09 16:03:07浏览次数:29  
标签:初阶 name age struct C语言 Stu 变量 结构

【C语言初阶】结构体

文章目录

7-结构体

目录

文章目录


本章目标

学会声明一个结构体并能使用结构体定义变量,了解什么是结构体传参。

本章重点

1.结构体类型的声明

2.结构体的初始化

3.访问结构体成员

4.结构体传参


正文


一、结构体的声明

1 结构体的基础知识

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

在C语言中,结构体类型是一种用户自定义的复合数据类型


2 结构体的声明

2.1 介绍

示例

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

说明

1 tag 表示结构名struct tag结构体类型名

2 member-list; 表示结构体成员列表variable-list; 表示结构体变量列表


2.2 声明示例

描述一个学生结构体类型

示例

typedef struct Stu
{
	char name[20];	//名字
	int age;		//年龄
	char sex[5];	//性别
	char id[20];	//学号
}Stu;

说明

1 typedef struct Stu {...}Stu; :将 struct Stu 重命名为 Stu ,这样就可以简化代码;

  在C语言中,struct 关键字是不能省略的,但可以通过 typedef 重命名简化写法


3 结构体成员类型

结构体的成员可以是:变量、数组、指针、其他结构体(结构体变量)


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

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

代码示例

#include<stdio.h>

int main()
{
	//结构体变量的定义和初始化

	struct Point //类型声明
	{
		int x;
		int y;
	}p1;		 //声明类型的同时定义变量p1
	struct Point p2;//定义结构体变量p2
	struct Point p3 = { 0, 0 };//初始化:在定义变量的同时赋予初始值


	struct Stu
	{
		char name[15];//名字
		int age;	  //年龄
	};
	struct Stu s = { "张三", 20 };//按成员顺序的初始化
	struct Stu s1 = { .age = 18, .name = "张三" };//指定成员顺序的初始化


	struct Node
	{
		int data;
		struct Point;
		struct Node* next;
	}n1 = { 10,{4,5}, NULL };//在结构体声明的同时创建变量并进行了初始化
	struct Node n2 = { 20,{5,6},NULL };//结构体嵌套初始化

	return 0;
}

解释说明

1 struct Stu s1 = { .age = 18, .name = "张三" };

  这种在结构体变量初始化时,可以不按照结构成员的顺序依次对成员进行赋值,此时就可以使用 . 操作符直接访问成员进行赋值


三、结构体成员的访问

1 结构体变量直接访问成员

结构体变量的成员是通过 . 操作符访问的。

代码示例

#include<stdio.h>

int main()
{
	//结构体变量访问成员
	
	//类型声明
	struct Stu
	{
		char name[20];
		int age;
	};
	//变量声明
	struct Stu s;
	strcpy(s.name, "张三");//使用.访问name成员
	s.age = 20;//使用.访问age

	return 0;
}

解释说明

1 声明变量的同时,会向内存申请空间

2 声明结构体变量:
声明结构体变量


2 结构体指针间接访问结构体变量的成员

可以通过指向结构体变量的结构体指针间接访问结构体变量的成员。

代码示例

#include<stdio.h>

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);//使用结构体指针访问指向对象的成员
}
int main()
{
	//结构体指针访问指向变量的成员

	struct Stu s = { .age = 20, .name = "张三" };
	print(&s);//结构体变量地址传参

	return 0;
}

解释说明

1 对结构体指针进行解引用 *ps 相当于是找到了其指向的结构体变量 s

(*ps).name  <-->  s.name
(*ps).age   <-->  s.age

2 ps->name, ps->age通过结构体指针间接访问结构变量的成员

3 void print(struct Stu* ps) 将形参设置为结构体指针,不会拷贝结构体变量的内容,减少了系统开销。


四、结构体传参

实参是结构体变量或者结构体变量的地址

代码示例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

struct S
{
	int data[100];
	int num;
};
struct S s = { {1,2,3,4},1000 };//全局结构体变量

//结构体变量传参
void print1(struct S s)
{
	printf(" .num = %d\n", s.num);
}
//结构体变量地址传参
void print2(struct S* ps)
{
	printf("->num = %d\n", ps->num);
}
//传值调用
void Set_S1(struct S ss)
{
	//scanf("%d", ss.num);//error
	//ss.data = { 10,15,20 };//error,表达式必须是可以修改的左值
	ss.num = 200;
}
//传址调用
void Set_S2(struct S* pss)
{
	pss->num = 200;
}
int main()
{
	//结构体传参
	print1(s);	//传值调用
	print2(&s);	//传址调用

	struct S ss = { 0 };
	Set_S1(ss);	//传值调用
	Set_S2(&ss);//传址调用

	print1(ss);	//传值调用
	print2(&ss);//传址调用

	return 0;
}

解释说明

1 实参传递结构体变量到被调用函数处,形参只是拷贝了一份具有相同值的新的结构体变量。

2 实参传递的是结构体变量,形参会重新创建一份新的结构体变量的空间来接收传递的数值
  如果传递的结构体变量过大,那么形参拷贝所需的空间和时间的开销会变大

3 实参传递的是结构体指针,那么形参只需拷贝一份指针变量系统开销会减少,同时也提高了效率

4 选 print2 函数更好,因为在函数传参的时候,形参是要压栈的

  如果传递的一个结构体对象过大,参数压栈的系统开销就会较大,会导致性能的下降


结构体传参

结构体传参的时候,一般要传结构体对象的地址,也就是地址传参


总结:

  本节介绍了什么是结构体;给出了结构体变量的声明和初始化以及如何访问结构体成员;最后指出结构体在传参时,最好传递的是结构体的地址。


感谢您的阅读!如有任何错误,欢迎您的批评指正!

标签:初阶,name,age,struct,C语言,Stu,变量,结构
From: https://blog.csdn.net/qq_43108974/article/details/137547574

相关文章

  • 面试中数据结构与算法——知识点最全总结(学完可应对一线大厂)
    各大厂历年高频面试题系列,以下为部分内容不包括全部:双指针类面试题括号类面试题回文类面试题递推类面试题树型dp类面试题区间dp类面试题背包dp类面试题排序相关面试题常见贪心面试题常见图算法面试题子数组类面试题子序列类面试题二分类面试题bfs与dfs类面试......
  • 【C语言】练习:比较十个数的大小
    初始化一个数组,使用for循环输入;把数组中的第一个数字,也就是下标为[0]的数字赋值给一个int类型的变量“max”;使用循环从arr数组中下标为[1]的数字开始对比,如果arr[1]>arr[0],则把arr[1]赋值给max;最后打印出最大数。intmain(){ intarr[10]; for(inti=0;i<10;......
  • [ida] 结构偏移
    IDA帮助:移位指针备忘定义__shifted()指针有时在二进制代码中,我们会遇到指向结构中间的指针。这样的指针通常不存在于源代码中,而是一个优化编译器可能会引入它们以使代码更短或更快。可以使用移位指针来描述此类指针。移位的指针是一个常规指针,其中包含有关名称的其他信......
  • 【C语言】练习:分数求和
    计算1/1-1/2+1/3-1/4+1/5……+1/99-1/100的值,打印出结果首先看题,分子不变为1,分母1-100;既然是分数计算,那结果肯定存在小数,所以在开始定义一个double类型的变量“num”;初始化一个int类型的变量“i”,使用for循环产出1-100的值;在for循环里使用if语句来判断分母是偶数......
  • C语言语法最后一个教案-教案21(预处理 · 头文件)
    最近给大家争取到一个深夜福利保证你在深夜手机刷到嘎嘎香~那就是 官方授权大流量卡缺点:月租太便宜 185GB~100分钟通话时长~长期套餐~畅想自由的气息流量自由的同时还拥有超长通话,而且免费领取。名额有限,咱们废话不多说直接上图。感兴趣的家人私我或者直接加微......
  • 【C语言】链表(原理+实现)
    目录一.链表概念二.链表实现1.创建新节点2.打印链表3.尾插、头插4.尾删、头删5.查找6.指定位置前插入7.指定位置后插入8.指定位置删除9.指定位置后删除 10.销毁链表三.完整代码一.链表概念链表是线性表的一种,与顺序表不同的是,链表在物理存储结构上不连续,在......
  • golang中结构体初始化的语法格式
    在Go语言中,结构体(struct)的初始化可以通过以下几种方式来进行:键值对初始化(字段名明确指定):当结构体字段很多或者你需要只初始化部分字段时,可以采用键值对的方式来初始化结构体。每个字段名后面跟一个冒号和它的值。typePersonstruct{NamestringAgeintC......
  • 数据结构----栈和队列详细操作完整代码(C语言)
    栈和队列是两种常用的,重要的数据结构栈和队列是限定插入和删除只能在表的“端点”进行的线性表栈和队列是线性表的子集(是插入和删除位置受限的线性表)栈定义:只能在表的一端(栈顶)进行插入和删除运算的线性表逻辑结构:与线性表相同,仍为一对一关系存储结构:用顺序栈或链栈存......
  • 数据结构--二叉树
    1.树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。如果将他的图画出来的话很像一棵树。1.1名词概念根结点:没有父结点(前驱节点)的结点;如上方A就是根结点父结点或双亲结点:如果这个结点下方还有结点(孩子节点)那么称这个结点为下方结点......
  • 【华为OD机试真题】218、寻找相似单词 | 机试真题+思路参考+代码分析(C语言、C++、Java
    文章目录一、题目......