结构体专题

结构体类型定义及变量定义

结构体类型定义及结构体变量定义

结构体是一种构造数据类型

用途:把不同类型的数据组合成一个整体-------自定义数据类型

结构体类型定义


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

//定义一个结构体类型

//定义了一个数据类型 。固定大小内存块的别名 还没有分配内存
//类型的重定义

typedef struct Teacher
{
	char name[64];
	int age ;
	int id;
}Teacher;


//用类型定义变量的方法3种

struct Student
{
	char name[64];
	int aga ;
}s1, s2 ;  //定义类型的同时 定义变量

struct 
{
	char name[64];
	int aga ;
}s3, s4;  //匿名类型 定义变量

//初始化变量的三种方法
//定义变量 ,然后初始化
Teacher  t3 = {"aaaa", 31, 01};
struct Student2
{
	char name[64];
	int aga ;
}s5 = {"names", 21};

struct 
{
	char name[64];
	int aga ;
}s6 = {"names", 21};


void main01()
{
	//struct Teacher  t1; //告诉C编译器给我分配内存

	Teacher  t1; //告诉C编译器给我分配内存//1
	Teacher  t2 = {"aaaa", 32, 02};

	t1.age = 31;  //t1. 操作符  是 干什么  有没有操作内存
					//是寻址操作 计算age 相对于 t1大变量的 偏移量 ===》计算 cup中进行。。
					//没有操作内存

	//通过指针的方式 操作 内存空间
	{
		Teacher *p = NULL;
		p = &t2;
		printf("p->age:%d \n", p->age); //->  是寻址操作 算age 相对于 t2大变量的  偏移量  计算 cup中进行。
		printf("p->name:%s \n", p->name);
	}
	strcpy(t1.name, "t1name");

	printf("t1.name:%s \n", t1.name);



	printf("hello...\n");
	system("pause");
	return ;
}

void  copyTeacher(Teacher to, Teacher from )
{
	to = from;	
}

void  copyTeacher02(Teacher *to, Teacher *from )
{
	//(*to) = (*from);
	*to = *from;
}

void main111()
{

	Teacher  t1 = {"aaaa", 32, 02};
	Teacher  t2;
	Teacher  t3;
	memset(&t3, 0, sizeof(t3));

	t2 = t1; //=号操作下 编译器的行为

	//编译器给我们提供 简单 =号 赋值操作 。。。我们要顺从
	printf("t2.name:%s \n", t2.name);
	printf("t2.age:%d \n", t2.age);

	copyTeacher(t3, t1);
	printf("copyTeacher() after \n");
	printf("t3.name:%s \n", t3.name);
	printf("t3.age:%d \n", t3.age);
	printf("hello...\n");


	copyTeacher02(&t3, &t1);
	printf("copyTeacher02() after \n");
	printf("t3.name:%s \n", t3.name);
	printf("t3.age:%d \n", t3.age);
	printf("hello...\n");


	system("pause");
	return ;

}


结构体做函数参数及结构体数组

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


typedef struct Teacher
{
	char name[64];
	int age ;
	int id;
}Teacher;

void printTeacher(Teacher *array, int num)
{
	int i = 0;

	for (i=0; i<num; i++)
	{
		printf("age:%d \n", array[i].age);
	}
}

void sortTeacer(Teacher *array, int num)
{
	int		i,j;
	Teacher tmp;

	for (i=0; i<num; i++)
	{
		for (j=i+1; j<num; j++)
		{
			if (array[i].age > array[j].age)
			{
				tmp = array[i];  //=号操作  赋值操作
				array[i] = array[j];
				array[j] = tmp;
			}
		}
	}
}


// 结构体数组 3  输入老师的年龄,排序
void main22()
{
	int			i = 0;
	Teacher		Array[3];  //在stack 分配内存
	int			num = 3;

	for (i=0; i<num; i++)
	{
		printf("\nplease enter age:");
		scanf("%d", &(Array[i].age) );
	}

	//打印老师年龄
// 	for (i=0; i<num; i++)
// 	{
// 		printf("age:%d \n", Array[i].age);
// 	}

	printTeacher(Array, num);

	sortTeacer(Array, num);

	printf("排序之后\n");

	printTeacher(Array, num);

	printf("hello...\n");
	system("pause");
	return ;
}

