结构体专题
02、点操作和指针操作本质研究
void main() { Teacher t1;
Teacher t2;
Teacher *p = NULL; printf(" %d \n", sizeof( Teacher)); p = &t1; strcpy(t1.name, "name");
t1.age = 10; //通过 “.”的方法来操作结构体的成员域 p->age = 12; p->age; // . ->的本质是寻址。。。。。寻每一个成员相对于大变量t1的内存偏移。。。。。。没有操作内存 //所以这样写是没有问题的。
t2 = t1; //编译器做了什么工作 |
|
|
03、编译器浅copy操作
对结构体而言,指针做函数参数和元素变量做函数不同地方 |
void copyStruct(Teacher *to, Teacher *from) { *to = *from; } // int copyStruct2(Teacher to, Teacher from) { to = from; return 10; } |
04、结构体中套一级指针和二级指针 项目开发要点
|
Teacher *creatTArray2(int num) { int i = 0, j = 0; Teacher *tArray = NULL; tArray = (Teacher *)malloc(num * sizeof(Teacher)); if (tArray == NULL) { return NULL; } for (i=0; i<num; i++) { tArray[i].tile = (char *)malloc(100); } //创建老师带的学生 for (i=0; i<num; i++) { char **ptmp = (char **)malloc((3+1)*sizeof(char *)); for (j=0; j<3; j++) { ptmp[j] = (char *)malloc(120); } //ptmp[3] = NULL; tArray[i].pStuArray = ptmp; }
return tArray; } |
释放函数 |
int FreeTArray(Teacher *tArray, int num) { int i =0, j = 0;
if (tArray == NULL) { return -1; } for (i=0; i<num; i++) { char **tmp = tArray[i].pStuArray; if (tmp ==NULL) { continue;; } for (j=0; j<3; j++) { if (tmp[j] != NULL) { free(tmp[j]); } } free(tmp); } for (i=0; i<3; i++) { if (tArray[i].tile != NULL) { free(tArray[i].tile); tArray[i].tile = NULL; //laji } } free(tArray); tArray = NULL; //垃圾
} |
05、深copy和浅copy
//产生的原因 //编译器给我们提供的copy行为是一个浅copy //当结构体成员域中含有buf的时候,没有问题 //当结构体成员域中还有指针的时候,编译器只会进行指针变量的copy。指针变量所指的内存空间,编译器不会在多分分配内存 //这就是编译器的浅copy,我们要属顺从。。。。 // |
/结构体的定义 typedef struct _AdvTeacher { char *name; char buf[100]; int age; }Teacher ;
Teacher * creatT() { Teacher *tmp = NULL; tmp = (Teacher *)malloc(sizeof(Teacher)); tmp->name = (char *)malloc(100); return tmp; }
void FreeT(Teacher *t) { if (t == NULL) { return ; } if (t->name != NULL) { free(t->name); } } //解决方案 int copyObj(Teacher *to, Teacher *from) { //*to = *from;//copy; memcpy(to, from, sizeof(Teacher)); to->name = (char *)malloc(100); strcpy(to->name, from->name); } |
|
06、结体的高级话题
深刻理解-》 。操作符的本质 |
#include "stdlib.h" #include "stdio.h" #include "string.h" typedef struct _A { int a ; };
//结构体的定义 typedef struct _AdvTeacher { char *name; //4 int age2 ; char buf[32]; //32 int age; //4 struct _A }Teacher ;
void main2() { int i = 0; Teacher * p = NULL; p = p - 1; p = p - 2; p = p +2; p = p -p;
i = (int) (&(p->age)); //1逻辑计算在cpu中,运算 printf("i:%d \n", i);
//&属于cpu的计算,没有读写内存,所以说没有coredown
system("pause"); }
//-> . void main() { int i = 0; i = (int )&(((Teacher *)0)->age );
printf("i:%d \n", i);
//&属于cpu的计算,没有读写内存,所以说没有coredown --> system("pause"); } |