结构体的动态内存分配与别名

2017-08-21  本文已影响0人  贝克街的猫大哥呀

回顾一下,以前讲的用malloc的动态内存分配,返回值是一个指针,指向的是这块内块的地址。 结构体其实也是一样的。例下

struct Student{

   char* name;

   int age;

};

void main(){

   struct Student* p = (struct Student*)malloc(sizeof(struct Student) * 10);

   p->age = 20;

   p->name = "watson";

   printf(p->name);

   free(p);

   system("pause");

}

关键 struct Student* p = (struct Student*)malloc(sizeof(struct Student) * 10);  可能看出,这样写,返回的,就是一个结构体的指针对象,右边还有一个强制转形,因为返回的是一个void* ,如果不转形,在C中可能没问题,在LIUNX中貌似就会出问题,所以还是采用标准写法

这里直接对p进行操作,根据以前的讲解,就是操作的第一个元素,p++后,就是操作第二个元素,所以可以利用指针的加减法来进行遍历过程

最后,用完动态内存都要记得释放掉

再讲讲别名

typedef struct Student{

   char name[20];

   int age;

}S,*S1;

void main(){

   S s = {"waston",11};

   S1 s1 = &s;

   printf(s1->name);

    system("pause");

}

用typedef来定义一个别名,这里定义了结构体的别名S,还定义了一个结构定的指针别名S1,在main中可以看出,真的跟JAVA的写法越来越像了。

最后讲结构体中的函数指针

typedef struct Student{

   char *name;

   int age;

   void(*sayHi)(char*);

}Student;

typedef Student *StudentP;

void say(char *text){

  printf("SAYHI");

}

void main(){

   Student s = {"watson",11,say};

   StudentP p = &s;

   p->sayHi("saysomething");

   system("pause");

}

首先是定义了一个和结构体名一样的别名,为什么这样定义呢,因为方便,申明的时候可能不写struct几个词,其次是定义了一个结构体指针

结构定中,定义了一个函数指针! 和以前讲的一样,只需要定义函数指针的返回值,以及参数类型就行了。

在外部传入一个同样结构的方法就行! 直接把方法名传入就行,因为方法名就是它的内存地址,就是指针,和&say是一样的效果。

其它逻辑和一起说的一样。

上一篇下一篇

猜你喜欢

热点阅读