结构体
- typedef 给已有的类型取个别名
- 1. 给int取个别名INT32
- 2. 给数组取个别名
- 3. 给指针取别名
- 4. 给函数指针 取别名
- 5. 给结构体类型取个别名
- 6. 结构体指针
- 案例:结构体指针
- 案例:从堆区给结构体申请一个空间
- 7. 结构体指针作为函数的参数
- 8. 结构体的内存对齐
- 9. 结构体嵌套结构体的内存对齐
typedef 给已有的类型取个别名
日日行,不怕千万里,日日做,不怕千万事;
1. 给int取个别名INT32
typedef int INT32;
2. 给数组取个别名
typedef int ARR_TYPE[5];
ARR_TYPE arr={10,20,30,40,50};
3. 给指针取别名
typedef int *P_TYPE;
P_TYPE p = &num
4. 给函数指针 取别名
int my_add(int x,int y)
{
return x+y;
}
typedef int (*FUN_P)(int x,int y);
void test04()
{
FUN_P p = my_add;
printf("%d\n", p(100,200));
}
5. 给结构体类型取个别名
typedef struct stu
{
int num;
char name[32];
int age;
}STU;
struct stu2
{
int num;
char name[32];
int age;
}STU2;
void test05()
{
STU lucy={100,"lucy",18};
}
6. 结构体指针
案例:结构体指针
#include
typedef struct
{
int num;
char name[16];
int age;
}STU;
void test01()
{
STU lucy={100,"lucy",18};
STU *p = &lucy;
printf("num = %d, name=%s, age=%d\n",lucy.num, lucy.name, lucy.age);
printf("num = %d, name=%s, age=%d\n",(*p).num, (*p).name, (*p).age);
printf("num = %d, name=%s, age=%d\n",p->num, p->name, p->age);
printf("num = %d\n", (&lucy)->num );
return;
}
运行结果:
案例:从堆区给结构体申请一个空间
void test02()
{
STU *p = NULL;
p = (STU *)calloc(1,sizeof(STU));
if(NULL == p)
{
perror("calloc");
return;
}
printf("请输入一个学生的信息num name age\n");
scanf("%d %s %d", &p->num, p->name, &p->age);
printf("num = %d, name=%s, age=%d\n",p->num, p->name, p->age);
if(p != NULL)
{
free(p);
p=NULL;
}
return;
}
运行结果:
7. 结构体指针作为函数的参数
void mySetSTUData(STU *p)
{
printf("请输入一个学生的信息num name age\n");
scanf("%d %s %d", &p->num, p->name, &p->age);
return;
}
void myPrintSTUData(const STU *p)
{
printf("sizeof(p)=%d\n", sizeof(p));
printf("num = %d, name=%s, age=%d\n",p->num, p->name, p->age);
}
void test03()
{
STU lucy;
memset(&lucy,0,sizeof(lucy));
mySetSTUData(&lucy);
myPrintSTUData(&lucy);
}
运行结果:
案例:从堆区申请申请一个结构体数组 分函数 实现
STU * get_array_addr(int n)
{
return (STU *)calloc(n,sizeof(STU));
}
void my_input_stu_array(STU *arr, int n)
{
int i=0;
for(i=0;i<n;i++)
{
printf("请输入第%d个学生的信息\n",i+1);
scanf("%d %s %d", &(arr+i)->num , (arr+i)->name, &(arr+i)->age);
}
}
void my_print_stu_array(const STU *arr, int n)
{
int i=0;
for(i=0;i<n;i++)
{
printf("num=%d, name=%s, age=%d\n", \
(arr+i)->num, (arr+i)->name,(arr+i)->age);
}
return;
}
void test04()
{
int n = 0;
STU *arr=NULL;
printf("请输入学生的个数:");
scanf("%d", &n);
arr = get_array_addr(n);
if(arr == NULL)
{
perror("get_array_addr");
return;
}
my_input_stu_array(arr, n);
my_print_stu_array(arr, n);
if(arr != NULL)
{
free(arr);
arr=NULL;
}
}
8. 结构体的内存对齐
9. 结构体嵌套结构体的内存对齐
typedef struct
{
short d;
char e;
}DATA2;
typedef struct
{
short a;
int b;
DATA2 c;
char f;
}DATA;
void test08()
{
DATA data;
printf("%d\n",sizeof(DATA));
printf("a:%u\n", &data.a);
printf("b:%u\n", &data.b);
printf("c中d:%u\n",&data.c.d);
printf("c中e:%u\n",&data.c.e);
printf("f:%u\n",&data.f);
}