結(jié)構(gòu)體的動(dòng)態(tài)內(nèi)存分配與別名

回顧一下,以前講的用malloc的動(dòng)態(tài)內(nèi)存分配,返回值是一個(gè)指針,指向的是這塊內(nèi)塊的地址。 結(jié)構(gòu)體其實(shí)也是一樣的。例下

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

}

關(guān)鍵 struct Student* p = (struct Student*)malloc(sizeof(struct Student) * 10); ?可能看出,這樣寫,返回的,就是一個(gè)結(jié)構(gòu)體的指針對象,右邊還有一個(gè)強(qiáng)制轉(zhuǎn)形,因?yàn)榉祷氐氖且粋€(gè)void* ,如果不轉(zhuǎn)形,在C中可能沒問題,在LIUNX中貌似就會(huì)出問題,所以還是采用標(biāo)準(zhǔn)寫法

這里直接對p進(jìn)行操作,根據(jù)以前的講解,就是操作的第一個(gè)元素,p++后,就是操作第二個(gè)元素,所以可以利用指針的加減法來進(jìn)行遍歷過程

最后,用完動(dòng)態(tài)內(nèi)存都要記得釋放掉

再講講別名

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來定義一個(gè)別名,這里定義了結(jié)構(gòu)體的別名S,還定義了一個(gè)結(jié)構(gòu)定的指針別名S1,在main中可以看出,真的跟JAVA的寫法越來越像了。

最后講結(jié)構(gòu)體中的函數(shù)指針

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

}

首先是定義了一個(gè)和結(jié)構(gòu)體名一樣的別名,為什么這樣定義呢,因?yàn)榉奖悖昝鞯臅r(shí)候可能不寫struct幾個(gè)詞,其次是定義了一個(gè)結(jié)構(gòu)體指針

結(jié)構(gòu)定中,定義了一個(gè)函數(shù)指針! 和以前講的一樣,只需要定義函數(shù)指針的返回值,以及參數(shù)類型就行了。

在外部傳入一個(gè)同樣結(jié)構(gòu)的方法就行! 直接把方法名傳入就行,因?yàn)榉椒褪撬膬?nèi)存地址,就是指針,和&say是一樣的效果。

其它邏輯和一起說的一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容