這篇“C語(yǔ)言如何隱藏結(jié)構(gòu)體”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“C語(yǔ)言如何隱藏結(jié)構(gòu)體”文章吧。
成都創(chuàng)新互聯(lián)公司主營(yíng)含山網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App定制開(kāi)發(fā),含山h5成都微信小程序搭建,含山網(wǎng)站營(yíng)銷(xiāo)推廣歡迎含山等地區(qū)企業(yè)咨詢
C++中我們尚可用類(lèi)來(lái)替代結(jié)構(gòu)體,但是,C語(yǔ)言中是沒(méi)有類(lèi)的,只能用結(jié)構(gòu)體,但很多時(shí)候,我們需要隱藏結(jié)構(gòu)體的字段,不讓外界直接訪問(wèn),而是通過(guò)我們寫(xiě)的函數(shù)進(jìn)行間接訪問(wèn),這樣就提高了程序的封裝性。
實(shí)現(xiàn)方法,簡(jiǎn)單來(lái)說(shuō),就是,結(jié)構(gòu)體定義時(shí),要定義在.c文件中,然后我們自己定義一些訪問(wèn)結(jié)構(gòu)體的函數(shù),在.h文件中,只存放函數(shù)原型聲明和對(duì)結(jié)構(gòu)體的聲明。
看個(gè)例子
.c文件中
//stu.c #include#include #include struct stu{ char id[10]; int score; }; struct stu *new_stu() { struct stu *s; s = (struct stu *)malloc(sizeof(struct stu)); return s; } void set_id(struct stu *s,char *id) { strcpy(s->id,id); } char *get_id(struct stu *s) { return s->id; }
可以看到,在.c文件中,我定義了一個(gè)結(jié)構(gòu)體,并且定義了一些用于操作這個(gè)結(jié)構(gòu)體的函數(shù)。
在.h文件中
stu.h #ifndef STU_H #define STU_H struct stu; extern void set_id(struct stu *s,char *id); extern char *get_id(struct stu *s); extern struct stu *new_stu(); #endif
在.h中我聲明了一下結(jié)構(gòu)體struct stu,并且寫(xiě)了函數(shù)的原型聲明,供其他文件調(diào)用。
在main.c中我引用了stu.h
下面是main.c
#include#include "stu.h" int main() { //struct stu s; //s.score = 100; //struct stu s = {{0}}; struct stu *s; s = new_stu(); set_id(s, "950621"); char *id = NULL; id = get_id(s); printf("設(shè)置的id為:%s\n",id); return 0; }
可以看到,在main函數(shù)中,我先是定義了一個(gè)struct stu類(lèi)型的指針,然后通過(guò)new_stu()給這個(gè)指針?lè)峙淞丝臻g,在通過(guò)另外兩個(gè)函數(shù)對(duì)其進(jìn)行了操作。
這里需要注意一下我注釋掉的部分,說(shuō)明一下:
這種情況下,不能定義struct stu類(lèi)型的變量!?。?/p>
因?yàn)椋?/p>
.h文件中,只是對(duì)結(jié)構(gòu)體進(jìn)行了聲明,并沒(méi)有結(jié)構(gòu)體具體細(xì)節(jié)的描述,也就是在main.c中只是聲明了一下struct stu,這樣編譯器就知道有個(gè)結(jié)構(gòu)體類(lèi)型叫struct stu,但是它并不知道stu的內(nèi)部細(xì)節(jié)。
我們都知道,定義一個(gè)變量,編譯器是要給它分配內(nèi)存空間的,但是,此時(shí)編譯器并不知道stu的內(nèi)部細(xì)節(jié),也就不知道stu這個(gè)結(jié)構(gòu)體的變量要占多少空間,自然無(wú)法分配內(nèi)存。這樣在編譯時(shí)期就會(huì)報(bào)錯(cuò)。
但是定義一個(gè)指針變量就不一樣啦,不管是什么類(lèi)型的指針,占據(jù)的內(nèi)存空間都是4個(gè)字節(jié),編譯器只需要確定有個(gè)叫struct stu 的類(lèi)型存在就好了,而.h中那個(gè)聲明,就是在告訴編譯器,有這么一個(gè)類(lèi)型。
同時(shí),這種情況下也不能訪問(wèn)結(jié)構(gòu)體的字段,比如,s->score=100;這條語(yǔ)句在編譯時(shí)就會(huì)報(bào)錯(cuò),原因和上面一樣,編譯器并不知道struct stu結(jié)構(gòu)體的內(nèi)部細(xì)節(jié)。
通過(guò)上面的方法,在除了stu.c文件之外的其他文件中,只能通過(guò)stu.c中定義的函數(shù)來(lái)間接操作結(jié)構(gòu)體變量,而不能直接對(duì)結(jié)構(gòu)體變量進(jìn)行操作,包括不能創(chuàng)建一個(gè)結(jié)構(gòu)體變量!
這樣就很好地體現(xiàn)了程序的封裝性,也提高了程序的安全性。但是就需要我們寫(xiě)很多操作函數(shù)啦,包括創(chuàng)建結(jié)構(gòu)體指針變量分配空間的函數(shù)。
我們也可以在.h文件中用typedef聲明一個(gè)結(jié)構(gòu)體的指針類(lèi)型,如 typedef struct sut * pStu;
以上就是關(guān)于“C語(yǔ)言如何隱藏結(jié)構(gòu)體”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。