一、点操作和指针操作本质研究
1、结构体的数据模型
咱们暂不说结构体中是三种定义方式,但是最为普遍的方式莫非给我们业务逻辑自定义数据类型,在这种业务模型中,抽象的数据类型更值得去思考;其模型可以是:
typedef struct _Data
typedef struct _Data{
// 简单数据类型的结构,比如
int gae;
char name[100];
}Data;
{
// 带有指针类型的结构体int gae;
char name[100];
char *p1;char **p2;
}Data;
typedef struct _Data
{
typedef struct _Data// 包含自身的结构体
char *p1;
int gae;
char name[100];
char **p2;struct _Data m; // 此种类型错误
}Data;这种结构体类型模型错误,其错误的原因是编译器为我们分配内存的时候,遇到struct _Data m;时会递归判断这种类型所占内存大小,故不能确定其大小,但是解决包含自身类型的结构体模型是嵌套指针;
// 包含自身的结构体
int gae;
char name[100];
char *p1;
char **p2;
struct _Data *m; // 此种类型正确
}Data2、结构体中运算符操作
a:.
t1.age = 10; //通过 “.”的方法来操作结构体的成员域;
b: ->
p->age = 12;
p->age; // . ->的本质是寻址,寻每一个成员相对于大变量t1的内存偏移,没有操作内存;
二、结构体中套一级指针和二级指针
1.
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
int FreeTArray(Teacher *tArray, int num) { int i =0, j = 0; if (tArray == NULL) { return -1; } for (i=0; i
三、 深 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); }
四、操作符的本质
#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"); }