免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C語言里用結(jié)構(gòu)體和指針函數(shù)實(shí)現(xiàn)面向?qū)ο笏枷?/div>

一、基礎(chǔ)研究

觀察如下兩個(gè)程序a.cb.c

A.c

 

B.c

 

這兩個(gè)程序都是要實(shí)現(xiàn)在屏幕上第1040列打印一個(gè)綠色的字符c

 

這兩個(gè)程序的數(shù)據(jù)組織方式是一樣的,都是使用結(jié)構(gòu)體,而且對共性和個(gè)性的分離的思路也是一樣的,都是將共性封裝在main函數(shù)里,將個(gè)性實(shí)現(xiàn)在子函數(shù)里。但是a.cb.c封裝和分離的角度是不一樣的,a.c沒有將字符和顏色的屬性賦值分離出來,而只是將顯示功能分離出來,b.c將字符、顏色的賦值和顯示功能都分離了出來,用三個(gè)子函數(shù)實(shí)現(xiàn),并將相對應(yīng)的函數(shù)指針封裝到結(jié)構(gòu)體里去。面向?qū)ο蟪绦蛟O(shè)計(jì)的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成,也就是說我們要盡量把功能以子函數(shù)的形式實(shí)現(xiàn)。所以在這里雖然ab的設(shè)計(jì)思想是相同的,但是b.c的封裝性要比a.c的封裝性更好。

再來看下一個(gè)程序:

 

現(xiàn)在要在?處添加語句,使程序能夠?qū)崿F(xiàn)功能。

這里ch * a=new ch);的功能應(yīng)該與ch a;相同,即定義一個(gè)struct c型的結(jié)構(gòu)體變量a。但是我們用ch a;是開辟了一個(gè)ch大小的空間并把它命名為a,而這里ch * a=?只是對一個(gè)指針進(jìn)行了賦值,我們一般對指針賦值只是把一個(gè)地址給它,并沒有開辟空間,但是我們要實(shí)現(xiàn)ch a;的功能,必須要在這一句里對該地址開辟空間。現(xiàn)在的問題就是:怎么在給指針賦值時(shí)開辟內(nèi)存空間?

我們知道數(shù)組在定義時(shí)可以開辟空間,但是數(shù)組定義需要單獨(dú)的一句,而這里需要直接作為右值使用,所以這里需要?jiǎng)討B(tài)地開辟空間。我們最常用的動(dòng)態(tài)內(nèi)存分配方法就是使用malloc函數(shù),這個(gè)函數(shù)有一個(gè)參數(shù),是要開辟的空間字節(jié)數(shù),在這里我們要開辟的空間大小是結(jié)構(gòu)體a的大小,但是我們不知道結(jié)構(gòu)體a的大小,所以我們要用sizeof得出它的大小。用malloc開辟空間后再將其轉(zhuǎn)換成結(jié)構(gòu)體指針賦給a,程序如下:

 

我們之前使用過宏定義,但是在程序中是宏名直接替換掉后面的東西的,而這里宏有參數(shù)x,所以它是帶參宏定義,它的格式為:#define 宏名(形參表字符串。這里的x就是一個(gè)形參。所以我們要在使用時(shí)在宏名后面?zhèn)魅雽?shí)參。

這里的宏名是new,學(xué)過java我們會(huì)發(fā)現(xiàn)java里初始化對象也是使用new,這里的new其實(shí)也是實(shí)現(xiàn)一個(gè)相似的功能。我們可以把結(jié)構(gòu)體ch理解成一個(gè)類,用new對它進(jìn)行實(shí)例化,這樣就可以實(shí)現(xiàn)面向?qū)ο蟮某绦蛟O(shè)計(jì)思想。其實(shí)java里實(shí)例化對象也是開辟一個(gè)內(nèi)存空間并給這個(gè)空間取一個(gè)名字即對象名。結(jié)構(gòu)體為什么可以實(shí)現(xiàn)類的功能呢?我們知道,類里面可以定義變量、數(shù)組、函數(shù),并進(jìn)行一些操作如賦值、調(diào)用函數(shù)之類的,只是在java中類里面程序員不能定義和使用指針進(jìn)行操作。而結(jié)構(gòu)體里面也可以進(jìn)行定義變量、數(shù)組、函數(shù)指針等的操作,所以如果我們要用c語言編寫具有面向?qū)ο笏枷氲某绦?,我們可以用結(jié)構(gòu)體來實(shí)現(xiàn)類似“類”的功能,并用帶參宏定義來實(shí)現(xiàn)實(shí)例化的功能,或者可以直接用malloc函數(shù)來實(shí)現(xiàn)實(shí)例化,只不過這樣語句比較重復(fù)。

雖然我們可以在c語言里面用這種方法實(shí)現(xiàn)面向?qū)ο蟮某绦蛟O(shè)計(jì),但是這樣畢竟不如用java之類的比較適合面向?qū)ο蟮恼Z言來寫有面向?qū)ο笏枷氲某绦?。因?yàn)?/span>java的類里可以進(jìn)行賦值、調(diào)用函數(shù)等功能而c里的結(jié)構(gòu)體不能。java取消了程序員使用指針的權(quán)限,因?yàn)槿绻谶@種高度封裝的語言里使用指針很可能造成很多錯(cuò)誤。

