Pointer (指標)
[本堂課程教完後,剩下時間可以拿來讓學生寫"手感練習"]
這一章,我們將教大家如何使用指標,指標是什麼呢?
你可以想像它是 記錄別人家門牌號碼的記事本 ,透過它,我們可以更改其他變數的值。
在開始前,先了解一下,什麼是記憶體?
一種利用半導體技術製成的儲存資料的電子裝置。其電子電路中的資料以二進位方式儲存,記憶體的每一個儲存單元稱做記憶元。
複習一下,容量大小
- 1 Byte = 8 bits
- 1 KB = 1024 Bytes = 2^10 B
- 1 MB= 1024 KB = 2^20 B
- 1 GB = 1024 MB = 2^30 B
- 1 TB = 1024 GB = 2^40 B
那要怎麼看一個變數的大小是多少?
#include <bits/stdc++.h>
using namespace std;
int main(){
int a;
long long b;
float c;
double d;
char e;
bool f;
cout << "int 的大小是 " << sizeof( a ) << " Byte(s)" << endl;
cout << "long long 的大小是 " << sizeof( b ) << " Byte(s)" << endl;
cout << "float 的大小是 " << sizeof( c ) << " Byte(s)" << endl;
cout << "double 的大小是 " << sizeof( d ) << " Byte(s)" << endl;
cout << "char 的大小是 " << sizeof( e ) << " Byte(s)" << endl;
cout << "bool 的大小是 " << sizeof( f ) << " Byte(s)" << endl;
return 0;
}
備註 : 在不同電腦不同編譯器,大小可能會有些微差距
那如果是自定義的 struct 大小呢?
#include <bits/stdc++.h>
using namespace std;
struct Student{
char name[20];
int age, gender;
};
Student student;
struct ClassRoom{
Student students[30];
};
ClassRoom A216;
int main(){
cout << "Student 的大小是 " << sizeof( student ) << " Byte(s)" << endl;
cout << "Classroom 的大小是 " << sizeof( A216 ) << " Byte(s)" << endl;
return 0;
}
記憶體位置
那來印看看記憶體的位置
要查看一個變數的記憶體位置,我們只要在它的前面加上 & 就可以看他的地址
#include <iostream>
using namespace std;
int main(){
int a, arr[1005];
cout << "a 的位置 : " << &a << endl;
cout << "arr 的位置 : " << arr << endl;
cout << "arr[0] 的位置 : " << &arr[0] << endl;
cout << "arr[1] 的位置 : " << &arr[1] << endl;
cout << "arr[2] 的位置 : " << &arr[2] << endl;
return 0;
}
想想看 arr[5] 的位置是什麼?
指標
我們可以用一個變數,把這個地址存起來,這種變數叫做 指標
宣告整數指標方式為 int *ptr, *ptr2;
宣告小數指標方式為 float *ptr, *ptr2;
在變數名稱前面加上 *
#include <iostream>
using namespace std;
int main(){
int a = 5;
int *ptr = &a;
cout << "a 的位置是 " << &a << endl;
cout << "a 的位置是 " << ptr << endl;
return 0;
}
如果想要看看或修改, ptr 指的那個位子,它的值是什麼,在他的前面 加上星號
#include <iostream>
using namespace std;
int main(){
int a = 5;
int *ptr = &a;
cout << "a 的位置是 " << &a << endl;
cout << "a 的位置是 " << ptr << endl;
cout << "a 的值是 " << *ptr << endl;
*ptr = 10;
cout << "a 的值是 " << a << endl;
return 0;
}
來看看流程是什麼
範例1:
範例2:
還記得陣列嗎,我們宣告的陣列,其實電腦只記得陣列第零格的記憶體位置,我要拿陣列第n個元素時,
再從第零個位置 + ( n * 元素大小 ) 來找到位置
#include <iostream>
using namespace std;
int main(){
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
cout << "arr 陣列開頭的位置是 " << arr << endl;
cout << "arr 陣列第一個位置是 " << &arr[1] << endl;
cout << "arr 陣列第一個位置是 " << arr + 1 << endl;
cout << "arr 陣列第一個值是 " << arr[1] << endl;
cout << "arr 陣列第一個值是 " << *(arr + 1) << endl;
*( arr+1 ) = 5;
cout << "arr 陣列第一個值是 " << *(arr + 1) << endl;
return 0;
}
來玩玩指標
#include <iostream>
using namespace std;
int main(){
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
int *ptr = arr + 1;
// ptr 指到 arr 第一格的位置
cout << "arr 陣列開頭的位置是 " << (ptr - ?) << endl;
cout << "arr 陣列第一個位置是 " << ptr << endl;
cout << "arr 陣列第一個值是 " << *ptr << endl;
ptr--;
// ptr 現在指到陣列第零格
*ptr = -1;
cout << "arr 陣列第零個值是 " << arr[0] << endl;
return 0;
}