【C语言】结构体详解

现实生活中一个事物,会有许多属性连接起来。而C语言引入一种构造数据类型------结构体

将属于一个事物的多个数据组织起来以体现其内部联系。

一、结构体类型的定义

结构体类型 是一种 构造类型,它是由若干成员组成的,每个成员可以是一个基本数据类型或者是一个构造类型。

结构体类型的名字 是由一个关键字 struct 和 结构体名 组成的

结构体定义的一般形式:

struct 结构体类型名

{

类型说明符1 成员名1;

类型说明符2 成员名2;

...

};

cpp 复制代码
struct Stu 
{
	int age;
	int ID;
	char name[10];
};

typedef 类型重命名

注意:

  1. struct 是结构体关键字,不能省略。结构体类型名可以省略,称为无名结构体。结构体成员可以是任何基本数据类型,也可以是数组和指针类型
  2. 定义结构体类型的语句要以**;**结束,注意 {} 后的 ;
  3. 在编译时,系统不对定义的结构体类型分配内存空间
  4. 结构体类型与变量一样,作用范围也有全局和局部之分

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

cpp 复制代码
struct Point
{
	int x;
	int y;
}p1;
struct Point p2;

(1)先定义结构体类型,再定义结构体变量

cpp 复制代码
struct Stu 
{
	int age;
	char name[10];
};
int main()
{
	//struct 结构体类型的名称 结构体变量名的列表;
	struct Stu stu1,stu2;
	return 0;
}

(2)定义结构体类型的 同时 定义结构体变量

struct 结构体类型名

{

成员列表;

}结构体变量名的列表;

cpp 复制代码
struct Point
{
	int x;
	int y;
}p1,pn;

(3)直接定义结构体变量

cpp 复制代码
struct 
{
	int age;
	int num;
	char sex;
}s1,s2;

初始化可以指定成员初始化

三、结构体成员的访问

1.结构体变量访问成员

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

cpp 复制代码
#include<stdio.h>
#include<string.h>
struct Stu
{
	int age;
	char name[10];
};
int main()
{
	struct Stu s;
	s.age = 18;
	strcpy(s.name,"zhangsan");
	printf("%s %d",s.name,s.age);
	return 0;
}

【结果】zhangsan 18

从调试上我们也可以看到

2.结构体指针访问指向变量的成员

cpp 复制代码
#include<stdio.h>
struct Stu
{	
	char name[10];
	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 = {"zhangsan",18};
	Print(&s);
	return 0;
}

如果只是打印成员,可以不传址

(建议传址,因为运行效率高)

四、结构体传参

cpp 复制代码
#include<stdio.h>
struct S 
{
	int data[100];
	int num;
};
struct S s = { {1,2,3},100 };
//结构体传参
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;
}

【结果 】100 100

根据上方代码 print2函数要好一些

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

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

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

相关推荐
Monly212 分钟前
Java:修改打包配置文件
java·开发语言
我命由我1234523 分钟前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
island131432 分钟前
CANN ops-nn 算子库深度解析:核心算子(如激活函数、归一化)的数值精度控制与内存高效实现
开发语言·人工智能·神经网络
xcLeigh41 分钟前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh41 分钟前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics
秋邱1 小时前
用 Python 写出 C++ 的性能?用CANN中PyPTO 算子开发硬核上手指南
开发语言·c++·python
wenzhangli72 小时前
ooderA2UI BridgeCode 深度解析:从设计原理到 Trae Solo Skill 实践
java·开发语言·人工智能·开源
灵感菇_2 小时前
Java 锁机制全面解析
java·开发语言
wazmlp0018873692 小时前
python第三次作业
开发语言·python
娇娇乔木2 小时前
模块十一--接口/抽象方法/多态--尚硅谷Javase笔记总结
java·开发语言