您的位置:首页 > 编程语言 > C语言/C++

C语言编程(十)

2020-07-21 04:07 676 查看

好久没更新这个系列了,今天接着说C语言中的结构体部分吧!主要介绍结构体定义、结构体变量定义、结构体变量的初始化、结构体变量之间赋值、结构体数组、结构体指针、结构体嵌套、结构体位段对齐等等。

知识点1【结构体的定义形式】

知识点2【结构体变量的定义】

知识点3【结构体变量的初始化】

知识点4【结构体变量获取键盘输入】

运行结果:

知识点5【结构体变量间的赋值】

运行结果:

[code]struct stu tmp;交换俩个结构体变量
tmp = lucy;
lucy = bob;
bob = tmp;

 

知识点6【结构体数组】

//需求:定义一个结构体数组 有5个元素 获取键盘输入 求取平均年龄

[code]void test07()
{
struct stu arr[5];
memset(arr, 0,sizeof(arr));
int n = sizeof(arr)/sizeof(arr[0]);
//获取键盘输入
printf("请输入%d个学生的信息num name age\n",n);
int i=0;
for ( i = 0; i < n; i++)
{
scanf("%d %s %d", &arr[i].num, arr[i].name, &arr[i].age);
}

//统计总年龄
int sum = 0;
for ( i = 0; i < n; i++)
{
sum += arr[i].age;
}
printf("平均年龄为:%d\n",sum/n);

//按年龄 排序 冒泡排
for (size_t i = 0; i < n-1; i++)
{
for (size_t j = 0; j < n-i-1; j++)
{
if(arr[j].age > arr[j+1].age)//交换
{
struct stu tmp;
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1]=tmp;
}
}
}
printf("--------------\n");
for (i = 0; i < n; i++)
{
printf("num=%d, name=%s, age=%d\n", \
arr[i].num, arr[i].name, arr[i].age);
}
}

运行结果:

知识点7【typedef】typedef 给已有的类型 取个别名。

typedef 不能创造 新的类型。

案例:给数组取个别名

案例:给函数指针 取个别名

案例:给结构体取个别名

知识点8【结构体指针】

[code]typedef struct stu
{
int num;
char name[32];
float score;
}STU,*STU_P;
//STU就是struct stu的类型
//STU_P就是struct stu *的类型
void test04()
{
STU lucy={100, "lucy", 99.9f};
//STU_P p=&lucy;
STU *p = &lucy;

printf("num = %d,name=%s,score=%f\n", lucy.num, lucy.name,lucy.score );
//*p = *&lucy=lucy
printf("num = %d,name=%s,score=%f\n", (*p).num, (*p).name,(*p).score );
//直接通过p访问lucy成员
printf("num = %d,name=%s,score=%f\n", p->num, p->name, p->score );

//如果.或->左边 是变量 就用.  如果是地址就用->
printf("num = %d,name=%s,score=%f\n", (&lucy)->num, (&lucy)->name, (&lucy)->score );
}

运行结果:

案例:堆区申请结构体空间

知识点9【结构体指针作为函数的参数】

知识点10【函数内部操作外部数组】

[code]typedef struct stu
{
int num;
char name[32];
float score;
}STU,*STU_P;
STU* getSTUArray(int n)
{
return (STU *)calloc(n,sizeof(STU));
}
void myInputSTUArray(STU *arr, int n)
{
int i=0;
for(;i < n; i++)
{
printf("请输入第%d个学生的信息:",i+1);
//scanf("%d %s %f", &arr[i].num, arr[i].name, &arr[i].score );
scanf("%d %s %f", &(arr+i)->num, (arr+i)->name, &(arr+i)->score );
}
return;
}
void myPrintSTUArray(STU *arr, int n)
{
int i=0;
for(i = 0; i < n; i++)
{
printf("num=%d,name=%s,score=%f\n", (arr+i)->num, (arr+i)->name, (arr+i)->score );
}
return;
}
void test07()
{
STU *arr = NULL;
int n = 0;
printf("请输入学生的个数:");
scanf("%d", &n);

//根据学生的个数 从堆区申请结构体数组空间
arr = getSTUArray(n);

//获取键盘输入
myInputSTUArray(arr, n);

//遍历结构体数组
myPrintSTUArray(arr, n);

//释放空间
if(arr != NULL)
{
free(arr);
arr=NULL;
}
}
int main(int argc, char const *argv[])
{
test07();
return 0;
}

运行结果:

知识点11【结构体对齐问题】

步骤:
1、确定分配单位:每一行应该分配的字节数,由结构体中最大的基本类型的大小决定。
2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍
3、收尾工作:结构体的总大小 == 分配单位的整数倍。

案例:

结构体嵌套结构体:

[code]typedef struct
{
int x;
int y;
}DATA3;
typedef struct
{
int a;
int b;
DATA3 c;//结构体嵌套结构体
}DATA4;
void test03()
{
//结构体嵌套结构体:访问到最底层
DATA4 data;
data.a = 10;
data.b = 20;
data.c.x = 30;
data.c.y = 40;
printf("%d\n", data.c.y);
}

运行结果:

结构体嵌套结构体 的对齐问题
步骤:
1、确定分配单位:每一行应该分配的字节数,由所有结构体中最大的基本类型的大小决定。
2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍
结构体成员的偏移量 = 被嵌套的结构体里面最大的基本类型的整数倍
结构体成员中成员偏移量 相对与 被嵌套的结构体
3、收尾工作:结构体的总大小 == 分配单位的整数倍。
结构体成员 的总大小 == 被嵌套的结构体里面最大的基本类型的整数倍

案例:

结构体对齐深思:

知识点11【强制类型对齐】

步骤:
1、确定分配单位:每一行应该分配的字节数,min(value, 默认分配单位)
2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍
3、收尾工作:结构体的总大小 == 分配单位的整数倍。

知识点12【结构体位段】

位段的使用:

无意义位段:

另起一个储存单元

应用场景:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: