再談C語言指標變數 注定與你有多交集

2021-09-12 02:46:50 字數 2401 閱讀 4642

什麼時候使用一級指標?什麼時候使用二級指標?一/二級指針對實參形參能造成什麼影響?為什麼鍊錶建立,清空,刪除結構體指標級別的不同造成什麼樣的影響?…等等宇宙大難題,至今還沒搞明白,希望能通過交換變數的的例子來進一步加深對指標、全域性/區域性變數、以及實參形參傳遞方向的理解和記憶。

全域性變數/區域性變數(作用域問題)

關於實參形參

關於指標級別(略)

關於指標函式(?_?可能說的不對,看下方解釋)

函式指標,函式引數為指標型別。

設有以下函式:

void f(int a,char *s)

此處char *s 即是將指標作為函式引數來使用的。!

所謂指標函式,其實不應該這麼叫它 因為我們已經有了指標陣列,表明它是乙個陣列。 同理指標函式歸根結底他是乙個函式,是這個函式的返回值基型別為void *的指標函式,所以看如下定義:

int  *fun(int,char *);//

這樣宣告就說明他是乙個函式,函式有返回值

關於函式指標,歸根結底,他是乙個指標;指標指向誰?指向函式的指標;它的作用是:將乙個變數的位址傳送到另乙個函式中,函式名代表函式的入口位址。見如下定義

int (*fun)(int,char *);//

函式指標定義

fun = f;//

指標變數賦函式f()的入口位址 同樣能夠在初始化的時候定義。 」

&」。注意實參與形參型別匹配。比較兩者差異的細微區別就在於」()

」優先順序!這一點同陣列指標類似 即int (*p)[10];//二維陣列指標。 int *p[10]

óint (*p[10]) //

指標陣列。而指標函式int *fun();不是指裡面的所有形參都是指標,而是指該定義的函式的返回值是int *。

下面是我在學習中遇到的問題,思考:

1.如何利用一級指標改變主調函式main()中的引數?(以交換變數值為例),顯然這是不可取的?!

#include int *f(int *,int *);

int a=5,b=6;//全域性變數整個程式(程序)消亡後**

int main()

int *f(int *m ,int *n)

此處,需要理解程式的死亡,函式呼叫完結束後空間收回,實參與形參傳遞問題 區域性變數,全域性變數作用域的問題

於是乎,我使用了二級指標 當時我就想我還是不理解上述所說的問題 ,我就用二級指標 這樣我就明白函式呼叫 結束返回後 時個什麼玩意兒 形參指標變數影不影響主調函式內實參指標變數 為什麼值帶不回去?(

)

#include int **f(int **,int **);

int main()

int **f(int **m,int **n)

經過幾許輾轉反側、看書、問同學、消耗時間 總結:被調函式呼叫結束後整個函式就消亡了,而我只帶回了乙個位址(值)

區域性變數**p2被收回(函式消亡)

如果沒有乙個容器s來裝這個位址,那麼照樣無法進行址交換

,故我現在操作的是位址 而不是位址所指向的值 僅僅交換指向 被調函式

呼叫結束後,死亡、區域性變數空間收回;程式死亡後 全域性變數空間被收回。

於是 我回歸到最初 其實這些老師上課都有說明!

這裡僅用這個比較好的例子來更好為自己總結  ;改變了原來的想法 來看看!

#include int *f(int *,int *);

int main()

int *f(int *m ,int *n)

同理 二級指標操作函式來改變值,是要真正意義上的改變值,而非異想天開的想通過改變指標指向來改變指向,

「指向變了 值就變了」這一說法。是作為初學者的我沒理解程式執行的流程 實參形參的傳遞性 全域性,區域性,靜態,建立變數而改變記憶體空間性質 產生的原因。

(關於這塊,我仍然只是理解皮毛,仍需後續進一步的通過各種程式鍛鍊 來理解其中的奧秘!)

#include int **f(int **,int **);

int main()

int **f(int **m,int **n)

以上 有很多說到的知識點 沒做補充說明;學才疏淺而只能為自己和相似的人做貢獻。這裡也有自己目前的學習見解 以交換值為例子 可以更好地解釋我在做題時遇到的問題。

什麼時候使用一級指標 ,什麼時候使用二級指標 這也是需要去積極探索和理解的! 例如在鍊錶中 插入 和 刪除 清空 使用一級指標 二級指標 導致的結果 為什麼回是這樣的結果 它到底是指結點的那塊位址 是我們後續需要加以積極探索的。

C語言 變數與指標 回顧

char a 0 鞋櫃型別為char,容量為1。2.0 陣列 chara 6 橫向6個鞋櫃格仔 3.0 二維陣列 chara 5 6 五行六列的鞋櫃 inta 4 5 五行六列的鞋櫃格仔,每個鞋櫃格仔 容量為char型鞋櫃的四倍,容量為4。4.0 陣列指標 inta 5 6 五行六列的鞋櫃,鞋櫃格仔...

c語言與指標 (一)指標與變數

寫在前面 指標是學習c語言時,最讓人頭痛的乙個難題。但是指標不僅是c語言的精髓,它還貫穿整個計算機底層儲存與訪問方式。指標實際上就是位址,指標變數用來存放指標 位址 指標變數也是一種變數,它和不同的變數同樣要佔一定的儲存空間。但指標變數與不同的變數不同之處在於,指標的儲存空間存放的不是不同的資料,而...

C語言 陣列與指標有哪些區別?

陣列與指標是不等價的,如 陣列名的指向不可以改變,而指向陣列的指標是可以改變的。請看如下 include int main void p a char i 陣列遍歷方式一 for i 0 i 5 i 陣列遍歷方式二 for i 0 i 5 i return 0 陣列遍歷方式二 使用陣列名自增遍歷陣列...