结构体超详细讲解 下篇

结构体

  • 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};//arr就是一个拥有5个元素 每个元素为int的数组

3. 给指针取别名

typedef int *P_TYPE;
P_TYPE p = &num  //P_TYPE p == int *p

4. 给函数指针 取别名

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
}

5. 给结构体类型取个别名

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
	
}

6. 结构体指针

结构体超详细讲解 下篇_第1张图片

案例:结构体指针

#include

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;
}

运行结果:
结构体超详细讲解 下篇_第2张图片

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);
}

运行结果:
结构体超详细讲解 下篇_第3张图片

案例:从堆区申请申请一个结构体数组 分函数 实现

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;
	}
}

结构体超详细讲解 下篇_第4张图片

8. 结构体的内存对齐

结构体超详细讲解 下篇_第5张图片

9. 结构体嵌套结构体的内存对齐

结构体超详细讲解 下篇_第6张图片

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);
}

结构体超详细讲解 下篇_第7张图片

你可能感兴趣的:(C)