结构体相关知识
一、定义一个结构体
struct Student1
{
char name[10];
int age;
char sex[2];
}stu={ "zf",18,'n' };
stu代表的是结构体Student1的一个变量 初始化为 “zf”,18,‘n’
注意:
1.定义一个结构体并且有变量时,一定要给变量直接初始化
2.结构体里面不能进行赋值
二、typedef关键字
typedef struct Student2
{
char name[10];
int age;
char sex[2];
}st;
typedef 自定义类型
typedef int(*P)[3];//P由变量提升为类型
typedef struct A
{
char a;
int b;
}Aa;//
Aa为struct A类型
三、如何访问结构体成员
typedef struct Student
{
char name[10];
int age;
}studnt;
void show(studnt stu)
{
printf("%s,%d", stu.name, stu.age);
}
void show2(studnt *pstu)//
{
printf("%s,%d", pstu->name, pstu->age);//->与[] 自带解引用
printf("%s,%d", (*pstu).name, (*pstu).age);
}
1.定义一个该结构体变量类型的变量 在此处即是定义一个studnt类型的变量stu 利用 变量名.成员
2.定义一个该结构体变量类型的指针 在此处即是定义一个studnt类型的指针*pstu 利用 指针->成员
->与[] 自带解引用
四、结构之间的访问
typedef struct A
{
char a;
int b;
}Aa;//Aa为struct A类型
struct B//结构体里面不能进行赋值
{
int i;
struct A Aaa;
struct A *p;
}Bb;
int main()
{
Aa a = { 'a',10 };
printf("%c %d\n", a.a, a.b);//访问结构体成员 用 变量名.成员
Bb.i;//用Bb访问自身成员i
// .取决于是否为变量 ->是否为指针
Bb.Aaa.a;//用Bb访问A的成员
Bb.p->a;//用Bb访问A的成员
Bb.p->b;
return 0;
}
五、结构体数组
typedef struct Student
{
char name[10];
int age;
}studnt;
void Show(studnt *p, int len)
{
for (int i = 0; i < len; i++)
{
printf("%s,%d \n", p[i].name, p[i].age);
}
}
int main()
{
studnt arr[3] = { { "caocao",10 },{ "lieu",50),{ "fdsfsd",45 });
int len = sizeof(arr) / sizeof(arr[0]);
Show(arr,len);
return 0;
}
六、结构体字节的计算
struct A
{
char a;//1
int b;//4
};//8
struct B
{
char a;//1 +1
short c;//2 要对齐 则前面的+1 为2
int b;//4
};//8
struct B//向前对其
{
char a;//1 +3
int b;//4
short c;//2 +6
double d;//8
};//24
struct B//向后对齐
{
int a;//4
char c;//1
};//24
struct A
{
int a;//4
int b;//4
};//4+4
结构体A占用内存为8字节
struct B
{
char a;//1+3
int b;//4
};1+3+4
结构体B占用内存为8,char类型占用字节数为1,但要保证前一个字节数是后一个字节数倍数,所以需要在char类型后+3
+3的原因:
虽然在a后面浪费了3个内存,但是104可以整除4,108可以整除2,这样子会使得计算机的运行速度加快,浪费的内存数对于计算机而言是很少很少的一部分。
struct F
{
char a;//1+3
int b;//4
short c;//2
};//10+2 //内存要满足是最大字节数的倍数 //10不是4的倍数,所以应该+2
结构体F的内存是12 //10+2
+2的原因
在没有+2之前,114不可以整除4
在+2之后,浪费的2个字节数在c之后,在这个时候的116可以整除4,同样是浪费2个字节数,用来换取运行速度的提高。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct A
{
int a;//4
int b;//4
};//4+4
struct B
{
char a;//1+3
int b;//4
};
struct C
{
char a;//1+1
short b;//2
int c;//4
};//8
struct D
{
char a;//1+3
int b;//4
int c;//4+4
double d;//8
};
struct E
{
short a;//2+2
int b;//4
long long *c;//4
};
struct F
{
char a;//1+3
int b;//4
short c;//2
};//10+2 //内存要满足是最大字节数的倍数 //10不是4的倍数,所以应该+2
struct G//不需要考虑对齐的应用
{
char a;
char x;//保留,不使用
short b;
int c;
};
struct H
{
int a;
struct HH//12
{
char b;//12,13~15
int c;//16
}d;
};//12
struct I
{
int a;//8
double b;//12
};//16
int main()
{
printf("%d\n",sizeof(struct A));
printf("%d\n",sizeof(struct B));
printf("%d\n",sizeof(struct C));
printf("%d\n",sizeof(struct D));
printf("%d\n",sizeof(struct E));
printf("%d\n",sizeof(struct F));
printf("%d\n",sizeof(struct G));
printf("%d\n",sizeof(struct H));
printf("%d\n",sizeof(struct I));
return 0;
}
!注意:指针只占用4个字节数