#### 什么是结构体 ####
/*
结构体:是一种数据结构,包含不同类型的数据。(可以包含基本数据类型,数组
,指针等)
结构体和数组都是聚合数据类型,但数组中元素的类型相同,通过下标或者指针间
接访问元素。而结构体里面的数据被称为成员,由于每个成员类型大小可能不同,不能用下
标访问,可以通过名字访问
*/
演示代码:struct_1.c
#include <stdio.h>
typedef struct data
{
int a;
float b;
char c;
}D;
int main(void)
{
printf("sizeof(struct data) = %d \n",sizeof(D));//查看结构体size
D s1; //定义一个结构体变量s1(实例化)
s1.a = 11; //对变量内成员函数进行赋值
s1.b = 2.33;
s1.c = 'x';
printf("s1.a = %d s1.b = %.2f s1.c = %c \n",s1.a,s1.b,s1.c);
D s2;
s2 = s1;//可以通过一个结构体变量给另一个结构体变量赋值(此处和数组不同,
数组不能这样通过数组名赋值;数组名不能做左值)
printf("s2.a = %d s2.b = %.2f s2.c = %c \n",s2.a,s2.b,s2.c);
return 0;
}
#### 结构体数据存放原则 ####
/*
结构体数据存放原则:
字节对齐:各个成员变量进行字节对齐(用空间代价提升效率)
1,编译器有一个默认的对齐字节数(32为是4,64位是8),然后确定成员变量中>最大元素类类型所占字节数;两者进行比较,选择较小值,从而确定真正的字节对齐数
2,各个成员之间对齐;首元素直接放入结构体起始地址处,具体占几个字节,由>本身和下一个元素决定。接下来元素同理,具体占几个字节,由本身和下一个元素决定。最
后一个元素是否填充,看整个结构需要不需要填充。
3,所有元素占用字节的实际数字之和就是结构体sizeof()的结果
*/
演示C代码:struct_2.c
#include <stdio.h>
#include <string.h>
struct data
{
char ch; //1+3
int a; //4
int b; //4
char c[10]; //10+2
}d;
int main(void)
{
printf("sizeof(d) = %d \n",sizeof(d));
printf("d.ch = %d d.a = %d d.b = %d d.c = %s \n",d.ch,d.a,d.b,d.c);
//d变量是全剧变量,未初始化;所以在.bss段,默认都为0;
struct data d1; //此处d1为局部变量,存放在栈上
d1.a = 3;
d1.b = 5;
// d1.c = "abc"; //error: incompatible types when assigning to type ‘char[10]’ from type ‘char *’ 数组名不能做左值
strcpy(d1.c,"abc");
printf("d1.a = %d d1.b = %d d1.c = %s \n",d1.a,d1.b,d1.c);
return 0;
}
#### "."运算符 ####
/*
"."运算符的实质:是指针,成员变量是通过地址偏移赵的相应自己的内存空间
*/
演示C代码;struct_3.c
#include <stdio.h>
struct data
{
char ch; //1、紧挨着放 2、各自对齐 1+3
int a;
int b;
char c[10];
}d = {1, 3, 33, "1234"};
int main(void)
{
#if 0
printf("&d = %p \n/*
3个学生,按姓名或者成绩排名
*/
",&d);
printf("&d.a = %p.\n", &d.a);
int *p_a = (int *)((long)&d+0);
printf("*p_a = %d \n",*p_a);
int *p_b = (int *)((long)&d+4); //结构体地址偏移四个字节;即a=3地址
printf("*p_b = %d \n",*p_b);
#endif
return 0;
}
#### 小程序测试struct认知 ####
/*
3个学生,按姓名或者成绩排名
*/
演示创建C代码;struct_4.c
#include <stdio.h>
typedef struct student //定义结构体,包含三个成员:姓名,分数,学号
{
char name[20];
int score;
int num;
}STU,*ST; //STU与typedef对应;ST为此结构体指针
void set_arr(ST p,int len) //传参含义(指向结构体的指针p , 学生人数)
{
int i = 0;
for (i = 0;i<len;i++)
{
printf("input the %d student imformation:(name + score + num) \n",i+1);
scanf("%s%d%d",p[i].name,&p[i].score,&p[i].num); //输入每一个学生信息
}
}
void show_arr(ST p,int len) //打印每一个学生信息;
{
int i = 0;
for(i=0;i<len;i++)
{
printf("name:%s \t score:%d \t num:%d \n",p[i].name,p[i].score,p[i].num);
}
}
void swap_arr(ST p,int len) //以score为依据进行排名
{
STU temp; //在交换过程中,是STU类型的数据在进行赋值,所以定义中间变量时,也应该是STU类型
int i = 0 ,j = 0;
for (j=0;j<len-1;j++)
{
for (i=0;i<len-j-1;i++)
{
if(p[i].score > p[i+1].score)
{
temp = p[i];
p[i] = p[i+1];
p[i+1] = temp;
}
}
}
}
int main(void) //主函数里面测试用
{
ST s;
int len;
len = 3;
set_arr(s,len);
show_arr(s,len);
printf("---------------------------------\n");
swap_arr(s,len);
show_arr(s,len);
return 0;
}
实现:[root@localhost fsx_test_3]# ./a.out
input the 1 student imformation:(name + score + num)
fsx 44 123
input the 2 student imformation:(name + score + num)
lzz 55 124
input the 3 student imformation:(name + score + num)
qq 33 125
name:fsx score:44 num:123
name:lzz score:55 num:124
name:qq score:33 num:125
---------------------------------
name:qq score:33 num:125
name:fsx score:44 num:123
name:lzz score:55 num:124