C語言基礎(一)

2021-09-28 06:19:15 字數 4064 閱讀 8750

輸入:char str,gets(str)輸出:%s

遇到」燙」經驗問題是:字串越界,或者多輸出,一般重置輸出範圍和末尾加』\0』即可。

extern表明變數或者函式是定義在其他其他檔案中的。例如:extern int a;顯式的說明了a的儲存空間是在程式的其他地方分配的,在檔案中其他位置或者其他檔案中尋找a這個變數。用法

建議最優用法

例如:a.c檔案中定義int a = 5和乙個函式,在a.h裡寫extern int a;,如果要在其他檔案裡呼叫a這個變數和函式,直接#include即可

extern和include的區別

include相當於把include .**件直接帶入到本原始檔裡,比如在b.c檔案裡include 「a.h」,就相當於把a.**件裡所有定義的變數和函式全部拷貝了乙份放入了b.c裡,乙個專案裡,乙個.**件可能會被多個.c原始檔包含,這樣編譯的時候就會報重複定義的錯誤。而且盡量不要在.h裡定義變數,這是乙個不好的習慣

首先 a->b 的含義是 (*a).b,(*a).b 和 a->b 是等價的

一般情況下用「.」,只需要宣告乙個結構體。格式是,結構體型別名+結構體名。然後用結構體名加「.」加網域名稱就可以引用域 了。因為自動分配了結構體的記憶體。如同 int a;一樣。

而用「->」,則要宣告乙個結構體的指標,還要手動開闢乙個該結構體的記憶體,然後把返回的指標給宣告的結構體指標,才能用「->」正確引用。否則記憶體中只分配了指標的記憶體,沒有分配結構體的記憶體,導致想要的結構體實際上是不存在。這時候用「->」引用自然出錯了,因為沒有結構體,自然沒有結構體的域了。

&:按位與

|:按位或

1.從靜態儲存區域分配.

內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在.例如全域性變數、static變數.

2.在棧上建立

在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放.棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限.

3.從堆上分配,亦稱動態記憶體分配.

程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體.動態記憶體的生存期由使用者決定,使用非常靈活,但問題也最多.

(1) malloc()

在記憶體的動態儲存區中分配一塊長度為size位元組的連續區域,引數size為需要記憶體空間的長度,返回該區域的首位址.

(2) calloc()

與malloc相似,引數sizeofelement為申請位址的單位元素長度,numelements為元素個數,即在記憶體中申請numelements*sizeofelement位元組大小的連續位址空間.

(3) realloc()

給乙個已經分配了位址的指標重新分配空間,引數ptr為原有的空間位址,newsize是重新申請的位址長度.

區別:函式malloc不能初始化所分配的記憶體空間,而函式calloc能.如果由malloc()函式分配的記憶體空間原來沒有被使用過,則其中的每一位可能都是0;反之, 如果這部分記憶體曾經被分配過,則其中可能遺留有各種各樣的資料.也就是說,使用malloc()函式的程式開始時(記憶體空間還沒有被重新分配)能正常進行,但經過一段時間(記憶體空間還已經被重新分配)可能會出現問題.

函式calloc() 會將所分配的記憶體空間中的每一位都初始化為零,也就是說,如果你是為字元型別或整數型別的元素分配記憶體,那麼這些元素將保證會被初始化為0;如果你是為指標型別的元素分配記憶體,那麼這些元素通常會被初始化為空指標;如果你為實型資料分配記憶體,則這些元素會被初始化為浮點型的零.

函式malloc向系統申請分配指定size個位元組的記憶體空間.返回型別是 void型別.void表示未確定型別的指標.c,c++規定,void* 型別可以強制轉換為任何其它型別的指標.

realloc可以對給定的指標所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有記憶體的中內容將保持不變.當然,對於縮小,則被縮小的那一部分的內容會丟失**.realloc並不保證調整後的記憶體空間和原來的記憶體空間保持同一記憶體位址**.相反,realloc返回的指標很可能指向乙個新的位址.

realloc是從堆上分配記憶體的.當擴大一塊記憶體空間時,realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果能夠滿足,自然天下太平;如果資料後面的位元組不夠,問題就出來了,那麼就使用堆上第乙個有足夠大小的自由塊,現存的資料然後就被拷貝至新的位置,而老塊則放回到堆上.這句話傳遞的乙個重要的資訊就是資料可能被移動.

int

cmp(

const

void

*a,const

void

*b)

qsort多級結構使用模板:

int

cmp(

struct medalinfo *a,

struct medalinfo *b)

int i = left;

int j = right;

int key = a[left]

;while

(i < j)

/*控制在當組內尋找一遍*/

a[i]

= a[j]

;/*找到乙個這樣的數後就把它賦給前面的被拿走的i的值(如果第一次迴圈且key是

a[left],那麼就是給key)*/

while

(i < j && key >= a[i]

)/*這是i在當組內向前尋找,同上,不過注意與key的大小關係停止迴圈和上面相反,

因為排序思想是把數往兩邊扔,所以左右兩邊的數大小與key的關係相反*/

a[j]

= a[i]

;}

a[i]

= key;

/*當在當組內找完一遍以後就把中間數key回歸*/

sort

(a, left, i -1)

;/*最後用同樣的方式對分出來的左邊的小組進行同上的做法*/

sort

(a, i +

1, right)

;/*用同樣的方式對分出來的右邊的小組進行同上的做法*/

/*當然最後可能會出現很多分左右,直到每一組的i = j 為止*/

}

輸出的輸出需要新建乙個指向原陣列的指標才能正常輸出

方法一:

medalinfo *p;  

p = countryinfo;

for(

int i =

0; i < count; i++

)

方法二:

int

display_name

(medal_info_t* medal_info,

int count)

return0;

}

typedef

struct

medalinfo;

(scanf

("%s%d%d%d"

,

countryinfo[j]

.name,

//因為這是陣列可以不用取址符

&countryinfo[j]

.gold_medal,

&countryinfo[j]

.silver_medal,

&countryinfo[j]

.brone_medal)

!=eof

);

C語言基礎一

命令語句都是在蘋果終端下使用的。編譯 cc c hello.c 把源 變成二進位制檔案 目標檔案 cc one.o two.o three.o 預設生成可執行檔案a.out cc o task one.o 生成可執行檔案task 執行 1 在終端輸入 a.out 2 雙擊a.out檔案,選擇用終端執...

c語言基礎(一)

雙精度和單精度 數字後帶f的是單精度float,不帶的是雙精度double,單精度儲存的範圍是雙精度的倍數,兩種都屬於浮點型,當整數部分位數太多時候,小數部分很可能被遺失。ascii碼中0 31和127是不可以在鍵盤中輸入的。除了轉義字元 字元常量 a 單引號包含乙個 x和兩個16進製制數 任何0 ...

C語言基礎 一

一 語言的發展 1 機器語言 特點 a.或稱為二進位制 語言,計算機可以直接識別,不需要做任何翻譯.b.是第一代的計算機語言.c.使用時難記憶難操作編寫出來的程式全是由0和1的數字組成,直觀性差,難以閱讀,不僅難學,難記難檢查,又缺乏通用性.2.十進位制轉為二進位制 將十進位制除以2的餘數寫出來 直...