C語言中的 堆 有什麼用處?簡明明瞭說一下,可以舉個例子

2022-10-16 16:44:44 字數 4189 閱讀 3298

1樓:甘子鬆

要講c語言的堆疊,要從計算機的資料記憶體分配講起.

____________________

| stack區(陣列,指標,結構體,區域性變數)

____________________

| static變數(靜態變數,全域性變數)

____________________

| heep區(堆區)

____________________

| **段

____________________

從上面示意圖中可看出整個記憶體分配,堆分配是在記憶體中按塊劃分,也就是相對與函式malloc,realloc,calloc.這3個函式為記憶體分配函式.而且需要手動呼叫free函式釋放資源,否則會造成大量的記憶體碎片.

如果樓主不相信可以自己寫一個死迴圈,內部呼叫malloc函式,建立n個記憶體塊,執行一段時間後,絕對會造成系統癱瘓,資源被耗盡.

棧區劃分為計算機自身劃分,即在函式或區域性變數被呼叫時,系統自動為其分配棧,以後進先出為原則實現變數的儲存,在函式呼叫完畢時,系統會自動釋放棧內資源,所以,棧可以說是短命的(生存週期只在呼叫過程中).

這裡只是粗略說了下堆和棧,另外再說下static-->靜態區,全域性變數或靜態變數存放於靜態區,只要**中存在靜態變數或全域性變數,自動放於靜態區,靜態區存放的變數生存週期是整個程式結束時才釋放.

**段區,顧名思義存放的是程式**(暫時先這麼理解)

2樓:十分不強力

比如說,可以傳遞變數。。。

就比如說你在函式funa()中定義了個int a,funa結束他就被系統**了,但是如果是手動的申請的堆記憶體,他不會被系統自動**,除非程序結束,在其他地方只要知道這塊記憶體的地址就可以對他進行操作。

請問c語言中的 堆排序 原理是什麼,最好有個例子說明一下,謝謝!

3樓:匿名使用者

如果是最大堆,那麼堆頂元素就是最大的。並且它是一種二叉樹的形式。因此它的左右子樹也是一個最大堆。

也就說左子樹和右子樹的根都是當前子樹中最大的元素。堆排序的原理就是維護一個最大堆。可以詳見資料結構書,那段**寫的相當簡潔易懂。

初始化堆時,要弄明白為什麼是更新一半的元素。你可以在紙上畫一畫,對每一個元素從二叉樹上從1開始標號。會發現標號為1 , 2,..

n/2 的結點剛好可以覆蓋二叉樹的所有路徑,並且是從 n/2 到 1 去更新堆,這樣的話就可以構成一個初始化的最大堆。每次更新最大堆時,都是沿著左右子樹的路徑一次更新,要左右子結點較大的元素往上移動,知道更新的元素大於左右子樹的結點值。那麼就成了一個新的最大堆。

複雜度就是二叉樹數的層數。即每次更新複雜度是log(n).

c語言中|=代表什麼意思?最好舉個例子。謝謝!

4樓:齋寄竹夫春

首先|是位操作符或,就是對二進位制位或操作,只要有一個位為1都是1,否則為0

比如二進位制

101|001

的結果就是101

那轉換成十進位制是5再說

|=實際上是

簡寫,比如c=a|b

然後a=c

可以直接寫成a|=b;

5樓:明淑琴盈璧

a|=b,實際上就是a=a|b,是一個位或運算,是二進位制運算,在同一位上數字相同時結果為0,不同十為1。跟+=一樣的性質,都是複合賦值運算子。

例如:有a=2和b=3,他們的二進位制**分別為0000010和0000011

則a|=b,就是

00000010

|00000011

=00000001

既運算的結果為a=1.

6樓:京榮花赤畫

轉義字元中的水平製表,如在c++6.0中顯示預設的是8位空間為一組,/t後浮標移到當前組下一組的開頭位置。