Teacher * createTeacher(int num)
{
	Teacher * tmp = NULL;
	tmp = (Teacher *)malloc(sizeof(Teacher) * num); //	Teacher		Array[3]
	if (tmp == NULL)
	{
		return NULL;
	}
	return tmp; //

}

void FreeTeacher(Teacher *p)
{
	if (p != NULL)
	{
		free(p);
	}
}

void main233()
{
	int			i = 0;
	//Teacher		Array[3];  //在stack 分配内存
	int			num = 3;
	Teacher *pArray = NULL;
	pArray = createTeacher(num);

	for (i=0; i<num; i++)
	{
		printf("\nplease enter age:");
		scanf("%d", & (pArray[i].age) );
	}

	//打印老师年龄
	// 	for (i=0; i<num; i++)
	// 	{
	// 		printf("age:%d \n", Array[i].age);
	// 	}

	printTeacher(pArray, num);

	sortTeacer(pArray, num);

	printf("排序之后\n");

	printTeacher(pArray, num);

	FreeTeacher(pArray);

	printf("hello...\n");
	system("pause");
	return ;
}



结构体的深copy和浅copy

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

typedef struct Teacher
{
	char name[64];
	int age ;
	char *pname2;
	
}Teacher;


//编译器的=号操作,只会把指针变量的值,从from  copy 到 to,但 
//不会 把指针变量 所指 的 内存空间 给copy过去..//浅copy

//结构体中套一个 1级指针 或 二级指针 

//如果 想执行深copy,再显示的分配内存
void copyTeacher(Teacher *to, Teacher *from)
{
	*to = *from;

	to->pname2 = (char *)malloc(100);
	strcpy(to->pname2, from->pname2);

	//memcpy(to, from , sizeof(Teacher));
}
void main51()
{
	Teacher t1;
	Teacher t2;

	strcpy(t1.name, "name1");
	t1.pname2 = (char *)malloc(100);
	strcpy(t1.pname2, "ssss");

	//t1 copy t2

	copyTeacher(&t2, &t1);

	if (t1.pname2 != NULL)
	{
		free(t1.pname2);
		t1.pname2 = NULL;
	}

	if (t2.pname2 != NULL)
	{
		free(t2.pname2);
		t2.pname2 = NULL;
	}

	printf("hello...\n");
	system("pause");
	return ;
}


结构体中的高级话题

偏移量就是一个地址啊,因为每个程序都有独立的内存空间管理,所以都有一个基址,而其它指针地址都是相对于这个基址有一定的"偏移量".
#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

//一旦结构体定义下来,则结构体中的成员..内存布局 就定下了
// 可以通过 age地址 .去 求 大的结构体的内存地址
typedef struct AdvTeacher
{
	char name[64]; //64
	int age ;  //4
	int p; //4
	char *pname2;

}AdvTeacher;


void main()
{
	int i = 0;
	AdvTeacher  t1 = {"aaa",1,2,"asd"};
	AdvTeacher *p = NULL;
	//strcpy(0, "dddd");
	p - 1 ; //编译通过 运行通过 这句话 在cpu中计算                   理解:p是一个变量,这并没有操作内存,所以可以编译通过,  *(p-1)这是在操作内存
	p - 2;
	p - 3;

	p - p;

		int offsize = (int)&(p->age);   //64
		printf("%d \n", offsize);
	
	printf("hello...\n");
	system("pause");
	return ;
}


void main11()
{
	int i = 0;
	AdvTeacher  t1; // & (t1.age)
	AdvTeacher *p = NULL;
	p = &t1;
	//p = p + 100;
	//strcpy(0, "dddd");
	//p - 1 ; //编译通过 运行通过 这句话 在cpu中计算
	//p - 2;
	//p - 3;

	
	{
		int offsize1 =   (int)&(p->age)     此操作和下面操作意思相同        - (int)p; // & (t1.age)         
		int offsize2 = (int )&(((AdvTeacher *)0)->age );  //64     理解:将0这块内存空间强制解释成AdvTeacher * 类型,再取相对于0来说age的相对
               偏移地址,转换为int型变量。
		printf("offsize1:%d \n", offsize1);
		printf("offsize2:%d \n", offsize2);

	}

	printf("hello...\n");
	system("pause");
	return ;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值