上一篇我們總結了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;
}
只是稍微列兩種寫法,不一定只能這樣寫,只要能寫的出結果都是好程式!而這兩種方法只差在方法二多用一個變數,去運算、儲存結果並輸出。
就像是人會有居住地址一樣,資料既然被存放在記憶體,那它也會有一個記憶體地址,來代表它被存放的位置。
相對的每一個變數被宣告的當下,記憶體也會分配給它一個地址來儲存資料,只是我們通常使用時只要呼叫變數(誘惑世說使用變數,變數名稱像是人的姓名),就可以直接對資料內容做運算、輸出了,因為有了變數名稱我們就能省去很多不必要的麻煩。
對應關係有點像是這樣:
從第九篇的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;
}
前面我們有提到當我們宣告一個變數,記憶體會分配給它一個地址,而這個地址我們稱它指標(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;
}
從上面這段程式碼我們可以知道,指標變數的資料內容就是指標(變數地址),而指標變數本身也會擁有自己的變數地址,跟一般變數的差別只在於它是用來儲存變數地址的,現階段先知道有這樣的東西、怎麼使用就好,未來我們會提到為什麼會需要這樣的東西。
#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;
}
(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;
}
int* pointer;
(2) 在變數名稱前
int *pointer;
而指標變數的資料型態會代表所指向的變數的資料型態,如以下:
float data = 3.14;
float* poiner = &data;
宣告與取值時
利用指標變數修改其他變數之值時
只要是變數都有自己的變數地址,雖然指標變數的資料內容是指標(變數地址),但其本身也有自己的變數地址。
如果覺得這種敘述方法比較難理解,可以參考以下資料: