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

相关推荐

  1. C语言从头35——struct结构

    2024-07-18 09:00:06       21 阅读
  2. C语言从头32——字符串数组

    2024-07-18 09:00:06       27 阅读
  3. C语言从头30——字符串

    2024-07-18 09:00:06       18 阅读
  4. C语言从头33——内存管理(一)

    2024-07-18 09:00:06       22 阅读
  5. C语言从头01——入门程序

    2024-07-18 09:00:06       29 阅读
  6. C语言从头17——sizeof 运算符

    2024-07-18 09:00:06       27 阅读
  7. C语言从头20——指针

    2024-07-18 09:00:06       33 阅读
  8. C语言从头21——函数

    2024-07-18 09:00:06       31 阅读
  9. C语言从头31——与字符串变量相关的几个函数

    2024-07-18 09:00:06       23 阅读
  10. C语言从头02——基本语法概念

    2024-07-18 09:00:06       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 09:00:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 09:00:06       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 09:00:06       58 阅读
  4. Python语言-面向对象

    2024-07-18 09:00:06       69 阅读

热门阅读

  1. 算法刷题笔记 排列数字(C++实现)

    2024-07-18 09:00:06       20 阅读
  2. Mac更新完系统出现两步报错及解决方法

    2024-07-18 09:00:06       21 阅读
  3. UNIX中sigaction和sigevent有啥区别

    2024-07-18 09:00:06       20 阅读
  4. MySQL第七次作业

    2024-07-18 09:00:06       18 阅读
  5. C语言 二叉树,一个猜动物的小游戏

    2024-07-18 09:00:06       15 阅读
  6. RabbitMQ 和 RocketMQ 的区别

    2024-07-18 09:00:06       21 阅读
  7. conda 使用

    2024-07-18 09:00:06       18 阅读
  8. 为什么MySQL会选择B+树作为索引

    2024-07-18 09:00:06       24 阅读
  9. 计算机视觉篇2 图像分类

    2024-07-18 09:00:06       19 阅读
  10. B树(B-Tree)数据结构

    2024-07-18 09:00:06       22 阅读
  11. 547. 省份数量

    2024-07-18 09:00:06       23 阅读