首页 > 其他分享 >10.【C语言详解】结构体

10.【C语言详解】结构体

时间:2022-12-04 16:58:51浏览次数:49  
标签:10 20 struct name int C语言 Stu 详解 结构

结构体的声明

什么是结构

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

结构体的声明

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

结构体的作用

我们想用一个变量描述一个人,那如何实现呢?

C语言提供给我们的基础类型中,都是只能描述某一个方面。

然而人或者其他的复杂对象是多元的,需要很多变量去描述特征,那么结构体就能做到这件事。

例如描述一个学生:

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

结构成员的类型

结构成员的类型可以是C语言提供给我们的基础类型,也可以是另一个结构体。

注意:这个结构体不能是结构体本身,否则会形成递归。

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

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};//结构体嵌套初始化

初始化方式与数组有些相似,不过数组初始化时括号中元素的类型都是相同的,结构体则不受限制。

各个成员的初始化方式还是与普通类型初始化方式相同,不过是用大括号括在一起(注意顺序要对应)。

结构体成员的访问

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

例子:

image-20220518224953492

struct Stu
{
	char name[20];
	int age;
};

成员有name和age,那么如何访问它们呢?

使用.操作符

例如:

struct Stu s;
strcpy(s.name, "songxin");
s.age = 20;

直接通过结构体变量名去访问。

结构体的指针可以访问结构体吗?

->操作符

struct Stu* ps = &s;
//方法一:
strcpy((*s).name, "songxin");
(*s).age = 20;
//方法二:
strcpy(s->name, "songxin");
s->age = 20;

可以理解为结构体指针指向的那个东西的某个成员ps->某成员

结构体传参

函数传参方式通常有两种:

  1. 传值
  2. 传地址

结构体也不例外。

struct S
{
	int data[1000];
	int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
	printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
	printf("%d\n", ps->num);
}
int main()
{
	print1(s);  //传结构体
	print2(&s); //传地址
	return 0;
}

到底哪种好一些呢?

从两个方面看:

  1. 效率

    • 如果将整个结构体的值传过去,如果结构体过于复杂,那么开销过于巨大

    • 传指针,无论结构体有多么复杂,最终传指针只需要四个字节或者八个字节。

  2. 需要改变结构体值的函数

    • 传值,那么形参只是一份原变量的拷贝,函数体内改变不会影响实际参数。

上面的 print1 和 print2 函数哪个好些?
答案是:首选print2函数。
原因:

函数传参的时候,参数是需要压栈的。

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

结论:

结构体传参的时候,要传结构体的地址。

标签:10,20,struct,name,int,C语言,Stu,详解,结构
From: https://www.cnblogs.com/ncphoton/p/16950153.html

相关文章

  • 11.C语言实现【N子棋】
    C语言实现一个大家小时候都玩过的小游戏的进阶版本,不止是三子棋,可以根据玩家需要设定棋盘大小。的可读性,我将源码分为了三个部分,分别是源文件test.c、game.c、game.h。tes......
  • 16.【C语言进阶】动态内存管理
    为什么存在动态内存分配栈区上的内存开辟intval=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节的连续空间这样直接在函数体中开辟内存......
  • 15.【C语言进阶】自定义类型
    结构体的声明常规的结构的声明太过简单常见,不再过多阐述。特殊声明在声明结构体的时候可以不完全的声明struct{ inti; doubled; charc;}x;struct{ inti;......
  • 13.【C语言进阶】数据的存储
    数据基本类型为什么会有不同的类型,这些类型有内存大小上的差异,那么他们还有什么差异呢?在内存中开辟空间的大小读取内存空间方式的差异 char//字符类型short//......
  • 14.【C语言进阶】指针
    简介指针的概念指针是个变量,用来存储地址。指针的大小只与是64位平台还是32位平台有关,与指针类型无关。指针类型决定了指针的解引用权限和读取方式。指针+-正数与指......
  • 19.C语言实现【通讯录】
    简单功能展示增加联系人功能。按照姓名排序功能。保存文件,重新启动重新加载功能。头文件contact.h//文件保存版#include<stdio.h>#include<string.h>#include<s......
  • 18.【C语言进阶】程序的编译
    程序的翻译环境和执行环境在ANSIC的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行......
  • 1032. 游戏
    题目链接1032.游戏狂野飙车是小\(L\)最喜欢的游戏。与其他业余玩家不同的是,小\(L\)在玩游戏之余,还精于研究游戏的设计,因此他有着与众不同的游戏策略。小\(L\)计......
  • C Primer Plus 10.13第13题的一点想法
    在网上看了一些网友的答案,不是很满意!于是自己写了一个#include<stdio.h>#include<ctype.h>voidshow_arr(intarr[][5],intn);voidstore_date(doublearr[][5])......
  • 初识C语言(结构)
    前言:C语言是一种结构化的程序设计语言。对于新手来说要想学好一门编程语言,除了要了解编程的相关知识,更要了解其结构。“万层高楼平地起”结构就是地基中到比较重要的一环,所......