结构体的总结

结构体的基本概念 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

typedef struct Person{
	char name[64];
	int age;//不要在定义结构体的时候赋初值
}myPerson;//myPerson是struct Person类型的别名

void test01(){
	myPerson p = { "lll", 23 };
}

struct Person2{
	char name[64];
	int age;
} myPerson2={"222",23};

void test02(){
	printf("姓名:%s 年龄 %d\n",myPerson2.name,myPerson2.age);
	myPerson2.age = 100;
	strcpy(myPerson2.name,"aaaa");
	printf("姓名:%s 年龄 %d\n", myPerson2.name, myPerson2.age);

}

void test03(){
	//在栈上创建结构体变量
	struct Person p1 = {"ccc",23};
	//在堆上创建结构体变量
	struct Person *p2 = malloc(sizeof(struct Person));
	p2->age = 100;
	strcpy(p2->name,"ddddd");
	printf("姓名:%s 年龄 %d\n",p2->name, p2->age);
}
void printArray(struct Person persons[],int len){
	for (int i = 0; i < len; i++)
	{
		printf("姓名:%s,年龄:%d\n",persons[i].name,persons[i].age);
	}
}
void test04(){
	//结构体变量数组
	//在栈上创建
	struct  Person persons[] =
	{
		{"aaaa",10},
		{"bbb",20},
		{"ccc",30},
		{"ddd",40}
	};
	int len = sizeof(persons) / sizeof(struct Person);
	printArray(persons,len);

	//在堆区创建
	struct Person *personArr = malloc(sizeof(struct Person)*4);
	for (int i = 0; i < 4; i++)
	{
		sprintf(personArr[i].name,"name_%d",i);
		personArr[i].age = i + 18;
	}
	printArray(personArr,4);

	if (personArr!=NULL)
	{
		free(personArr);
		personArr = NULL;
	}
}
int main()
{
	test03();
}

结构体赋值的问题

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct Person
{
	char name[64];
	int age;
};
void test01(){
	struct Person p1 = {"Tom",18};
	struct Person p2 = {"Jerry",20};
	p1 = p2;
	printf("p1的姓名:%s  年龄:%d\n",p1.name,p1.age); //Jerry 20
	printf("p2的姓名:%s  年龄:%d\n", p2.name, p2.age); //Jerry 20

}

struct Person2
{
	char *name;
	int age;
};
void test02(){
	struct Person2 p1;
	p1.age = 18;
	p1.name = malloc(sizeof(char)*64);
	strcpy(p1.name,"Tom");

	struct Person2 p2;
	p2.age = 20;
	p2.name = malloc(sizeof(char)*128);
	strcpy(p2.name,"Jerry");
	//p1 = p2;

	//自己提供赋值操作 深拷贝
	//先释放原有内容
	if (p1.name!=NULL)
	{
		free(p1.name);
		p1.name = NULL;
	}
	p1.name = malloc(strlen(p2.name)+1);
	strcpy(p1.name,p2.name);
	p1.age = p2.age;
	printf("p1的姓名: %s  年龄: %d\n", p1.name, p1.age);
	printf("p2的姓名: %s  年龄: %d\n", p2.name, p2.age);

	if (p1.name!=NULL)
	{
		free(p1.name);
		p1.name = NULL;
	}
	if (p2.name!=NULL)
	{
		free(p2.name);
		p2.name = NULL;
	}
}
int main()
{
	
	test02();
	return 0;
}

结构体嵌套一级指针

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

struct Person
{
	char *name;
	int age;
};
struct Person **allocateSpace(){
	struct Person **pArray = malloc(sizeof(struct Person *)*3);
	for (int i = 0; i < 3; i++)
	{
		//给每个结构体开辟内存
		pArray[i] = malloc(sizeof(struct Person));
		//给每个结构体的姓名开辟内存
		pArray[i]->name = malloc(sizeof(char *)*64);
		sprintf(pArray[i]->name,"name_%d",i);
		pArray[i]->age = i + 20;
	}
	return pArray;
}
void printArray(struct Person **pArray,int len){
	for (int i = 0; i < len; i++)
	{
		printf("姓名:%s 年龄%d\n",pArray[i]->name,pArray[i]->age);
	}
}
void freeSpace(struct Person **pArray,int len){
	for (int i = 0; i < len; i++)
	{
		//释放姓名
		if (pArray[i]->name!=NULL)
		{
			printf("%s被释放了\n",pArray[i]->name);
			free(pArray[i]->name);
			pArray[i]->name = NULL;
		}
		//释放结构体
		free(pArray[i]);
		pArray[i] = NULL;
	}
	//释放数组
	free(pArray);
	pArray = NULL;
}
void test01(){
	struct Person **pArray = NULL;//malloc(sizeof(struct Person *)*3);
	pArray = allocateSpace();
	printArray(pArray,3);

	//释放内存
	freeSpace(pArray,3);
	pArray = NULL;

}
int main()
{
	
	test01();
	return 0;
}

结构体的偏移量

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<stddef.h>
struct Person{
	char a;//0-3
	int b;//4-7
};
void test01(){
	struct Person p1;
	struct Person *p = &p1;
	printf("b的偏移量为 :%d\n",(int)&(p->b)-(int)p);
	printf("b的偏移量为:%d\n",offsetof(struct Person,b));
}

//通过偏移量 获取到数据
void test02(){
	struct Person p1 = {'a',10};
	printf("p.b=%d\n",*(int *)((char*)&p1+offsetof(struct Person,b)));
	printf("p.b=%d\n",*(int *)((int*)&p1+1));
}

//结构体嵌套结构体
struct Person2{
	char a;
	int b;
	struct Person c;
};
void test03(){
	struct Person2 p = { 'a', 10, 'b',20 };
	int offset1 = offsetof(struct Person2,c);
	int offset2 = offsetof(struct Person,b);
	//printf("%d\n  %d\n",offset1,offset2); 
	printf("%d\n",*(int *)((char *)&p+offset1+offset2));
	printf("%d\n",((struct Person *)((char*)&p+offset1))->b);
}
int main()
{
	//test01();
	//test02();
	test03();
}
发布了122 篇原创文章 · 获赞 58 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39112646/article/details/102925738