C语言结构体变量

结构体变量的定义

结构体就是将不同类型的数据组合成一个有机的整体,以便于引用。如定义一个学生的信息:

struct student{int num;char name[20];int score;};struct为结构体关键字,student就是这结构体的类型名,而 num,name, score就是该结构体的成员,他们可以是不同类型的,注意在定义类型的时候不要对结构体成员num,name, score赋初值。其次就是在大括号后面要有分号“;”。

定义结构体变量的方式

定义变量的方式都是大同小异的,都为数据类型+变量名这样一种方式,比如int型,首先得有int这样一个数据类型,然后再用int这个数据类型去定义一个变量,同样的,我们要定义一个结构体变量,必须要有一个结构体类型,然后用这个类型去定义一个变量。结构体变量的定义有多种方式:

方式一:先定义结构体类型再定义变量名

其中struct是关键字,student是结构体标记(用于为结构体命名),struct student代表该结构体的类型, 大括弧里面就是结构体的成员。注意大括弧的后面一定要有一个分号‘;’。到此为止我们有了"struct student"这样的类型了,struct student就等价于我们的int一样,接下来我们就要定义一个这样类型的变量,定义格式如下:struct student zhangsan; 这个zhangsan就是我们所要的结构体变量。

方式二:在声明类型的同时定义变量

如:

这种方式定义结构体,后续可以根据需要定义新的变量,如struct student Wangwu。 注意:不能用Zhangsan去定义新的变量,这里Zhangsan、Lisi都为变量名而不是结构体类型。

方式三:直接定义结构体类型变量

这种定义方式中结构体变量只能在定义结构体类型的时候定义,不能再定义其他的变量。这样的定义的结构体类型是没有名字的,我们也可以用typedef重新为这样的结构体类型命,如:

使用typedef后,我们可以用Zhangsan作为数据类型来定义新的变量。需要注意的是,不能直接使用Zhangsan.num,因为Zhangsan不是变量,而是结构体类型。

结构体变量的初始化:

结构体变量的应用:

结构体中的成员,可以像普通变量那样单独使用,如下面例子中,结构体变量A中的成员num,可以用A.num的方式来使用。

结构体变量的成员引用:结构体变量名.成员名

关于结构体的一点说明:

1、不能将结构体变量作为整体进行操作:printf("%d, %d\n", A);错误scanf("%d, %d\n”,&A); //错误printf("%d, %d\n”, A.num, A.score); //正确scanf("%d, %d\n”, &Lucy.num, &Lucy.sex); //正确2、当结构体变量的成员也是结构体类型时,引用必须用最底层的成员变量,如下

3、成员名可与程序中的变量名相同,二者代表不同对象

4、可以引用结构体变量成员的地址,也可以引用结构体变量的地址,例如:scanf("%d", &A.num); //输入A.num的值printf("%d", &A); //输出Bob的首地址目的:主要用作函数参数,传递结构体变量的地址。5、允许具有相同类型的结构变量可以相互赋值,其它情况不允许对结构变量直接赋值。

就这么多吧,后续写写结构体数组,结构体指针,共用体,枚举,typedef,最后说一下结构体内存分配相关方面的内容。

### C语言结构体变量的定义与用法 #### 一、什么是结构体变量 在C语言中,结构体是一种用户自定义的数据类型,允许将不同类型的数据组合在一起形成一个新的数据单元。通过定义结构体类型并创建其对应的实例——即结构体变量,可以方便地操作这些复杂的数据集合。 结构体变量是由结构体类型派生出来的具体对象,它可以存储多个不同类型的成员数据[^1]。例如,在描述一本书的信息时,可以通过定义`book`结构体来包含书名、作者、价格等多个属性,并基于此创建具体的书籍记录作为结构体变量。 #### 二、如何定义结构体及其变量 以下是几种常见的定义方式: 1. **先声明结构体再定义变量** 首先单独定义一个结构体类型,之后再依据这个类型去初始化相应的变量。 ```c struct Student { char name[50]; int roll; float marks; }; struct Student s1; // 创建名为s1的学生结构体变量 ``` 2. **同时定义结构体变量** 可以在同一语句里既完成结构体的设计又生成它的实例化个体。 ```c struct Employee { char emp_name[100]; double salary; }emp1, emp2; // 同步建立两个雇员(emp1 & emp2) 的结构体变量 ``` 3. **匿名结构体以及直接赋值给变量** 如果不需要重复利用某个特定形式的结构,则可以直接嵌入至单个实体之中而无需额外命名整个结构类别。 ```c struct{ int day; int month; int year; }date; date.day = 15; date.month = 8; date.year = 2023; ``` 以上每种方法都有各自适用场景,开发者可以根据实际需求灵活选用合适的策略[^3]。 #### 三、访问结构体中的成员 一旦建立了结构体变量后,就可以采用点运算符`.`或者箭头运算符`->`(当涉及指针的时候) 来获取或修改内部各个字段的内容了。 ```c // 假设已存在上述Student结构体及其实例s1 strcpy(s1.name,"John Doe"); // 设置名字为 John Doe s1.roll = 789; // 设定学籍号码为789 s1.marks = 85.5f; // 成绩设定成85.5分 printf("%s has scored %.2f%%\n", s1.name,s1.marks); // 输出学生信息 ``` 对于含有指向其他结构体成员的情况,需特别留意间接寻址规则的应用[^4]。 #### 四、扩展应用—结构体数组 除了单一的结构体变量外,还可以构建一系列相同布局的对象组合作为整体处理单位,这就是所谓的“结构体数组”。它们的操作逻辑类似于常规数值型别的阵列管理流程,只不过每个元素本身可能携带更丰富的特性集罢了。 示例如下所示: ```c #include<stdio.h> #define SIZE 3 struct Book { char title[50]; char author[50]; float price; }; void displayBooks(struct Book books[], int size){ for(int i=0;i<size;i++) printf("Book %d:\tTitle:%s\tAuthor:%s\tPrice:$%.2f\n",i+1,books[i].title,books[i].author,books[i].price); } int main(){ struct Book library[SIZE]={ {"Learn Python","Mark Lutz",49.99}, {"Effective Java","Joshua Bloch",65.00}, {"Clean Code","Robert Martin",54.99} }; displayBooks(library,SIZE); return 0; } ``` 这里展示了怎样预先填充若干本书的相关资料进入预分配好的空间位置内,并最终逐一打印出来供查看[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值