C語言 指標高階 《手把手教你學C語言》

2021-10-09 23:09:58 字數 3115 閱讀 1423

3.多級指標

3.2通過指標引用二維陣列

4.函式指標

對於普通的陣列,其一大缺點就一旦定義以後就無法改變其大小容量。這其實本質上是靜態記憶體的缺陷。

靜態記憶體:對於系統分配的記憶體就是靜態記憶體也叫棧記憶體,比如定義的變數,函式等等都是由系統進行記憶體的分配。因而程式設計師自己無法靈活對其進行更改。

值得注意的是靜態變數和靜態記憶體不是想似的概念,靜態變數是全域性變數,在編譯前階段就已經存在了,所以不要混淆。

動態記憶體:動態記憶體是由吃程式設計師自己生成管理的記憶體,也叫堆記憶體。我們可以控制其產生和銷毀。

malloc函式

相當於c++語言的new關鍵字,直接建立乙個指定記憶體大小的空間。

定義:void *malloc(unsigned long size)

此函式的型別是void*型別,即其返回值是乙個可以指向void的指標變數,也就是乙個可以指向任何變數的指標。

例如int *p=malloc(4)向指標變數p直接分配了4個位元組內容。

但是這種程式編寫方式卻不好,因為不同機器對於int大小並沒有乙個統一的共識,所以4個位元組有可能在不同編譯器的編譯下出現歧義。下面的程式設計習慣更好。

int *p=malloc(siazeof(int))或者int *p=malloc(sizeof*p)

free函式

因為堆記憶體完全依賴程式設計師自己的管理,所以既然有建立新記憶體,就得有釋放老記憶體,否則越來越多記憶體消耗將會吃掉全部機器記憶體空間,導致記憶體洩露。

因而我們就需要free函式幫助我們釋放掉不需要的記憶體。而釋放的本質就是將這塊記憶體重現生命為可用記憶體,但是記憶體上內容不一定清空,以及指標的指向也不會改變,為了防止後續指標干擾我們**的記憶體的重新使用,所以伴隨free的使用必須將指標的指向置為null。而記憶體的上內容的處置則因不同編譯器而不同。

free(p);p=null;

動態陣列就是利用動態分配指標大小來表示陣列長度的可變性。

#include

#include

intmain()

printf

("創立的一維陣列是:");

for(i=

0;i)free

(p);

p=null

;return0;

}

對於動態擴增或者縮減動態陣列大小,可以使用realloc函式。

void *realloc(void *p,unsinged long size);

但是需要特別注意的是,如果是縮減長度,盡量使得縮減後長度滿足大於原有資料的長度,否則就會造成資料的丟失。

#include

#include

intmain()

printf

("創立的一維陣列是:");

for(i=

0;i)free

(p);

p=null

;return0;

}

所謂多級指標就是指標的指標。也就是這個地圖上指示的是另乙個地圖的存放地點。

int a;

int*p=

&a;int

**q=

&p;

意義:多級指標的意義所在就是可以幫助我們跨函式的使用動態記憶體。

本質:就是在主調函式中使用背調函式中分配的記憶體空間。

多級指標的使用

#include

void

dynamicarray

(int

**q)

;int

main()

void

dynamicarray

(int

**q)

如果上述**傳入的的不是&p,而是p的話,自然*q=malloc(sizeof*q);就會變成q=malloc(sizeof*q);

所以p指標的指向改變,後續再進行p內容改變也不會影響到i的值變化了。

直接返回被調函式的指標

#include

#include

int*

dynamicarray

(void);

intmain()

int*

dynamicarray

(void

)

這種直接返回被調函式指標的方式也可以實現跨函式的動態記憶體管理。

所謂的二維陣列本質就是一堆陣列的組合,在記憶體依然是乙個個資料連續存放的順序表形式。

*(a+i)+j==&a[i][j]

二維陣列的位址就是其首元素,但是要注意的是首元素不是a[0][0]而是a[0]。

a==

&a[0];

a[0]==

&a[0][

0];a==&(

&a[0][

0]);

上面三個式子等價

#include

#include

intmain()

;int i,j;

int(

*p)[4]

=a;for

(i=0

;i<

3;i++

)printf

("\n");

}return0;

}

函式指標不同於指標變數,它指向的是乙個函式的位址,而不是變數。

int(*p)(int a,int b);

其中()不可以省略,否則意思就變成了返回值為int*指標的函式了。

舉例:

int

func

(int x)

;int

(*p)

(int x)

;p=func;

這樣p代表這個函式的位址,而*p則完全等價於整個函式

手把手入門C語言 C語言指標

指標的長度 指標初步練習 指標的賦值練習 加深指標的理解 總 1 指標用於存放位址 2 列印值 p 3 加深理解指標實驗 p 123 指標的長度 列印各種指標的長度,所有指標的長度為4個位元組 include include 指標的長度 是4個位元組 能夠傳任何型別的位址 main 四個小實驗 in...

手把手教你學Python之元組

目錄 元組的建立 元組和列表的聯絡與區別 生成器推導式 元組是python中內建的有序不可變序列,元組的所有元素放在一對圓括號 中,並使用逗號隔開,元組中元素的型別可以相同也可以不同。建立元組的兩種方式 注意 當元組中只包含乙個元素時,元素後面的逗號不能省略,否則系統會將其看做是其他資料型別。例如包...

手把手入門C語言 列舉

列舉中的變數是遞增的 預設是0開始 首元素的值是0 include include 列舉中的變數是遞增的 預設是0開始 首元素的值是0 定義乙個列舉 enum weekday main 測試列舉中的變數是遞增的 修改下面的 monday 0,tuesday,wednesday,thursday,fr...