结构体超详细讲解 下篇
作者:互联网
typedef 给已有的类型取个别名
在千锋学习的第十七天
加油正在拼搏的你!
日日行,不怕千万里,日日做,不怕千万事;
先复习一下typedef的用法
- 给int取个别名INT32
//注意:不能创造新的类型 简单的就不写案例了
typedef int INT32;
- 给数组取个别名
typedef int ARR_TYPE[5];
ARR_TYPE arr={10,20,30,40,50};//arr就是一个拥有5个元素 每个元素为int的数组
- 给指针取别名
typedef int *P_TYPE;
P_TYPE p = &num //P_TYPE p == int *p
- 给函数指针 取别名
int my_add(int x,int y)
{
return x+y;
}
//FUN_P 是一个函数指针类型 该函数 必须有两个int形参 以及一个int返回值
typedef int (*FUN_P)(int x,int y);
void test04()
{
FUN_P p = my_add;
printf("%d\n", p(100,200));//300
}
- 给结构体类型取个别名
typedef struct stu
{
int num;
char name[32];
int age;
}STU;//此时的STU不是结构体变量 而是结构体类型
struct stu2
{
int num;
char name[32];
int age;
}STU2;//变量名
void test05()
{
STU lucy={100,"lucy",18};//struct stu lucy
}
- 结构体指针
案例:结构体指针
#include<stdio.h>
typedef struct
{
int num;
char name[16];
int age;
}STU;
//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)//p=&lucy
{
printf("请输入一个学生的信息num name age\n");
scanf("%d %s %d", &p->num, p->name, &p->age);
return;
}
void myPrintSTUData(const STU *p)//p =&lucy *p只读
{
//const STU *p 不允许用户借助 p修改 p所指向空间的内容
//p->num = 10000;
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));
//定义一个函数 给lucy的成员获取键盘输入
mySetSTUData(&lucy);
//定义一个函数 打印lucy的成员信息
myPrintSTUData(&lucy);
}
运行结果:
案例:从堆区申请申请一个结构体数组 分函数 实现
STU * get_array_addr(int n) //从堆区开辟空间
{
return (STU *)calloc(n,sizeof(STU));
}
//arr代表的是空间首元素地址
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);
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;
}
//从键盘 给结构体数组arr输入数据
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);
}
天 禄
发布了2 篇原创文章 · 获赞 0 · 访问量 123
私信
关注
标签:下篇,name,int,age,lucy,STU,num,讲解,体超 来源: https://blog.csdn.net/weixin_43288201/article/details/104524614