结构体类型定义及变量定义
结构体类型定义及结构体变量定义
结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数据类型
结构体类型定义
#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 ;
}