如printf("%d/t%d」,12345,678);結果顯示的是12345

678中間空3個空。

printf("%d%d」,12345,678);

結果顯示的是12345678中間沒有空。

7樓:太史忠甄子

a|=b相當於a=a|b

|是位運算子之一,按位或,即換成2進位制數然後對應位進行或運算。

0|0=0

0|1=1

1|0=1

1|1=1

inta=5,b=6;//5:0101

6:0110

a|=b;

//a=7

7:0111

仔細說一下c語言void的具體使用方法,順便舉個例子什麼的。謝謝哈。

8樓:匿名使用者

void的字面意思是「無型別」,void *則為「無型別指標」,void *可以指向任何型別的資料。   void幾乎只有「註釋」和限制程式的作用,定義一個void變數沒有意義,不妨試著定義:   void a;   這行語句編譯時會出錯,提示「illegal use of type 'void'」。

不過,即使void a的編譯不會出錯,它也沒有任何實際意義。   void真正發揮的作用在於:   (1) 對函式返回的限定;   (2) 對函式引數的限定。

  眾所周知,如果指標p1和p2的型別相同,那麼我們可以直接在p1和p2間互相賦值;如果p1和p2指向不同的資料型別,則必須使用強制型別轉換運算子把賦值運算子右邊的指標型別轉換為左邊指標的型別。

void的使用

下面給出void關鍵字的使用規則:

規則一如果函式沒有返回值,那麼應宣告為void型別      在c語言中,凡不加返回值型別限定的函式,就會被編譯器作為返回整型值處理。但是許多程式設計師卻誤以為其為void型別。

規則二如果函式無引數,那麼應宣告其引數為void。

參考

9樓:匿名使用者

void是一種型別.一般用在函式前面.假設我們要寫一個函式叫myfunction()

但是在c中既然你要寫函式,就要指定函式的返回型別,就是這段函式執行完畢是返回個什麼東西.

比如函式myfunction是要計算兩個int型(整型)變數a+b的和,那就返回一個int行的值(a,b都是int,加起來還是int)所以我們這麼寫函式

int myfunction()//前面的int就是返回型別

如果這個函式沒有返回型別,比如說乾脆就不需要返回個什麼值(比如函式裡只有個printf 輸出一句話),那我們就寫

void myfunction()//前面的void就是說,這個函式返回一個型別,這個型別就是沒有型別的空型別...

另外void也用於宣告一些萬能指標. 比如你要用一個指標,但是還不確定這個指標會指向什麼型別的變數,那就申請一個void型別的指標,它就叫做萬能指標,因為它可以指向任何型別的變數.

c語言入門經典裡的一句話我不懂啊?到底是什麼意思啊?求大神舉個例子給我講解一下行嗎 ?謝謝

10樓:取綽號好難

0xff & 0xff = 0xff;

0x20 & 0xff = 0x20; //(0010 0000) & (1111 1111) = (0010 0000)

0x1000 & 0xff = 0x1000 & 0x00ff = 0x0;

意思是僅保留低位8 位元資料,高於第8位元的值,設定為0;

11樓:

你好,二進位制中也就是保持了原來的最右邊的值不變

c語言中 %f 與%lf 有什麼區別?能否舉一個簡單易懂的例子?初學者,**等 謝謝

12樓:匿名使用者

單精度和雙精度,基礎使用的話是差不多的,都用來表示浮點數也就是帶小數點的數

13樓:

%f 般對應單精度型別 float

%lf 般對應雙精度型別 double

%f是單精度浮點型,輸出的時候要滿足6位小數。

%lf就是輸出數值總長度為l,整數個數加小數個數,不足補空,右頂格起

14樓:匿名使用者

%f對應float資料型別。

%lf對應double資料型別。

例子如下:

void main()

C語言中ascii碼錶有什麼用,C語言中ASCII碼值是什麼意思

計算機中,所有的資料在儲存和運算時都要使用二進位制數表示 因為計算機用高電平和低電平分別表示1和0 例如,象a b c d這樣的52個字母 包括大寫 以及0 1等數字還有一些常用的符號 例如 等 在計算機中儲存時也要使用二進位制數來表示,而具體用哪些二進位制數字表示哪個符號,當然每個人都可以約定自己...

c語言中的,c語言中 是什麼意思

c語言中的 是邏輯運算中的非運算。是c語言中的非運算子,在變數前面使用它,會構建非運算表示式,表示式的返回結果是個布林值 也就是隻有true或false 對變數使用時,如果變數不是布林資料型別,將會強制轉化為布林型別再使用,如整形變數123將被轉化為true,整形變數0將被轉化為false。擴充套件...

C語言中的NULL零的是什麼,C語言中NULL是什麼意思

每個位元組在 復c語言裡都是一個char,字元制串是連續的bai序列的位元組來表示du的。按照這種 zhi定義,為了避dao 免在表示字串的時候是無休止地連續下去的位元組序列,需要用一個特殊的標記來表示字串的結束。而這個標記就是null.而作為人類可閱讀的字串,我們不需要這個null,所以在寫 類可...