C语言小笔记——结构体

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;
};

你可能感兴趣的:(C语言小笔记——结构体)