性色xxx-性色欧美xo影院-性性欧美-性夜影院爽黄a爽免费看网站-久青草国产观看在线视频-久青草国产免费观看

推廣 熱搜: 廣場  Java  app  Word  營業(yè)  微信公眾號  北京代理記賬  商城  代理記賬  商標(biāo)交易 

c語言中怎么交換指針數(shù)組里的值 c語言一維數(shù)組如何冒泡排序?

   2023-04-28 企業(yè)服務(wù)招財(cái)貓130
核心提示:c語言一維數(shù)組如何冒泡排序?冒泡排序是一種常見的排序方法,反復(fù)訪問要排序的元素,依次比較相鄰的兩個(gè)元素,如果前面大于后面就交換。用C語言實(shí)現(xiàn)冒泡排序時(shí),需要使用兩個(gè)循環(huán)。對于n個(gè)元素的數(shù)組A,外循環(huán)I

c語言一維數(shù)組如何冒泡排序?

冒泡排序是一種常見的排序方法,反復(fù)訪問要排序的元素,依次比較相鄰的兩個(gè)元素,如果前面大于后面就交換。用C語言實(shí)現(xiàn)冒泡排序時(shí),需要使用兩個(gè)循環(huán)。對于n個(gè)元素的數(shù)組A,外循環(huán)I的取值范圍為0到n-1,內(nèi)循環(huán)J的取值范圍為0到n-1-i,若A[j]GTA[j1],則兩個(gè)元素互換,直到循環(huán)結(jié)束,此時(shí)C語言中一維數(shù)組的冒泡排序完成。希望以上回答能幫到你。

c語言可以泛型編程嗎?如何實(shí)現(xiàn)?

泛型編程是一種非常常見的編程方法。主要目的是實(shí)現(xiàn)靜態(tài)綁定,使函數(shù)可以接受不同類型的參數(shù),并在編譯時(shí)確定正確的類型。

許多語言都支持泛型編程。例如,在C中,可以使用函數(shù)模板和類模板來實(shí)現(xiàn)泛型編程。在單一繼承的語言中,如Java、Objective-C或C#,也可以使用similar和NSObject類型進(jìn)行編程。在具有類型推理功能的編程語言(如Swift)中,可以直接使用泛型編程。

但C語言是高級語言編程的基礎(chǔ)語言,如何用C語言實(shí)現(xiàn)泛型編程確實(shí)是個(gè)問題。首先,C語言不支持函數(shù)重載和模板類型,實(shí)現(xiàn)起來真的很難。

0x01通用指針簡介(void*)

Void*是C語言中的一種類型。眾所周知,在大多數(shù)編程語言中,void類型表示所謂的空類型,比如一個(gè)函數(shù)返回一個(gè)空類型void,這是非常常見的用法。

注意:void的返回值并不意味著沒有返回值,而是意味著返回一個(gè)空類型,這也是為什么你仍然可以在這些函數(shù)中使用return語句的原因。只有某些語言中的構(gòu)造函數(shù)和析構(gòu)函數(shù)沒有返回值。在這些函數(shù)中,不允許使用return語句。它們是顯著不同的。Objective-C是一種獨(dú)特的語言,它的類初始化方法是一種普通的方法,返回值是instancetype(當(dāng)前類的指針類型)。

Void*可能有點(diǎn)不為人知。void*可以表示C語言中任何類型的指針。說到底,對于一個(gè)存儲(chǔ)單元的地址來說,它存儲(chǔ)的所謂數(shù)據(jù)類型只是每次取的字節(jié)數(shù)不一樣,這些存儲(chǔ)單元的地址本身并沒有什么不同。下面會(huì)更好的體現(xiàn)這句話的意思。

void*的大小永遠(yuǎn)是一個(gè)字,就像普通的指針一樣。具體大小因機(jī)器字長而異,例如32位機(jī)器為4字節(jié),64位機(jī)器為8字節(jié)。

