C語言基礎 指標的作用
阿新 • • 發佈:2018-12-19
---------------start reading--------------
前言 對於一個C語言新手,許多人會有困惑,我們為什麼要用指標,直接用變數定義不是更方便嗎?那麼今天就讓我們來認識一下指標的作用,你便知道指標是多麼的不可或缺了。
首先讓我們來了解一下指標的大小 指標的大小依據平臺來決定可能是4個位元組,可能是8個位元組 X86中指標是32個位元組,X64中指標是64個位元組
接下來讓我們來看一個示例,感受一下指標的必要性
這是一個交換函式
#include<stdio.h> void Exchange(int a ,int b) { int tmp; tmp=b; b=a; a=tmp; } int main() { int m=10; int n=20; Exchange(m,n); printf("%d,%d \n",m,n); return 0; }
但他的執行結果卻沒有交換 這說明功能函式並沒有起到交換的功能
讓我們來剖析一下編譯器內部的操作情況
編譯器傳參給功能函式,功能函式中的數字交換卻沒有影響到主函式,這就給我們造成了一種假象,事實上函式的功能並沒有實現。要想實現這個函式的功能,我們要引用指標
#include<stdio.h> void Exchange(int *p1 ,int *p2) { int *tmp=p1; p1=p2; p2=tmp; } int main() { int m=10; int n=20; Exchange(&m,&n); printf("%d,%d \n",m,n); return 0; }
編譯結果仍然為10,20。這是因為功能函式只交換了p1p2的地址並沒有交換裡面的內容,編譯器執行狀況如圖
再來看一個功能函式
void Exchange(int *p1 ,int *p2)
{
int *tmp=*p1;
*p1=*p2;
*p2=*tmp;
}
這個程式碼不能通過編譯,因為int *tmp=*p
沒有初始化,沒有給*tmp地址,我們稱這種指標為野指標,懸掛指標,沒有地址訪問權。
那麼想要實現交換函式應該怎樣做才正確呢? 這裡,我們就要提到指標的作用:解決父函式,子函式的值傳遞 子函式的改變,能夠影響父函式,一定要傳遞指標(地址)和解引用,兩個條件缺一不可
正確的方法來啦
void Exchange(int *p1 ,int *p2)
{
int tmp;
tmp=*p1;
*p1=*p2;
*p2=tmp;
}
交換結果為20,10
小結:
- 指標作用:解決父函式子函式的值傳遞問題
- 進行值傳遞必須要有傳遞指標和解引用兩個步驟,缺一不可
- 傳遞時實參為地址,要用&。
---------------end---------------