C语言结构体总结



结构体专题

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");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值