從這里看,面向?qū)ο蠛兔嫦蜻^程程序設(shè)計(jì)思想的區(qū)別在哪里呢?面向?qū)ο蟮某绦蚩赡苄枰嗟姆庋b,它的每一個(gè)對象都是為執(zhí)行特定的功能而封裝的,對象與對象之間相對比較獨(dú)立,關(guān)系清晰,便于程序的功能細(xì)化、管理維護(hù),但是也會(huì)造成程序的代碼量增大。面向過程的程序封裝的主要是一些數(shù)據(jù)結(jié)構(gòu),一個(gè)函數(shù)、變量可以被以多種角度來使用,這樣使程序變得十分精簡短小,但是不容易修改和補(bǔ)充。

我們寫程序是用來解決問題的,而且要解決的是現(xiàn)實(shí)中的問題,所以我們需要將現(xiàn)實(shí)問題轉(zhuǎn)化為符號(hào)化的問題,而現(xiàn)實(shí)中的問題是由個(gè)體所組成的,所以我們將數(shù)據(jù)和處理數(shù)據(jù)的方法封裝起來形成一個(gè)個(gè)體,這個(gè)個(gè)體在問題里面有專門的功能,比如一張紙可以折疊,一支筆可以寫,這樣有助于我們以自身的角度進(jìn)行思考分析,這就是面向?qū)ο蟆H绻妹嫦蜻^程的思路,會(huì)導(dǎo)致問題與程序之間的轉(zhuǎn)化不好處理,可能使解決問題出現(xiàn)偏差。

二、擴(kuò)展研究

1、動(dòng)態(tài)開辟內(nèi)存空間的函數(shù)有哪些?

答:c語言有三個(gè)函數(shù)可以動(dòng)態(tài)開辟數(shù)組:malloc函數(shù)、calloc函數(shù)、realloc函數(shù)。

c語言提供了malloc函數(shù)和free函數(shù)用來執(zhí)行動(dòng)態(tài)內(nèi)存分配和釋放,這些函數(shù)維護(hù)一個(gè)可用內(nèi)存池,malloc函數(shù)可以從內(nèi)存池中提取一塊合適的內(nèi)存,free函數(shù)用來釋放這塊內(nèi)存以供別的程序使用。Malloc函數(shù)分配的是一塊連續(xù)的內(nèi)存,返回值是一個(gè)指向被分配的內(nèi)存塊起始位置的指針。Malloc實(shí)際分配的內(nèi)存可能比你請求的的多一點(diǎn),也可能不會(huì),這是由編譯器決定的。但是malloc也可能分配失敗,如果操作系統(tǒng)無法向malloc函數(shù)提供足夠的可用內(nèi)存,那么它會(huì)返回一個(gè)NULL指針。Malloc返回的指針類型為void *型。Free的參數(shù)必須要么是NULL,要么是malloc函數(shù)、calloc函數(shù)、realloc函數(shù)返回的值。

Calloc函數(shù)的參數(shù)是所需元素的數(shù)量和每個(gè)元素的字節(jié)數(shù),而不是總的字節(jié)數(shù)。Calloc會(huì)把分配的內(nèi)存都初始化為0,而malloc不會(huì)初始化。

Realloc函數(shù)用于修改一個(gè)原先已分配的內(nèi)存塊的大小,如果原先的內(nèi)存塊大小無法改變,那么realloc會(huì)分配另一塊正確大小的內(nèi)存,并把原先那塊內(nèi)存的內(nèi)容復(fù)制到新的塊上。如果realloc的第一個(gè)參數(shù)為NULL,那么它的作用和malloc一樣。

三、研究總結(jié)

這一章里我們學(xué)習(xí)了動(dòng)態(tài)分配內(nèi)存的方法,以及怎么使用宏定義,其實(shí)它們都是為了更好地進(jìn)行封裝。為了對程序進(jìn)行更好地封裝,人們使用了各種方式,甚至開發(fā)了封裝性更強(qiáng)的高級(jí)語言,這使我們解決專門問題的能力更強(qiáng)了。這樣我們編程只是將共性實(shí)現(xiàn)為個(gè)性。因?yàn)檎Z言只是工具,程序員應(yīng)該更專注地研究算法而不是把時(shí)間花在語言上,所以現(xiàn)在的語言都是為了簡化程序員的工作所造成的。

我們封裝的過程,是對事物進(jìn)行抽象的過程,也是對事物進(jìn)行認(rèn)識(shí)的過程,我們從開始到現(xiàn)在,封裝的層次越來越深,處理的問題也越來越復(fù)雜。因?yàn)槲覀冃枰砬鍙?fù)雜問題的內(nèi)部規(guī)律,從而找出解決問題的辦法,而深層次的封裝使問題恢復(fù)成本來的樣子就是一種解決辦法,當(dāng)封裝的程度達(dá)到了一定的水平,就是面向?qū)ο蟮某绦蛟O(shè)計(jì)思想。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服