1. 结构体介绍
char name[40]; //姓名
char *name = malloc(40);
int age; //年龄
int score[3];
变量与变量之间没有关联
数据传递比较复杂
结构体是一种自定义类型,与数组不同的是它可以存放不同类型的一组变量,而数组只能存同类型的一组变量。
结构体需要定义,定义类型:
struct 类名{
类型 成员名;//定义结构体类型时 不能对成员进行赋值(初始化)
…
};
在结构体内部定义的变量 称为 成员变量
2. 定义结构体变量
结构体类型
struct 类名 变量名;
如果不对变量进行初始化 则结构体变量中的每一个成员都是垃圾值
结构体变量访问每一个"元素"用 变量.成员名
结构体指针访问每一个"元素"用 指针变量->成员名
(*指针变量).成员名
3. 结构体变量的初始化
struct 类名 变量名 = {…}; //在{}在依次给成员变量初始值
struct 类名 变量名 = {.成员名=v,.成员名=v,…};
struct 类名 变量名 = {};// 全部初始化为"零"
结构体变量定义之后 ,不能再进行整体赋值
变量名 = {};//错误的
如果需要改变结构体成员的值,需要对特定的成员进行赋值操作
定义结构体类型 一般在main函数外面 多文件编程时 一般在.h中定义类型,例如:
struct Stu{//定义一个学生的结构体,学号 姓名 三门功课成绩
int no; //学号
char name[40]; //姓名
int score[3]; //三门功课成绩
};
struct Stu s;//定义结构体变量 每个成员都是垃圾值
struct Stu s1 = {110,“张三”,{100,100,100}};
struct Stu s2 = {.name=“李四”,.no=119,.score={100,80,90}};
struct Stu s3 = {};//全部初始化为"零"
访问结构体变量的成员 和 赋值 :
s1.no = 120;
strcpy(s1.name,“王五”)
s1.score[0] = 100; s1.score[1] = 90; s1.score[2] = 100
当结构体变量一旦定义之后,不能再对结构体变量进行 = {}这种形式的赋值
同类型的结构体变量可以相互赋值 和 初始化,例如:
struct A a;
struct A b = a;
struct A c;
c = a;
4. 结构体指针变量
struct 类型名 * 变量名;
结构体指针变量访问成员:
(*结构体指针变量).成员名
结构体指针变量->成员名
运算符的优先级: . > *
5. 其他结构体初始化形式
struct Emp{
int no;
char name[40];
}e={10,"李四"}, *pe;
struct Book{
char name[40];
double price;
}b[5]={};
struct A{
int x;
int y;
}a,b={1,2};
struct B{
char c;
int x;
}arr[5],brr[4]={{'a',1},{'b',2}};
struct C{
char x;
}c,*pc=&c;
6. typedef
typedef C语言的一个关键字 用于给类型取别名
struct Stu{
int no;
char name[40];
int s[3];
};
//在下一行之前 Stu不是类型 只有struct Stu才是一个类型
typedef struct Stu Stu;//Stu就是一个独立的类型 == struct Stu
typedef struct Emp{
int no;
char name[40];
double salary;
}Emp;
//Emp就是一个类型 == struct Emp
#define T int * //define只是“简单”的替换 直接把T替换成int *
typedef int * I; //I则是一个int *的变量类型
T a,b;//相当于int *a,b;
I m,n;//相当于int *m,*n;
// a,m,n是int* b是int类型
7. 结构体的对齐补齐
结构体成员对齐摆放: 从自身长度的整数倍的位置开始存放 超过4按4计算
结构体长度补齐: 结构体的长度会补齐为成员最大长度的整数倍 如果超过4按4计算
下面列出了几种例子:
#include <stdio.h>
//ccssiiiidddddddd sizeof(A)=16
struct A{
char x1;
char x2;
short x3;
int x4;
double x5;
}a;
//x---iiiiss--ddddddddc--- sizeof(B)=24
//x1为char型,所以占一个字节;但x2为int型,为4个字节,所以前面要对齐,空三个,要在自身长度的整数倍开始摆放;然后x3位short型,
//字节长度为2,当前位置符合要求;x4为double型,8个字节,超过4按4的整数倍摆放,因此前面要再空两个;x5为char型,直接摆放,
//由于结构体的长度要补齐,为成员最大长度的整数倍 如果超过4按4计算,因此最后面要多空3个。加起来为24个字节数
struct B{
char x1;
int x2;
short x3;
double x4;
char x5;
}b;
//iiiic---ddddddddc-ss sizeof(C)=20
struct C{
int x1;
char x2;
double x3;
char x4;
short x5;
}c;
struct D{//sizeof(D)=3
char c;
char s[2];
}d;
struct E{//sizeof(E)=4 ssc-
short s;
char c;
};
struct F{//sizeof(F)=8 c---iiii
char c;
int i;
};
struct G{//sizeof(G)=8 ppppc---
int (*p)[5];
char c;
};
struct H{//sizeof(H)=8 ppppcc--
char *p;
char s[2];
};
struct I{//sizeof(I)=20 c---iiiiiiiiiiiic---
char c;
int *arr[3];
char x;
};