我還沒有t在16位8086機(jī)上驗(yàn)證了指針的大小,因?yàn)?086的地址是20位。有興趣的可以回去試試。個(gè)人認(rèn)為指針大小還是16位,因?yàn)?0位是物理地址,物理地址是從段地址和偏移地址計(jì)算出來的。匯編后,C語言中的指針可能只是變成了相對于段地址的偏移地址。畢竟對于8086來說,數(shù)據(jù)永遠(yuǎn)在DS段,而代碼永遠(yuǎn)在CS段。(斜體表示未經(jīng)核實(shí)的陳述)

在C語言中,其他常用類型的指針可以自動(dòng)轉(zhuǎn)換為void*type,而void*type只能強(qiáng)制轉(zhuǎn)換為其他常用類型的指針,否則會(huì)出現(xiàn)警告或錯(cuò)誤。

關(guān)于所謂的void*指向數(shù)組有一個(gè)特別大的坑,這里直接用代碼解釋。

voidSwap(void*array,intx,inty,intmallocsize){

void*tempmalloc(mallocsize)

memcpy(temp,數(shù)組mallocsize*x,mallocsize)

memcpy(數(shù)組mallocsize*x,數(shù)組mallocsize*y,mallocsize)

memcpy(數(shù)組mallocsize*y,temp,mallocsize)

免費(fèi)(臨時(shí))

}

這是一個(gè)經(jīng)典的交換函數(shù),借助臨時(shí)變量temp,不過這個(gè)函數(shù)是通用的,memcpy的用法后面會(huì)介紹。需要注意的是,如果array指向一個(gè)數(shù)組,你可以t直接用amparray[x]或者arrayx來獲取指向x元素的地址,因?yàn)関oid*類型的默認(rèn)指針偏移量是1,和char*一樣,對于大多數(shù)類型都會(huì)造成錯(cuò)誤。因此,在使用泛型類型時(shí),我們必須知道它的原始長度。我們需要一個(gè)名為mallocsize的int類型參數(shù)來告訴我們這個(gè)值,并在計(jì)算指針偏移量時(shí)乘以它。這相當(dāng)于C編程中的模板類型定義或者Java中的泛型參數(shù)。

同時(shí)要注意void*類型的指針,它可以不要在任何時(shí)候被取消參考(或者老師過去叫什么"獲取內(nèi)容"在課堂上?),原因很明顯:void類型的變量是不合法的。因此,如果要解引用,必須先將其轉(zhuǎn)換成普通指針。當(dāng)在數(shù)組中使用時(shí),還應(yīng)該注意解引用操作符優(yōu)先于加法操作符,所以應(yīng)該加上括號,如下所示:

inta*(數(shù)組mallocsize*x)

這段代碼完美體現(xiàn)了C語言編程的丑陋。

0x02sizeof運(yùn)算符簡介

Sizeof運(yùn)算符相信學(xué)過C語言的朋友會(huì)比較熟悉,但是siZeof是一個(gè)運(yùn)營商,很多人都不知道。返回的類型是size_t類型。sizeof運(yùn)算符返回類型占用的空間量。這里唯一的要點(diǎn)是,如果你找到一個(gè)指針類型或數(shù)組名的大小(事實(shí)上,數(shù)組名是一個(gè)指針常量),返回的結(jié)果總是一個(gè)單詞(見上文)。求一個(gè)結(jié)構(gòu)類型的sizeof不是簡單的結(jié)構(gòu)中各種類型的sizeof之和,而是涉及到內(nèi)存對齊的問題。我不這里不想介紹了。詳情請?jiān)L問:如何理解struct的內(nèi)存對齊?-智虎。

0x03memcpy功能簡介

Memcpy是一個(gè)經(jīng)常和void*一起使用的函數(shù),它的函數(shù)原型是:

void*memcpy(void*,constvoid*,size_t)

頭文件屬于string.h,可以看到,這個(gè)函數(shù)本身是以void*type作為參數(shù)和返回值的,其實(shí)很好理解。這是一個(gè)賦值和復(fù)制記憶的過程。將第二個(gè)參數(shù)指向的內(nèi)存復(fù)制到第一個(gè)參數(shù),復(fù)制的字節(jié)數(shù)由第三個(gè)參數(shù)指定。當(dāng)然,第三個(gè)參數(shù)通常是通過sizeof運(yùn)算符獲得的,所以我贏了這里就不舉例了。我還沒有我沒有研究過返回值,也沒有研究過。;我沒用過。如果有知道的朋友可以評論一下。

