什麼時候使用一級指標?什麼時候使用二級指標?一/二級指針對實參形參能造成什麼影響?為什麼鍊錶建立,清空,刪除結構體指標級別的不同造成什麼樣的影響?…等等宇宙大難題,至今還沒搞明白,希望能通過交換變數的的例子來進一步加深對指標、全域性/區域性變數、以及實參形參傳遞方向的理解和記憶。
全域性變數/區域性變數(作用域問題)
關於實參形參
關於指標級別(略)
關於指標函式(?_?可能說的不對,看下方解釋)
函式指標,函式引數為指標型別。
設有以下函式:
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 陣列遍歷方式二 使用陣列名自增遍歷陣列...