C語言指標用法注意事項

2022-08-03 05:06:12 字數 2562 閱讀 1899

計算機系統中有四個記憶體區域:1)棧:在棧裡面儲存一些我們定義的區域性變數以及形參;2)字元常量區:主要是儲存一些字元常量;3)全域性區:在全域性區里儲存一些全域性變數和靜態變數;4)堆:堆主要是通過動態分配的儲存空間,即以下講的講的動態分配記憶體空間。

定義int型指標int *p,p是用來儲存乙個位址的值的,我們之所以要為p分配空間是讓它有乙個明確的指向,比如你現在做好了乙個指向方向的路標,但是你並沒有讓這個路標指向乙個確切的方位,這個路標是瞎指的,這樣我們就不能夠通過它來明確到底**是東,**是西了。也就是說在計算機的記憶體裡定義了乙個指標變數,但是我們並沒有讓這個變數指示乙個確切int型別變數的位址,所以必須要讓它有乙個明確的指示方向。所以就要通過動態分配記憶體的方式來認為的規定確定其方向。

當malloc()函式為乙個指標變數p分配了位址,當對p結束操作的時候要釋放p的記憶體空間。動態分配的變數時儲存在堆裡面,但是這個堆的空間不是無限大的,也許當編乙個小的程式的時候可能不會產生影響,但是對於那些大的程式,如果不及時釋放堆的空間就會發生記憶體洩露。所謂記憶體洩露是因為堆的空間被我們動態分配用完了,這樣再去使用動態分配堆的空間的時候就沒有足夠的空間可以使用了,這樣就需要占有原來的空間,也就是會把其他的空間來儲存我們鍵入的值,這樣會導致原來儲存的資料被沖掉,導致了記憶體洩露。

而且當使用malloc()函式釋放完空間,還要將原先的指標變數賦予乙個null,也就是賦予乙個空指標,留著下次的時候使用它。如果不賦予乙個空指標這樣會導致原來的指標變數變成了乙個野指標,就是乙個沒有明確指向的指標,系統不知道它會指向什麼地方,會是系統crash。

注:動態的分配記憶體。可以做到準確分配空間大小,不浪費資源,而且也不會發生程式不斷使用預先分配記憶體不足。動態分配的記憶體空間系統不負責自動**,需要寫**手動釋放。

相對於malloc()函式,calloc()函式就不需要我們賦予null了,這是因為在每次呼叫完calloc()函式的時候系統會自動將原先的指標賦予乙個空指標。除了malloc()、calloc(),還有realloc()函式,比前兩個函式分配更多的空間。

例子1.指標的初始化

初始化不是指標的動態分配記憶體,但類似malloc函式,也就是讓指標變數有確定的方向或者有確定的位址指向。

1)定義並初始化

int a = 10

;int*p = &a;

2)先定義再初始化

int a =10

;int*p;

p = &a;

例項:

1 #include 2

3int

main()

執行結果:

20,20,20,20

2.字串指標

1)定義並賦值

char *pstr = "

hello world!

";

2)先定義再賦值

1

char str = "

hello world!";

2char *pstr;3if

(str)48

else

9

用完之後:

1

if(str)

2

3 指標作為函式形參實參

c語言中實參變數和形參變數之間的資料傳遞是單向的「值傳遞」方式。用指標變數作函式引數同樣要遵循這一規則。不可能通過執行呼叫函式來改變實參指標變數的值,但是可以改變實參指標變數所指向變數的值。

3.1 正確例項**,以輸入的兩個整數按大小順序輸出。正確的**如下:

1 # include2

3int main(void)4

1920

void swap1(int * p1, int *p2) //

定義swap函式,定義兩個指標變數形參p1, p2

21

輸出結果:

1

please enter two number!

2 a = 50, b = 60

3 max = 60, min = 50

3.2 錯誤**例項:

1 # include2

3int main(void)4

1920

void swap2(int * p1, int *p2)

21

輸出結果:

1

please enter two number!

2 a = 50, b = 60

3 max = 50, min = 60

**差異分析:

兩段**其實只是swap1和swap2函式的不同:

正確**傳入實參,指標變數p1和pointer_1都指向變數a,但改變的是實參指標變數所指向的位址的值(即a和b的值都已經改變),呼叫swap函式後,指標變數p1和p2都釋放掉。

錯誤**和正確**前面相同的,傳入實參,指標變數p1和pointer_1都指向變數a,但是改變的只是形參p1和p2的指向的位址,並沒有改變實參的任何東西,呼叫swap函式後,指標變數p1和p2會釋放掉,然後並沒有改變a和b的值。

c語言指標注意事項

這幾天對c語言的指標溫習了下,感覺理解又更深入了一步 c語言的精髓是指標我想確實一點都不錯,但是在使用的時候有很多要注意的地方,大概總結一下 1.指標指向常量區,是不能修改其值的 比如 char p abcfd char ptr abcfd p 1 c 此時會報錯,因為 abcfd 為常量區,其值是...

c語言 關於指標注意事項

使用指標變數作為函式引數時,只有在獲取位址的情況下對元素 p 進行操作,才能真正地修改變數。因為此時實參傳給形參,就是將堆上的申請的首位址傳給形參,這樣形參和實參都指向了堆上的記憶體,形參對堆上記憶體內容的修改,實參也是得到了修改。但是對傳入位址 p 進行操作是無法對原指標本身進行修改的。因為函式在...

C語言注意事項

1 fgetc與fputc函式 fgetc函式從指定的文 件中讀乙個位元組 fputc 函式向指定的檔案寫乙個位元組 2 r 是回車,n 是換行,前者使游標到行首,後者使游標下移一格。c語言程式設計時 windows系統 r 就是return 回到 本行 行首 這就會把這一行以前的輸出 覆蓋掉 如 ...