结构体专题

来源:互联网 发布:自动发卡对接淘宝 编辑:程序博客网 时间:2024/05/29 13:35

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

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

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

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

结构体类型定义


#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编译器给我分配内存//1Teacher  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){inti,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(){inti = 0;TeacherArray[3];  //在stack 分配内存intnum = 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); //TeacherArray[3]if (tmp == NULL){return NULL;}return tmp; //}void FreeTeacher(Teacher *p){if (p != NULL){free(p);}}void main233(){inti = 0;//TeacherArray[3];  //在stack 分配内存intnum = 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 t2copyTeacher(&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]; //64int age ;  //4int p; //4char *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);   //64printf("%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 ;}



原创粉丝点击