C语言自定义变量类型结构体理论:从初见到精通(上)

目录

​编辑

C语言自定义变量类型结构体理论:从初见到精通

结构体的特点

一。结构体的创建(声明)和初始化

1.结构体的声明。

2,结构体的创建和初始化。

二。结构体的使用和传参

三,匿名结构体(结构体的特殊声明方法)和结构体的重定义

到这里就结束了。感谢大家的收看。关于结构体的自引用,内存对齐,和位段相关的内容我将放在下一篇中为大家呈现。

码字不易,还请您多多点赞支持,非常感谢!


C语言自定义变量类型结构体理论:从初见到精通

结构体(Struct)是一种用户自定义的数据类型,允许将不同类型的数据组合成一个逻辑单元。它用于表示具有多个属性的实体,例如存储学生信息(姓名、年龄、成绩等)或几何图形(坐标、颜色等)。

结构体的特点

  • 复合数据类型:可包含多个不同类型的成员变量(字段)。
  • 内存连续:成员变量在内存中按声明顺序连续存储(可能存在内存对齐)。
  • 值类型:在赋值或传参时默认进行值拷贝(某些语言中可通过引用传递)。

一。结构体的创建(声明)和初始化

1.结构体的声明。

先上代码案例

objectivec 复制代码
struct STR
{
int a;
char b;
double c;
};

如图:结构体的组成部分

1,关键字 struct

2,结构体类型名字

3,结构体成员变量({成员列表})

4,结构体临时创建变量({变量列表})

2,结构体的创建和初始化。

先上代码

objectivec 复制代码
struct STR B1 ={123,'cifang',3.14};

此为方法一 :我们创建一个struct STR 类型的结构体变量B1,然后对他的成员变量一一对应地进行初始化。

objectivec 复制代码
struct STR B2={.b='cifang',.a=100,.c=3.256};

此为方法二 :我们通过结构体成员访问操作符".",访问每一个结构体成员变量然后对他们进行初始化:具体格式参考如上。

objectivec 复制代码
 struct tag
 {
 member-list;
 }variable-list;

**结构体创建的另外一种方法:**如图,在结构体变量tag创建之时在variable-list(变量列表)创建变量。

创建结构体指针类型:实际上在后大括号后加一个*表示指针即可。

二。结构体的使用和传参

我们这里以打印结构体为例子;

OK,先认识两个结构体成员访问操作符:"."和"->"

objectivec 复制代码
 struct S
 {
 int data[1000];
 int num;
 };
void print2(struct S* ps)//①
 {
 printf("%d\n", ps->num);//②
 }
 

如图,这是一个不完整的代码:

在①处:我们通过某个函数传递某个结构体的指针给一个同类型结构体指针ps

在②处:我们通过ps这个指针找到这个结构体中的num成员。

由此可见:操作符"->"的作用是通过结构体的指针找到结构体的成员

objectivec 复制代码
 struct S
 {
 int data[1000];
 int num;
 }
void print1(struct S s)
 {
 printf("%d\n", s.num);
 };

如图:同样是一个不完整的代码:

这次,我们改变传址为传值方法。print1函数接收后用"."找到成员num。(事实上这非常简单)

由此:我们同时也了解到了两者对应的不同应用场景。传值和传址。

而传址和传值这两种方法比较一下,实际上不难的出结论:

传址比传值要好的多

原因:函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。

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

所以我们得出这样一个结论: 结构体传参的时候,要传结构体的地址。

三,匿名结构体(结构体的特殊声明方法)和结构体的重定义

objectivec 复制代码
​
struct
 {
 int a;
 char b;
 float c;
 }p1,p2;

​

可见:以上这个结构体没有名称,这种结构体被称为匿名结构体,又叫做结构体的不完全声明。

**特点一:**匿名结构体类型只能在其变量列表中创建变量且只能这么做。

也就是说:匿名结构体在程序中只能使用一次,如果还要创建同样的变量就必须再次创建这样一个结构体。

特点二:先看代码

objectivec 复制代码
struct
 {
    int a;
    char b;
    float c;
 }x;

 struct
 {
    int a;
    char b;
    float c;
 }a[20], *p;

p = &x;

看代码,可能我们认为p和&x是一样的,但事实上他们并不相同:

**这就是匿名结构体的特点二:**匿名结构体之间各不相同,即使创建了完全相同的menmbers,也会被编译器认为是不相同的结构体。

于是:我们为了解决这些问题:最终引出结构体重命名:

objectivec 复制代码
typedef struct
 {
 int data;
 }Node;

到这里就结束了。感谢大家的收看。关于结构体的自引用,内存对齐,和位段相关的内容我将放在下一篇中为大家呈现。

码字不易,还请您多多点赞支持,非常感谢!

相关推荐
了一梨17 小时前
在Ubuntu中配置适配泰山派的交叉编译环境
linux·c语言·ubuntu
郑州光合科技余经理17 小时前
同城系统海外版:一站式多语种O2O系统源码
java·开发语言·git·mysql·uni-app·go·phpstorm
CQ_YM18 小时前
数据结构之单向链表
c语言·数据结构·链表
一只乔哇噻18 小时前
java后端工程师+AI大模型开发进修ing(研一版‖day60)
java·开发语言·人工智能·学习·语言模型
LNN202218 小时前
Linuxfb+Qt 输入设备踩坑记:解决 “节点存在却无法读取“ 问题
开发语言·qt
foxsen_xia18 小时前
go(基础06)——结构体取代类
开发语言·算法·golang
巨人张19 小时前
C++火柴人跑酷
开发语言·c++
ID_1800790547319 小时前
基于 Python 的 Cdiscount 商品详情 API 调用与 JSON 核心字段解析(含多规格 SKU 提取)
开发语言·python·json
悟能不能悟19 小时前
Caused by: java.sql.SQLException: ORA-28000: the account is locked怎么处理
java·开发语言
亦是远方19 小时前
南京邮电大学使用计算机求解问题实验一(C语言简单编程练习)
c语言·开发语言·实验报告·南京邮电大学