指標其實就是乙個變數,只不過它和普通變數有所不同,我們知道變數是用來存值的,指標也不例外,只不過它存的值是乙個位址,即就是用來標記某塊記憶體的位置。
首先我們定義乙個指標 :基型別 * 指標變數名;
int i=0;
int* p=
&i;
這裡我們定義了乙個int* 型別的指標,我們用該指標變數儲存乙個整型資料的位址(&i)。
『 * 』之前有資料型別時並和資料型別一起出現時表示定義乙個該型別的指標變數,當僅與後面的變數組成時表示取指標變數指向位址的值,即就是解引用。
int i=0;
int*p=
&i;printf
("%d\n"
,*p)
;
當作形參變數,在初學者學習指標時基本都會寫過使用乙個函式交換兩個數的值,這個函式中使用兩個指標變數作為形參變數通過位址修改位址中的值來改變兩個變數的值。
void
swap
(int
*x,int
*y)
這裡就涉及到值傳遞和址傳遞,
當值傳遞時,相當於在函式內對實參進行了乙份臨時拷貝,則在此函式內對形參進行的任何操作都不對實參造成任何該改變。形象地說就是將實參複製了乙份,在函式內對這份複製的實參進行任何操作都不會改變原件。
當址傳遞時,在函式內通過對傳入的實參位址操作,改變位址中的資料,從而達到改變實參的效果。形象地說就是將實參的位址或者操作許可權複製了乙份給形參,這樣形參也可以通過自己儲存的位址或許可權對實參進行修改。
例如交換兩個數的值:
void
swap
(int x,
int y)
void
swap
(int
*x,int
*y)
第乙個交換函式就是將實參拷貝給了變數x和y,這裡的x和y儲存在該swap函式的呼叫棧空間中,其中後續的交換操作只是將該棧中的x和y變數進行了交換,實參並不受影響!
第二個函式是將實參的位址傳遞給了x,y指標變數,x,y儲存了兩個實參的位址,在函式內部通過訪問實參儲存的位址來改變實參的資料,從而達到了真正改變實參的值。
那麼指標的使用僅僅只是用來交換兩個數嗎?
當然不是!不知道大家在寫**中有沒有碰到過這樣的問題?
void
fun(
int arr[10]
)int
main()
;fun
(arr1)
;printf
("%d\n"
,sizeof
(arr1));
return0;
}
列印結果:
不知道大家是否接受這樣的結果,反正剛開始我是不理解的,為什麼同樣是10個int型別元素的陣列,結果不應該都是40個位元組嗎?
首先,sizeof是在程式編譯過程就已經執行,而此時arr陣列還沒有開闢空間,所以sizeof計算的是arr作為指標型別所佔的空間,
其次,其實在陣列傳參的時候只是將陣列的首位址傳遞給了函式,而接受的形參無論你寫成陣列形式還是指標形式,其接收的都是首位址,所以在函式內部,該形参隻相當於乙個指標,所以在函式內部列印出來的值為乙個指標變數的位元組空間。
這樣有什麼好處呢?
當出現陣列傳參時,不必拷貝整個陣列,只需將首位址傳遞過去即可,這樣極大的節省了時間和空間的開銷。
最後補充乙個特殊的指標:void*指標詳解
上面就是我學到指標初階的認識,如有問題,請您指出,謝謝觀閱!
C語言初級指標
include include int main printf d n sizeof a 求整個陣列的位元組數,4 4 16 printf d n sizeof a 0 此時陣列名隱式退化成指標,在32位作業系統下是答案是4 printf d n sizeof a 取到了整數1,答案是4 print...
C初級 指標
2.2.指標定義和使用方式 3.拓展知識 4.例項 遞迴就是一層層的進行計算 例如 求 123 n 的值 int fun int n 2.1.記憶體位址和指標 2.1.2 指標說明 2.2.指標定義和使用方式 2.2.1 指標定義格式 int p 表示定義了乙個名為p的短整型指標變數2.2.2 針涉...
c語言初級
個人是乙個菜鳥,受到影響,來一篇c語言基礎 眾所周知,c語言在如今的社會,對一些工程是很有幫助的,在下哪,雖然是個土八路,就是那種自己學的,我發現這種東西必須深入下去,你才會有飯吃,學習一門技術難度係數是很大的,這不是吹牛,我哪,最喜歡的不是別的,而是專注,我以前不知道,所以學的雜亂無章,現在我覺得...