C语言从头学35——struct结构
C语言内置的数据类型,如char、int、float、double等类型只能包含一个值;虽然数组可以包含多个值,但也只能包含相同类型的数据。现实中,描述一个事物往往需要多种数据类型,如描述一个人需要有姓名 (char*)、身高 (int)、年龄 (int)、住址 (char*) 等,怎样将这些不同基础类型组合到一起呢?由此引出struct结构。
struct 是自定义数据类型的命令,它的使用大致分三个步骤:a.定义结构体;b.声明结构体变量;c.为结构体变量赋值。
一、定义结构体
方法:struct 结构体名 { 属性1;属性2; ...; }; //属性也可以称为成员,或成员属性(两个概念不做区分)
注意事项:
1. struct关键字不能缺少,包括声明、使用等各场合,struct 这个关键字都不能省略(使用别名时有些例外);
2. 结构体名的命名规则和变量名一样;
3. 属性可以是C语言中的基础数据类型声明的变量,也可以是自定义已经声明的结构体变量;也就是说结构体可以套着另一个结构体使用。
4. 定义结构体时,所有属性需要用一对{ }括起来,括号内属性后边加分号,大括号后边也加分号,这一点不同于函数。
二、声明结构体变量
(一)一般声明结构体变量的方式
格式:struct 结构体名 结构体变量名;
(二)声明结构体变量也可以在定义结构体时同时进行
格式:struct 结构体名 { 属性1;属性2; ...; } 结构体变量名;
(三)还可以用匿名方式声明结构体变量,即无结构体名直接用属性声明出结构体变量
格式:struct {属性1,属性2,...} 结构体变量名;
注意事项:
1.结构体变量名的命名规则也和普通变量名一样,结构体名和结构体变量名不能相同;
2.声明结构体变量时struct这个关键字不能落下;
3.结构体变量可以一次声明多个,中间用逗号隔开;结构体变量还可以声明成指针型,也可声明成数组。
4.结构体变量一经声明,系统就会为其分派内存空间,这个结构体变量就可以使用了,如进行赋值、遍历、修改等;若声明的是指针型变量则情况有些不同(见后)。
三、结构体变量的赋值
(一)结构体变量通过"."来表示其属性;指针型结构体变量通过"->"来表示其属性,我们可以通过这些方式为其赋值。
格式:结构体变量名.属性=值; 结构体指针变量名->属性=值;
注意事项:
1. 给字符数组属性赋值时,直接使用 "=" 会报 "不能修改左值" 错误,可以使用strcpy函数(也适用于修改char[]情况 )。
2.对于指针型结构体变量,变量声明后并没有完全初始化内存空间,所以付值之前要先用malloc函数为其申请空间。
(二)在声明结构体变量时,通过{ }方式一次性为其赋值。
格式:struct 结构体名 结构体变量名={值1,值2,...}
注意事项:
1.大括号里面的值的顺序,必须与 struct 类型声明时属性的顺序一致。
2.初始化的属性少于声明时的属性,这时剩下的那些属性都会初始化为0,仅限于{ }方式赋初值。
四、结构体的别名
我们经常在C或C++的底层代码中看见 "typedef" 这样的命令,这个命令可以为结构体起别名,结构体起了别名后就不用总想着"struct"这个关键字了;也就是说给结构体起别名是省略struct关键字的途径。
格式:typedef struct 结构体名 {属性1,属性2, ...} 结构体别名;
使用方式:结构体别名 结构体变量; //声明以后再使用结构体就可省略struct关键字
五、结构体的内存空间占用
struct结构体占用的内存空间,不一定是各个属性占用内存空间的简单相加,所以为了获得结构体(变量)的内存占用,可以直接使用sizeof计算。
六、举例程序:
#define _CRT_SECURE_NO_WARNINGS //VS中使用strcpy需要
#include <stdio.h>
#include<stdlib.h>
#include<string.h> //VS中使用strcpy需要
int main()
{
//一、定义结构体
struct Person //定义了包含四个属性的结构体 Person
{
char name[64]; //姓名
int height; //身高
int age; //年龄
char addr[256]; //住址
};
//二、声明结构体变量
struct Person myPerson; //利用结构体Person声明结构体变量myPerson
struct Chair //定义结构体Chair同时声明结构体变量 pChair
{
char material[64]; //材质
int price; //价格
} *pChair; //注意:由于pChair是指针,故此时系统并未给其分派内存空间
struct //匿名方式声明结构体变量myComputer
{
char cpu[64]; //cpu型号
char mainboard[64]; //主板
char GrapCard[64];//显卡
} myComputer = {"xxxx","yyyy","zzzz"};
//三、结构体变量的赋值
//1、为结构体变量赋值(修改值同理)
strcpy(myPerson.name,"WangEr"); //数组名表示常量,不允许出现在“=”的左边(当做左值)
myPerson.height = 177;
myPerson.age = 35;
strcpy(myPerson.addr, "x街x排xxx号");
//访问
printf("结构体变量myPerson数据:name %s height %i age %i addr %s\n", myPerson.name, myPerson.height, myPerson.age, myPerson.addr);
//2、为指针型结构体变量赋值
pChair = (struct Chair*)malloc(sizeof(struct Chair)); //需要增加的步骤申请空间
if (pChair == NULL)return 0; //判断空间是否申请成功
strcpy(pChair->material, "松木");
pChair->price = 500;
//访问
printf("结构体变量pChair数据:material %s price %i\n", pChair->material, pChair->price);
//3、声明结构体变量时使用{ }同时赋值
struct Chair yourChair = {"金属",300 };
//访问
printf("结构体变量yourChair数据:material %s price %i\n", yourChair.material, yourChair.price);
//四、结构体别名
typedef struct Car //为结构体起了别名 MyCar
{
char* brand;
char* color;
float length;
float weight;
} MyCar;
//用MyCar声明结构体变量并附初值
MyCar myCar = { "Toyota","gray",4.3,1.8 };
//访问
printf("结构体变量myCar数据:brand %s, Color %s, length %f, weihgt %f\n", myCar.brand,myCar.color,myCar.length,myCar.weight);
//五、结构体占用内存空间
printf("Person占用内存空间%d\n", (int)sizeof(struct Person)); //使用结构体
printf("myCar占用内存空间%d\n", (int)sizeof(myCar)); //使用结构体变量
getchar();
return 0;
}
运行结果:
结构体变量myPerson数据:name WangEr height 177 age 35 addr x街x排xxx号
结构体变量pChair数据:material 松木 price 500
结构体变量yourChair数据:material 金属 price 300
结构体变量myCar数据:brand Toyota, Color gray, length 4.300000, weihgt 1.800000
Person占用内存空间328
myCar占用内存空间24
原文地址:https://blog.csdn.net/m0_72128260/article/details/140503984
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!