用0x04C語言實(shí)現(xiàn)泛型編程

話雖如此,我們還沒有t還沒有提到泛型編程。但是,如上所述,一般的思路是使用void*type作為泛型指針,然后使用類似于mallocsize的參數(shù)來指定占用的內(nèi)存大小。占用的內(nèi)存大小是通過sizeof運(yùn)算符獲得的。如果需要賦值,可以使用memcpy函數(shù)來完成。下面是一個(gè)直接的例子,這是一個(gè)通用的快速排序來說明這些問題:

#ifndefCompare_h

#定義比較_h

#包含ltstdio.hgt

#包含JCB.h

intIsGreater(void*x,void*y)

intIsGreaterOrEqual(void*x,void*y)

intIsSmaller(void*x,void*y)

intIsSmallerOrEqual(void*x,void*y)

#endif

//

//Compare.c

//作業(yè)調(diào)度程序

//

//魯創(chuàng)作于2017/11/16。

//版權(quán)?2017魯饒威。全部版權(quán)所有。

//

#包含比較.h

intIsGreater(void*x,void*y){

return*(int*)xgt*(int*)y

}

intIsGreaterOrEqual(void*x,void*y){

return*(int*)xgt*(int*)y

}

intIsSmaller(void*x,void*y){

return*(int*)xlt*(int*)y

}

intIsSmallerOrEqual(void*x,void*y){

return*(int*)xlt*(int*)y

}

//

//QuickSort.h

//作業(yè)調(diào)度程序

//

//魯創(chuàng)作于2017/11/16。

//版權(quán)?2017魯饒威。保留所有權(quán)利。

//

#ifndef快速排序_h

#定義快速排序_h

#包含ltstdio.hgt

#包含ltstdlib.hgt

#包含ltstring.hgt

#包含比較.h

voidQuickSort(void*array,intleft,intright,intmallocsize)

#endif

//

//QuickSort.c

//作業(yè)調(diào)度程序

//

//魯創(chuàng)作于2017/11/16。

//版權(quán)?2017魯饒威。保留所有權(quán)利。

//

#包含快速排序.h

voidSwap(void*array,intx,inty,intmallocsize){

void*tempmalloc(mallocsize)

memcpy(temp,數(shù)組mallocsize*x,mallocsize)

memcpy(數(shù)組mallocsize*x,數(shù)組mallocsize*y,mallocsize)

memcpy(數(shù)組mallocsize*y,temp,mallocsize)

免費(fèi)(臨時(shí))

}

intQuickSortSelectCenter(intl,intr){

返回(左側(cè))/2

}

intquicksortpartition(void*array,intl,intr,intmallocsize){

intleftl

int右r

void*tempmalloc(mallocsize)

memcpy(temp,數(shù)組mallocsize*right,mallocsize)

while(左左右){

while(IsSmallerOrEqual(arraymallocsize*left,temp)ampampleftltright){

左邊的

}

if(左lt右){

memcpy(數(shù)組mallocsize*right,數(shù)組mallocsize*left,mallocsize)

正確

}

while(IsGreaterOrEqual(arraymallocsize*right,temp)ampampleftltright){

正確

}

if(左lt右){

memcpy(數(shù)組mallocsize*left,數(shù)組mallocsize*right,mallocsize)

左邊的

}

}

memcpy(數(shù)組mallocsize*left,temp,mallocsize)

向左返回

}

voidQuickSort(void*array,intleft,intright,intmallocsize){

if(leftgtright){

返回

}

中間中心快速排序選擇中心(左,右)

交換(數(shù)組、中心、右側(cè)、mallocsize)

centerQuickSortPartition(數(shù)組,左,右,mallocsize)

快速排序(數(shù)組,左,中間-1,移動(dòng)平均llocsize)

快速排序(數(shù)組,中心1,右側(cè),mallocsize)

}

這里有個(gè)懸念,明明可以直接比較,何必用很多函數(shù)來完成,也就是關(guān)于Compare.h使用的問題,答案會(huì)在下面揭曉。

0x05泛型的協(xié)議問題

