C入門5:指針入門

1. 指針是什么?

指針是一種保存變量地址的變量。
在計(jì)算機(jī)中每個(gè)存儲(chǔ)單元(一個(gè)字節(jié))都有一個(gè)編號(hào),這個(gè)編號(hào)稱為變量地址。

普通變量的值是實(shí)際值,指針變量的值是變量的地址。

  • 取地址
    我們可以在變量名前加上&,表示獲取變量的地址。
int n = 10;
printf("&n=%p\n",&n);
printf("n=%d\n",n);

變量地址通常使用16進(jìn)制表示,使用%p或者%P打印地址。

試一試,多次執(zhí)行上面的代碼編譯的可執(zhí)行文件。

scanf()實(shí)參前面的&符號(hào)

2. 指針怎么用?

2.1 定義指針

定義指針與定義變量的方式一樣,只不過(guò)要在類型和變量名中間加上一個(gè)*星號(hào)。

類型* 指針變量;

指針變量只能使用同類型變量的地址賦值。

int n = 10;
int* p;
p = &n;
printf("&n=%p\n",p);
printf("n=%d\n",n);

也可以直接初始化。

int n = 10;
int* p = &n;
printf("&n=%p\n",p);
printf("n=%d\n",n);

試一下

int n = 0;
int* p = &n;
scanf("%d",p);
printf("%d\n",n);

變量必須賦值后才能使用,指針也是必須賦值后才能使用。

2.2 解引用

指針的強(qiáng)大之處可以直接操作儲(chǔ)存地址里面的數(shù)據(jù)。這種操作稱為解引用。使用時(shí)需要在指針前加上*星號(hào)。
注意:這里的*與聲明指針的含義不一樣,與乘號(hào)也不一樣。

int n = 10;
int* p = &n;
printf("n=%d\n",n);
printf("*p=%d\n",*p);
n = 100;
printf("n=%d\n",n);
printf("*p=%d\n",*p);
*p = 1000;
printf("n=%d\n",n);
printf("*p=%d\n",*p);

在這里對(duì)*p操作就是對(duì)n操作;對(duì)n操作就是對(duì)*p操作。

訪問(wèn)變量?jī)煞N方式:一是通過(guò)變量名直接訪問(wèn),二是指針解引用訪問(wèn)。


  • 試一試
    int n = 10;
    printf("*(&n) = %d\n",*(&n));
    

3. 指針與函數(shù)

3.1 值傳遞

試分析下面代碼執(zhí)行結(jié)果。

int func(int m){
    m = 100;
}

int main(){
   int n = 10;
   func(n);
   printf("n = %d\n",n);
}

函數(shù)調(diào)用的秘密:參數(shù)初始化。

3.2 指針/地址傳遞

試分析下面代碼執(zhí)行結(jié)果。

int func(int* p){
    *p = 100;
}

int main(){
   int n = 10;
   func(&n);
   printf("n = %d\n",n);
}

函數(shù)內(nèi)部改變函數(shù)外部定義的局部變量必須滿足兩個(gè)條件:

  1. 指針參數(shù)
  2. 解引用

4. 試一試

  1. 形參與實(shí)參同名情況
int func(int n){
    n = 100;
}

int main(){
   int n = 10;
   func(n);
   printf("n = %d\n",n);
}
  1. 指針變量連續(xù)定義
int m,n;
m = 10;
n = 20;
int* p,q;
p = &m;
q = &n;
printf("%d %d\n",*p,*q);
  1. 從終端輸入地址
#include <stdio.h>

int main(){
    int m=0;
    int n=0;
    printf("&m=%p\n",&m);
    printf("&n=%p\n",&n);

    int* p;
    scanf("%p",&p);
    scanf("%d",p);

    printf("m=%d\n",m);
    printf("n=%d\n",n);

}

5. 實(shí)踐

  1. 實(shí)現(xiàn)函數(shù)swap()交換兩個(gè)變量的值。
  1. 實(shí)現(xiàn)函數(shù)divmod()輸入?yún)?shù)ab,同時(shí)獲取ab的商和余數(shù)。
  1. 為什么scanf()參數(shù)需要輸入地址?

指針在函數(shù)中有這兩種應(yīng)用,一種是即作為輸入又作為輸出;另一種只作為輸出。

6. 練習(xí)

實(shí)現(xiàn)二元一次方程求根函數(shù)root()輸入?yún)?shù)a、bc,返回是否有根,如果有根返回兩個(gè)根。

一元二次方程ax^2+bx+c=0 (a!=0)的解

7. 要點(diǎn)

  1. 變量訪問(wèn)的兩種方式:名字訪問(wèn)和地址解引用訪問(wèn)。
  2. 指針的兩種操作:訪問(wèn)保存的值(地址)和訪問(wèn)指向的內(nèi)存。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,614評(píng)論 3 44
  • 1.語(yǔ)言中變量的實(shí)質(zhì) 要理解C指針,我認(rèn)為一定要理解C中“變量”的存儲(chǔ)實(shí)質(zhì), 所以我就從“變量”這個(gè)東西開始講起吧...
    金巴多閱讀 1,973評(píng)論 0 9
  • 1. 變量 不同類型的變量在內(nèi)存中占據(jù)不同的字節(jié)空間。 內(nèi)存中存儲(chǔ)數(shù)據(jù)的最小基本單位是字節(jié),每一個(gè)字節(jié)都有一個(gè)內(nèi)存...
    C語(yǔ)言學(xué)習(xí)閱讀 1,359評(píng)論 0 4
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,246評(píng)論 0 38
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,711評(píng)論 0 5

友情鏈接更多精彩內(nèi)容