在最初學習c語言函式時,我們就知道給函式傳參有兩種方法,一種是按值傳遞,另一種是按位址傳遞(傳指標)。
以swap函式為例:
void swap(int a,int b)}}
}int main()
sort(n,a);
for(int i=0;iprintf("%d ",*((*pp)+i));
}return 0;
呼叫函式時,用指標p指向實參a的位址,因為題設要求用指向指標的指標,所以宣告pp指向p,而後操作pp進行排序。看似並沒有什麼問題,因為我在函式中直接操作的就是引數的位址,因此邏輯上沒有問題。但是除錯的時候,總會程式停止執行,那麼問題出在哪了呢?就出在printf("%d ",*((*pp)+i));上了。
對於賦值語句:pp=&p;p確實指向了函式的位址,pp也確實指向了p的位址,而且pp也是全域性變數,但是,p是在函式形參,在函式呼叫結束之後,就消失了,這時,pp指向的位址就不存在了,因此,在輸出時會停止執行。
通常,我總會認為p和a是一樣的。實際上,a是乙個位址常量,p是乙個指向a的指標變數,在函式作用域內有效,函式並沒有返還給main函式東西,因此實際上即使是按指標傳遞變數,仍然是單向傳遞的,只是函式作用於位址,改變了值。
那麼對於這道題,怎麼解決這個問題呢?關鍵就在讓pp指向的值不失效,乙個辦法就是將p宣告為static靜態型別,這樣就能不受函式限制而一直存在:
#include
#define n 100
int **pp;
void sort(int n,int a)}}
}int main()
sort(n,a);
for(int i=0;iprintf("%d ",*((*pp)+i));
}return 0;
}
關於static 的使用
static屬性i是屬於類本身的,或者講沒有物件我們可以直接用類名呼叫 這個程式的結果是20,20.因為static是乙個靜態的,所有的物件共用這個乙個 另外,在main函式裡又把i的值改變了,最終大家共用20 若果再寫個aa2.i 30.則最終結果會為30.以最後的i為準,前面的都會被覆蓋 pub...
關於static的使用
用static宣告區域性變數 區域性變數指在 塊 內部定義的變數,只在 塊內部有效 作用域 其預設的儲存方式是自動變數或說是動態儲存的,即指令執行到變數定義處時才給變數分配儲存單元,跳出 塊時釋放記憶體單元 生命期 用static宣告區域性變數時,則改變變數的儲存方式 生命期 使變數成為靜態的區域性...
關於static的使用
首先,對於區域性變數來說,任何乙個在函式內部定義的變數 包括main 都屬於這個範疇。在執行時,編譯器不會對區域性變數進行初始化,也就是說區域性變數的初始值是隨機的,除非對其進行顯式賦值。區域性變數被儲存在程式的棧空間內,使用完畢後會立即釋放 但是對於靜態區域性變數來說,有了static的修飾之後,...