回顧一下畦浓,以前講的用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)體的指針對(duì)象她按,右邊還有一個(gè)強(qiáng)制轉(zhuǎn)形牛隅,因?yàn)榉祷氐氖且粋€(gè)void* ,如果不轉(zhuǎn)形,在C中可能沒問題酌泰,在LIUNX中貌似就會(huì)出問題倔叼,所以還是采用標(biāo)準(zhǔn)寫法
這里直接對(duì)p進(jìn)行操作,根據(jù)以前的講解宫莱,就是操作的第一個(gè)元素丈攒,p++后,就是操作第二個(gè)元素授霸,所以可以利用指針的加減法來(lái)進(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來(lái)定義一個(gè)別名,這里定義了結(jié)構(gòu)體的別名S碘耳,還定義了一個(gè)結(jié)構(gòu)定的指針別名S1显设,在main中可以看出,真的跟JAVA的寫法越來(lái)越像了辛辨。
最后講結(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是一樣的效果。
其它邏輯和一起說的一樣萍启。