左值:放在等號左邊的值,代表其表示的儲存空間;
(指標可以作為左值是因為它是乙個變數)
右值:放在等號右邊的值,變數放在右邊代表其所代表的內容;
資料比較基礎,這裡不詳細介紹,這裡只單獨拿出來強調陣列作為函式的引數時的變化:
1.一維陣列作為函式傳遞的引數時,它會降級成為乙個指向一維陣列元素的指標;
2.二維陣列作為函式傳遞的引數時,它會降級成為乙個指向一維陣列的指標;
3.三位陣列作為函式傳遞的引數時,它會降級成為乙個指向二維陣列的指標;
c語言中陣列的排布在記憶體中永遠都是線性的,如二維陣列,三維陣列;
陣列名在做右值時,代表第乙個元素的首位址(陣列名不能做左值)
陣列的首位址代表陣列的位址;
eg:1.一維陣列的陣列名做右值代表第乙個元素的首位址;
2.二維陣列的陣列名做右值代表第一行的首位址;
1.指標也是變數,也有儲存空間和儲存內容;
2.指標本身就是乙個物件,可以賦值和拷貝,無需在定義的時候賦初始值,它的指向可以改變;
eg:int * p = a ; //將a的值放在p所代表的儲存空間中;
itn * q = p;//將p所代表的內容放在q所代表的儲存空間中;
3.指標+1 的實際大小與其指向的物件的型別有關,比如陣列指標和指標陣列;
4.如果兩個指標想要進行加減運算,那麼這兩個指標必須在同乙個陣列中;
1》兩個指標相減的結果是這兩個指標之間元素的個數;
2》如果兩個指標指向不同陣列,則它們之間的加減結果是未定義的;
陣列指標:指向陣列的指標,這是乙個指標;
int (*p) [10]; -----> p + 1 ==》 實際上加了整個陣列;
指標陣列:存放指標的陣列,這是乙個陣列;
int * p[10]; ------> p + 1 ==》 實際上指向第二個元素指標;
函式指標:指向函式的指標;
char (*fuc) (char *p1,char *p2)
指標函式:返回值是乙個指標的函式;
char* fuc (char *p1,char *p2)
指標和陣列的關係
//常量字串沒有名字(在記憶體中),只能使用指標來訪問
char
* ptr =
"abcdef"
;//常量字串有名字arr(在記憶體中),可以直接通過arr來訪問字元
char arr[7]
="abcedf"
;//1.如果乙個指標指向一維陣列時,訪問其中的某個值的訪問是「匿名訪問」, *(ptr+i)
//2.如果乙個陣列指向一維陣列時,訪問其中的某個值的訪問是「具名+匿名 訪問」, arr[i]
(1)二者沒有關係;
(2)二者都是可使用 「匿名訪問」,「具名 + 匿名 訪問」;
(因為 arr[i] —> 編譯器會自動將其翻譯成 *(arr + i))
(3)陣列名是乙個 「指標常量」,指標也是乙個 「指標常量」;
這裡有一篇關於指標的詳解文章:指標
堆適合處理大型資料,棧適合處理小型資料;
記憶體值出現是為了解決效能問題,如果動態申請的內存在使用完成後,沒有使用free釋放掉的話就會造成記憶體洩漏問題;
記憶體申請:
malloc
malloc 申請的記憶體實際上會比申請時大一些;
malloc 申請的值比較大;
malloc 申請時會先向記憶體池要,如果沒有再向作業系統要;
malloc 申請返回值為void* 型別,返回值必須檢查;
void* malloc( unsigned int size );
calloc
也用於記憶體分配,但是其返回位址之前會把它每個位元組初始化為0;
void* calloc( 元素個數, 大小)
realloc
主要用於修改乙個原先已經分配好的記憶體塊的大小,主要用於擴增容量,擴增容量後原指標會被刪除;(主要用於動態調整已經開闢好的空間)
void* realloc (老指標,新的大小)
備註:每次動態申請記憶體空間時,並不是一定會成功,所以申請完後要檢查;
記憶體釋放
主要對於使用者動態申請的堆空間在不適用後的動態**,防止記憶體洩漏;
free
1.free 不可以對一段動態空間多次釋放;
2.free 不可以對一段動態空間只釋放一部分;
動態分配的問題:
動態分配記憶體可能引發的錯誤:
1.操作記憶體時超出了分配記憶體的邊界;
2.記憶體洩漏,分配後的記憶體沒有釋放(free)造成的後果;
這裡有篇文章有詳細介紹:c語言動態分配記憶體
C語言重點散知識整理(二)
1.逗號隔開 2.從左向右依次執行,但是以最後乙個表示式為主 eg int len 3 4,5 6 結果 len 11 1.extern 宣告外部變數 備註 這裡說的是 宣告 宣告乙個變數或者函式是外部變數 思考 為什麼要這麼做呢,如果引入這個變數或者函式所在檔案的標頭檔案就可以直接訪問它們,似乎 ...
C語言重點整理
c語言重點整理 1.sizeof與strlen的區別與聯絡 a sizeof sizeof 是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列 指標 型別 物件 函式等。它的功能是 獲得保證能容納實現所建立的最大物件的位元組大小。由於在編譯時計算,...
C語言重點知識歸納
三種迴圈結構 a for while do while 三種。b for迴圈當中必須是兩個分號,千萬不要忘記。c 寫程式的時候一定要注意,迴圈一定要有結束的條件,否則成了死迴圈。d do while 迴圈的最後乙個while 的分號一定不能夠丟。當心上機改錯 do while迴圈是至少執行一次迴圈。...