linux下c语言传输结构体,C语言中的结构体

本文详细介绍了如何在C语言中创建结构体、定义和使用结构体变量,包括初始化、引用、结构体数组及结构体指针的概念。重点讲解了结构体类型与变量的区别,以及如何通过指针操作结构体数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户自己建立自己的结构体类型

1、  定义和使用结构体变量

(1)、结构体的定义

C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体。

(2)、声明一个结构体类型的一般形式为:

Struct 结构体名

{ 成员列表 };

1、  定义结构体类型变量

前面的也只是搭建了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。

可以采取以下三种方法定义结构体类型的变量:

(1)、先声明结构体类型,再定义该类型的变量

c75588dee310f43e4b142c087f0b1c0f.png

(2)、在声明类型的同时定义变量

e2d1f704cffecbaff27113da6efc5325.png

上面这种定义的一般形式为:

179bbc2bb5e017ab8c58562a194031e0.png

(3)、不指定类型名而直接定义结构体类型变量

a1b708e7fc840db6f8c811a3dc6b8c56.png

注意:

1、  结构体类型和结构体变量是不同的概念,不要混同。区别:只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算;在编译时,对类型是不分配空间的,只对变量分配空间。

2、  结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。

3、  对结构体变量中的成员可以单独使用,它的作用与地位相当于普通变量。

1、  结构体变量的初始化与引用

在定义结构体变量时,可以对他进行初始化,即赋予初始值。

(1)、在定义结构体变量时可以对它的成员进行初始化。初始化列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的各成员。注意:对结构体变量初始化,而不是对结构体类型初始化。

39054f13c81404c7281747de0c8a3e67.png

(2)、可以引用结构体变量中成员的值,引用方式为:结构体变量名.成员名

84c5e2787dc3c68bffaf577939095733.png

“.”是成员运算符。它在所有的运算符中优先级最高。因此可以把student1.name作为一个整体来看待,相当于一个变量。

注意:不能企图输出结构体变量名来达到输出结构体变量所有成员的值。只能对结构体变量中的各个成员分别进行输入和输出。

(3)、如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低的一级的成员。只能对最低级的成员进行赋值、存取或运算。

(4)、对结构体变量的成员可以像普通变量一样进行各种运算。

1ca4154bb6e22f3f5e5457b64099f529.png

由于“.”运算符的优先级最高,因此student1.age++是对(student1.age)进行自加运算,而不是先对age进行自加运算。

(5)、同类的结构体变量可以互相赋值。

f1ba448e253d63d0bad47bb2a6aeecb8.png

说明:结构体变量的地址主要用作函数参数,传递结构体变量的地址。

==========================================================================

使用结构体数组

1、  定义结构体数组

(1)、定义结构体数组的一般形式是:

a、

41f581158cf3fa69d26e95c4eddee1e0.png

b.先声明结构体类型(如struct Person),然后再用此类型定义结构体数组:

727e7eb1b79b3503fa2a54ce9a899e6a.png

(2)、对结构体数组初始化的形式是在定义数组的后面加上:

0cbc425a3be08d6ee3562a1283dcc51e.png

==================================================================================

结构体指针

所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。

1、  指向结构体变量的指针

指向结构体变量的指针变量既可以指向结构体变量,也可以指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。

9f4a13b4888eb8afd1bcfcbb8035c1e4.png

说明:为了使用方便和直观,C语言允许把(*p).name用p->name来代替,“->”代表一个箭头,p->name表示p指向结构体变量中的name成员。同样,

(*p).name等价于p->name。“->”称为指向运算符。

如果p指向一个结构体变量stu,以下三种用法等价:

(1)、stu.成员名(如:stu.name);

(2)、(*p).成员名(如:(*p).name);

(3)、p->成员名(p->name)。

2、指向结构体数组的指针

可以用指针变量指向结构体数组的元素。

注意:

如果p的初值为stu,即指向stu的第一个元素,p加1后,p就指向下一个元素,

例如:

ea406fd218a30c975d2904fe614c34ea.png

请注意以上2点的不同。

(2)、程序定义了p,是一个指向struct Student类型对象的指针变量,它用来指向一个struct Student类型的对象,不应用来指向stu数组元素中的某一成员。例如下面的用法是不对的:

97e6cba7e63b2a64de2a68e009884869.png

编译时将给出“警告”信息,表示地址的类型不匹配,不要认为反正p是存放地址的,可以将任何地址赋给它。如果要将某一成员的地址赋给p,可以用强制类型转换。先将成员的地址转换成p的类型。例如:

f35c8462ee498c48376a783416c6f46d.png

此时p的值是stu[1]元素的name成员的起始地址。可以用“

8b31a90f8c48c9576dc9bc78a08bdd47.png ”输出stu[1]中成员name的值。但是,p仍保持原来的类型,如果执行“

fefa47a78c8d4011fd1eeaae373fbe0d.png ”,则会输出stu[2]中name的值。执行p++时,p的值增加了结构体struct Student的长度。

3、用结构体变量和结构体变量的指针作函数参数

将一个结构体变量的值传递给另一个函数,有3中方法:

(1)、用结构体变量的成员作参数。例如:用stu[1].name或stu[2].name作为函数实参,将实参的值传递给形参。用法和用普通变量作实参是一样的,属于“值传递方式”。应当注意实参与形参的类型保持一致。

(2)、用结构体变量作实参。用结构体变量作实参时,采取的也是“值传递”的方式,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量,在函数调用期间形参也要占用内存单元,这种传递方式在空间和时间上的开销非常大,如果结构体的规模很大时,开销是很可观的。此外,由于采用值传递方式,如果在执行被调用函数期间改变了形参(也是结构体变量)的值,该值不能返回主调函数,这往往造成使用上的不便。

(3)、用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值