结构体"/>
8.1.结构体
结构 (重要)
结构是c语言分配内存的第三大方法
1.通过定义变量(少量分配)
2.采用数组(数据类型一致)
3.结构体
(1)结构是一种由若干成员组成的构造类型
(2)结构的成员既可以是基本类型的数据,也可以又是数据类型的数据
(3)结构是一种构造而成的数据类型,在使用结构之前必须先行定义
因此结构也是一种自定义数类型
(4)结构类型的数据在存储上类似于数组,所有成员按其被声明的顺序,由低地址到高地址连续(或接近连续)存放
(5)与数组不同,结构的成员可以是不同类型的数据,因此结构也是一种复合数据类型。
6.指向结构变量和结构数组的指针
结构指针的计算以整个结构的大小为单位
7.访问结构的成员
通过结构变量访问其成员,用成员访问运算符“ . ”
通过结构指针访问其目标的成员,用间接成员访问运算符 “ -> ”
8.如果函数的参数是结构类型,那形参只是实参的拷贝,在函数内部无法修改实参的成员
9.如果函数的参数是结构指针,并接受实参的地址,那就可以在函数内部修改实参的成员
(6)定义方式:
1.直接定义结构类型变量(用的很少)
struct {
数据类型1 成员1;
数据类型2 成员2;
…………
}变量;
例如:
struct {
char name[32];//姓名
int age;//年龄
}stu1 = {"a",18};
其缺点为:
每定义一个变量都需要写一次结构体
代码如下:
1 //结构体定义方法1:直接定义结构体数据类型变量
2 //切记:结构体的本质就是一种数据类型,是自定义的数据类型,程序员根据需求发明创造的数据类型
3 //用结构体数据类型分配的内存可以做到数据类型不一致。
//结构体玩法1:直接定义结构体数据类型变量(用的少)
//切记:结构体的本质就是一种数据类型,是自定义数据类型,程序员根据需求发明创造的数据类型
//用结构体数据类型分配的内存可以做到数据类型不一致
#include <stdio.h>
#include <string.h>
int main(void) {//直接定义结构体数据类型的变量并且初始化struct {char name[32]; //存储学生的姓名int age; //存储学生的年龄}stu1 = {"小白", 18};//打印学生信息printf("%s, %d\n", stu1.name, stu1.age);//修改strcpy(stu1.name, "李小白");stu1.age++;//打印学生信息printf("%s, %d\n", stu1.name, stu1.age);return 0;
}
2.先声明结构类型(头文件),再用该类型定义变量(源文件)
struct 结构类型名 {
数据类型1 成员1;
数据类型2 成员2;
……………
}; //声明
struct 结构类型名 变量;//定义,把struct结构体类型名类比成int类型
例如:
struct student {
char name[32];
int age;
};
struct student stu1;//类比成int stu1
其初始化方式有两种:
1.struct student stu1 = {"小白",18} 传统初始化,必须元素齐全且必须按照声明的顺序
2. struct student pstu = {.age = 18, .name = "小白"}; //标记初始化 ,不需要按照顺序,不需要全部初始化
当初始化指针 struct student * stu2时
pstu ->age, pstu->name
代码如下:
//结构体数据类型玩法2:先声明一个结构体数据类型(先发明创造一个结构体类型,类似创造一个int)
//然后用该结构体数据类型定义结构体变量来实现内存分配
#include <stdio.h>
#include <string.h>
//声明结构体数据类型来描述学生的基本信息,造一个自己的int一样
struct student {char name[32]; //描述姓名int age; //描述年龄
};//好比把struct student当成int来看
int main(void) {//定义结构体数据类型变量来分配内存存储学生信息//struct student stu1 = {"小白", 18}; //传统初始化struct student stu1 = {.age = 18, .name = "小白"}; //标记初始化,类比:int stu1 = ...struct student *pstu = &stu1; //pstu指向stu1,类比:int *pstu = &stu1;printf("%s, %d\n", stu1.name, stu1.age);printf("%s, %d\n", pstu->name, pstu->age);strcpy(stu1.name, "李小白");pstu->age++;printf("%s, %d\n", stu1.name, stu1.age);printf("%s, %d\n", pstu->name, pstu->age);return 0;
}
3.通过typedef定义类型别名,再用该别名定义变量
typedef int s32 //相当于给int定义别名s32
typedef struct 结构类型名 {
数据类型1 成员1;
数据类型2 成员2;
…………
} 类型别名;
类型别名 变量;
例如:
typedef struct student { //student名称可以省略
char name[32];
int age;
}stu_t; //当用tpyedef给一个类型取别名是,一般加一个_t 告诉他人这个类型是别名。
stu_t stu1;
代码如下:
//结构体数据类型玩法3:先声明一个结构体数据类型(先发明创造一个结构体类型,类似创造一个int)
//然后给结构体数据类型用typedef取别名,最后用别名定义结构体变量来实现内存分配
#include <stdio.h>
#include <string.h>
//声明结构体数据类型并且取别名来描述学生的基本信息,造一个自己的int一样
typedef struct student {char name[32]; //描述姓名int age; //描述年龄
}stu_t;//给struct student取别名叫stu_t,好比把stu_t当成int来看
int main(void) {//定义结构体数据类型变量来分配内存存储学生信息//stu_t stu1 = {"小白", 18}; //传统初始化stu_t stu1 = {.age = 18, .name = "小白"}; //标记初始化,类比:int stu1 = ...stu_t *pstu = &stu1; //pstu指向stu1,类比:int *pstu = &stu1;printf("%s, %d\n", stu1.name, stu1.age);printf("%s, %d\n", pstu->name, pstu->age);strcpy(stu1.name, "李小白");pstu->age++;printf("%s, %d\n", stu1.name, stu1.age);printf("%s, %d\n", pstu->name, pstu->age);return 0;
}
更多推荐
8.1.结构体
发布评论