剛才那個(gè)問題涉及到一個(gè)通用的協(xié)議問題,我借用了Objective-C的一個(gè)概念在這里詳細(xì)闡述。就像那個(gè)問題一樣,既然我的快速排序是泛型的,那我怎么保證傳入的實(shí)際泛型參數(shù)一定是可比較的呢?比如很明顯int,float,double是可以比較的,我們也理解char使用ASCII編碼方案的比較,字符串類型甚至可以比較。但是如何比較其他語言中的對象呢?這是一個(gè)問題。在C中,我們可以重載運(yùn)算符,所以我們?nèi)匀豢梢允褂帽容^運(yùn)算符,并使用運(yùn)算符來重載函數(shù)。但是Java和Objective-C呢?而如果傳入的泛型參數(shù)沒有實(shí)現(xiàn)對應(yīng)的運(yùn)算符重載函數(shù)呢?這時(shí),有必要引入一個(gè)協(xié)議的概念。簡單地說,如果一個(gè)類型想要成為一個(gè)排序泛型函數(shù)的泛型參數(shù),你必須實(shí)現(xiàn)一個(gè)可比較的協(xié)議。這個(gè)協(xié)議在Swift語言中叫做Comparable,這樣在編譯的時(shí)候,編譯器就會(huì)知道這個(gè)泛型參數(shù)是可以比較的,從而完成我們的操作,否則就會(huì)出錯(cuò)。這是泛型中的協(xié)議問題。

0x06摘要

C語言的泛型編程以void*為泛型類型,本質(zhì)上是一個(gè)泛型指針。

C語言中的泛型編程需要知道泛型類型變量的內(nèi)存大小,這可以通過sizeof獲得并傳遞給泛型函數(shù)。

在C語言的泛型編程中,要注意數(shù)組的偏移量。void*的默認(rèn)偏移量是1,對于大多數(shù)類型來說是錯(cuò)誤的,需要自己編程轉(zhuǎn)換。

Memcpy函數(shù)用于在C語言的泛型編程中復(fù)制和賦值泛型變量。

在C語言的泛型編程中,我們也需要注意協(xié)議問題,但是在C中,我們只能自己編寫函數(shù)來定義,可以使用其他語言現(xiàn)成的接口或協(xié)議。

 
反對 0舉報(bào) 0 收藏 0 打賞 0評論 0
 
更多>同類資訊
推薦圖文
推薦資訊
點(diǎn)擊排行
合作伙伴
網(wǎng)站首頁  |  關(guān)于我們  |  聯(lián)系方式  |  使用協(xié)議  |  版權(quán)隱私  |  網(wǎng)站地圖  |  排名推廣  |  廣告服務(wù)  |  積分換禮  |  網(wǎng)站留言  |  RSS訂閱  |  違規(guī)舉報(bào)  |  冀ICP備2023006999號-8
 
主站蜘蛛池模板: 日本欧美午夜三级 | 99视频国产在线 | 伊人久久大香线蕉免费视频 | 丝袜调教视频 | 国产成人精品免费久久久久 | 亚洲日本一区二区三区在线不卡 | 欧美黑人三级 | 婷婷视频网站 | 国产精品偷伦视频免费观看的 | 三级黄色片在线观看 | 福利社午夜剧场 | 高清不卡一区二区 | 日本三级黄视频 | 久久国产免费观看精品1 | 在线免费日本 | 曰韩一级片 | 性欧美人与zozoxxxx视频 | 一级做a爰片久久毛片免费看 | 日韩精品视频免费在线观看 | 日韩在线视频线视频免费网站 | 特黄色一级毛片 | 成年人视频在线免费播放 | 在线亚洲欧美 | 成人在线一区二区三区 | 久久精品国产亚洲a | 亚洲成a人v大片在线观看 | 天天天天添天天拍天天谢 | 亚洲精品第一国产综合野 | 日本福利在线观看 | 久久精品成人国产午夜 | 免费观看a级完整视频 | 91成人在线免费观看 | 国产在线精品观看 | 在线看的黄色网址 | 中国一级特黄大片毛片 | 日韩美女一级毛片a | 在线观看国产欧美 | 边做边叫床的大尺度床戏欧美 | 嫩草影院永久在线一二三四 | 1000部禁部视频免费大看 | 日韩欧美h|