iT邦幫忙

1

【從零開始的 C 語言筆記】第十一篇-指標

  • 分享至 

  • xImage
  •  

不怎麼重要的前言

上一篇我們總結了scanf的觀念,也出了一個小小的作業希望讓大家熟悉一下scanf & printf的使用。

接下來我們來談一下什麼是指標、scanf用到的「&」是什麼意思!


上次的小作業--數字加總小程式

方法一、

#include <stdio.h>

int main(){
    int data1, data2;
    printf("plz input 2 int: ");
    scanf("%d%d", &data1, &data2);

    printf("ans: %d\n", data1 + data2);

    return 0;
}

方法二、

#include <stdio.h>

int main(){
    int data1, data2;
    printf("plz input 2 int: ");
    scanf("%d%d", &data1, &data2);

    int ans = data1 + data2;
    printf("ans: %d\n", ans);

    return 0;
}

只是稍微列兩種寫法,不一定只能這樣寫,只要能寫的出結果都是好程式!而這兩種方法只差在方法二多用一個變數,去運算、儲存結果並輸出。


資料存放在哪裡?

就像是人會有居住地址一樣,資料既然被存放在記憶體,那它也會有一個記憶體地址,來代表它被存放的位置。

https://ithelp.ithome.com.tw/upload/images/20211027/20142565EOrGCDktgl.png

相對的每一個變數被宣告的當下,記憶體也會分配給它一個地址來儲存資料,只是我們通常使用時只要呼叫變數(誘惑世說使用變數,變數名稱像是人的姓名),就可以直接對資料內容做運算、輸出了,因為有了變數名稱我們就能省去很多不必要的麻煩。

對應關係有點像是這樣:
https://ithelp.ithome.com.tw/upload/images/20211027/20142565VBreb6hdka.png

從第九篇的scanf時,我們就有用到「&」來取址,讓scanf可以把使用者輸入的資料存入地址中,同樣的方法我們使用printf來取得變數地址,輸出看看變數存放的地址長什麼樣子:

#include <stdio.h>

int main(){
    int data = 5;

    printf("data: %d\n", data);
    printf("where is data: %p\n", &data);

    return 0;
}

https://ithelp.ithome.com.tw/upload/images/20211027/20142565X9OVxhqIWt.png


指標是什麼?

前面我們有提到當我們宣告一個變數,記憶體會分配給它一個地址,而這個地址我們稱它指標(Pointer),而如果我們特別宣告一個變數用來儲存指標(變數地址),而那個變數就被稱為--「指標變數」。

我們先來簡單看一段程式碼:

#include <stdio.h>

int main(){
    int data = 5;

    printf("data: %d\n", data);
    printf("where is data: %p\n\n", &data);

    int* pointer;
    pointer = &data;
    printf("pointer: %p\n", pointer);
    printf("where is pointer: %p\n", &pointer);

    return 0;
}

https://ithelp.ithome.com.tw/upload/images/20211027/20142565U8naA6wOuW.png

從上面這段程式碼我們可以知道,指標變數的資料內容就是指標(變數地址),而指標變數本身也會擁有自己的變數地址,跟一般變數的差別只在於它是用來儲存變數地址的,現階段先知道有這樣的東西、怎麼使用就好,未來我們會提到為什麼會需要這樣的東西。


正式使用指標

  1. 指標的相關語法有兩種:
    (1) 「&」取址:可用於把其他變數地址存入指標變數時,或單純取得變數地址。
#include <stdio.h>

int main(){
    int data = 5;
    int* pointer = &data;

    printf("data: %d\n", data);
    printf("where is data: %p\n", &data);

    printf("------\n");

    printf("pointer: %p\n", pointer);
    printf("where is pointer: %p\n", &pointer);

    return 0;
}

https://ithelp.ithome.com.tw/upload/images/20211027/20142565IpUPqqL3zh.png

(2) 「*」取指標內存放內容:可用於修改其指標所代表變數之資料內容

#include <stdio.h>

int main(){
    int data = 5;
    int* pointer = &data;

    printf("data: %d\n", data);
    printf("where is data: %p\n", &data);
    printf("pointer: %p\n", pointer);
    printf("where is pointer: %p\n", &pointer);
    printf("------\n");

    *pointer = 777;

    printf("data: %d\n", data);
    printf("where is data: %p\n", &data);
    printf("pointer: %p\n", pointer);
    printf("where is pointer: %p\n", &pointer);

    return 0;
}

https://ithelp.ithome.com.tw/upload/images/20211027/201425656flX6eHOkG.png

  1. 宣告指標時怎麼做:
    (1) 在資料型態後
int* pointer;

(2) 在變數名稱前

int *pointer;

而指標變數的資料型態會代表所指向的變數的資料型態,如以下:

float data = 3.14;
float* poiner = &data;

https://ithelp.ithome.com.tw/upload/images/20211027/20142565qi77dbFe0C.png


指標小結

  1. 宣告與取值時
    https://ithelp.ithome.com.tw/upload/images/20211027/20142565n28opgjsjV.png

  2. 利用指標變數修改其他變數之值時
    https://ithelp.ithome.com.tw/upload/images/20211027/201425659qEmwhFKQX.png

  3. 只要是變數都有自己的變數地址,雖然指標變數的資料內容是指標(變數地址),但其本身也有自己的變數地址。
    https://ithelp.ithome.com.tw/upload/images/20211027/20142565Cse3EilXMJ.png

如果覺得這種敘述方法比較難理解,可以參考以下資料:

  1. 指標
  2. C語言: 超好懂的指標,初學者請進~
  3. 指標與地址

辛苦看到這裡的你,今天的內容可能比較難以理解,雖然已經盡可能地解釋了,不過還是不清楚的話可以參考其他資料,也許會找到適合自己了解內容的說明方法。

下一篇我們來介紹Math函式庫是什麼吧!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言