指標&參考
戴瑢溱
戴瑢溱
- 楓資 教學長
- 學術力 : Python、C++、網頁前端..
- 興趣 : 在凌晨4點祝別人生日快樂
- 專長 : 和別人猜拳都輸、轉盤都轉到我、錯過公車捷運社巴
仙人掌



Index
簡介
簡介 - 變數與記憶體位置
-
電腦裡的每個變數都存放在記憶體的一個位置
-
每個位置都有一個「位址(address)」


一本藍色的書
第一排第四本
int a = 10;&a = 0x7ffce2a6465c讓我們可以直接操作記憶體 !!!
簡介 - 指標&參考
-
指標 : 存放變數的位址
-
參考 : 幫變數取另一個名字


一本藍色的書
第一排第四本
我最喜歡的書
把位置抄在便條紙上 !
兩個名字都能找到這本書 !
指標 pointer
指標 pointer
指標是一個變數, 存放一個記憶體位址, 指向另一個變數.
| a | b | c | |
|---|---|---|---|
| 型態 | int | bool | string |
| 數值 | 10 | true | "zsisc" |
| 位址 | 0x1001 | 0x1002 | 0x1003 |
每台電腦存變數的記憶體位址會不同 !!
int a = 10;
int *p = &a; // p 儲存 a 的位址指標 - 宣告
宣告一個指標 p 指向 a 的記憶體位址
#include <iostream>
using namespace std;
int main(){
int a = 10;
int *p = &a;
cout << p; // 0x7fff683232a4
}變數型態 *變數名稱 = &另一個變數;指標 - 取址符號
& 取址符號, 獲取變數的記憶體位址.
#include <iostream>
using namespace std;
int main(){
int a = 10;
cout << a; // 10
cout << &a; // 0x7ffec663074c
}指標 - 取值符號
* 取值符號, 獲取指標存的值.
#include <iostream>
using namespace std;
int main(){
int a = 10;
int *p = &a; // 宣告指標
cout << p; // 0x7ffec663074c
cout << *p; // 10
}指標 - 小練習
#include <iostream>
using namespace std;
int main(){
int a = 10;
int *p = &a;
cout << p << endl;
cout << &p << endl;
cout << *p << endl;
}0x7fff04dd4a3c // a的位址0x7fff04dd4a30 // p的位址10 // p指向的位址的值 也就是a的值指標 - 小練習
#include <iostream>
using namespace std;
int main(){
int a = 10;
int *p = &a;
cout << a << endl;
cout << &a << endl;
cout << p << endl;
cout << *p << endl;
}0x7fff04dd4a3c // a的位址0x7fff04dd4a3c // p的值 也就是a的位址10 // p指向的位址的值 也就是a的值10 // a的值指標 - 小測驗
#include <iostream>
using namespace std;
int main(){
int a = 10;
int *p = &a;
cout << &a << endl; // (A)
cout << *&a << endl; // (B)
cout << &*&p << endl; // (C)
cout << *p << endl; // (D)
}10 // a的值0x7ffe51f97d10 // p的位址的值的位址 也就是p的位址10 // p指向的位址的值 也就是a的值0x7ffe51f97d1c // a的位址指標 - 陣列
陣列名指向陣列中第一個元素的指標
#include <iostream>
using namespace std;
int main(){
int arr[3] = {1, 2, 3};
cout << arr; // 0x7ffdc93264b4
cout << *arr; // 1
return 0;
}指標 - 陣列
利用指標配合陣列進行遞往存取
#include <iostream>
using namespace std;
int main(){
int arr[3] = {1, 2, 3};
int *p = arr;
cout << *p; // 1
cout << *(p+1); // 2
cout << *(p+2); // 3
return 0;
}#include <iostream>
using namespace std;
int main() {
int arr[3] = {5, 10, 15};
int *p = arr;
cout << *p << endl; // 5
p++; // 遞往下一個元素
cout << *p << endl; // 10
p++; // 遞往下一個元素
cout << *p << endl; // 15
}參考 reference
參考 reference
參考是一個變數的別名, 可以讓一個變數等同於另一個變數.
int a = 10;
int &r = a; // r 是 a 的參考參考 - 宣告
宣告一個 r 參考變數 a 的值
#include <iostream>
using namespace std;
int main(){
int a = 3;
int &r = a;
cout << r; // 3
}變數型態 &變數名稱 = 原變數;參考和被參考的變數記憶體位址一樣, 裡面存的值也一樣.
#include <iostream>
using namespace std;
int main(){
int a = 3;
int &r = a;
cout << &r << " " << &a; // ox7ffcfd2c10f4 ox7ffcfd2c10f4
}是分身 !!
參考 - 宣告
為什麼要這樣做 ?
#include <iostream>
using namespace std;
int main(){
int a = 3;
int r = a;
a = 5;
cout << r; // 3
}#include <iostream>
using namespace std;
int main(){
int a = 3;
int &r = a;
a = 5;
cout << r; // 5
}參考 - 宣告
參考 - 函式
函式參數預設是傳值, 只操作變數的副本.
使用指標達到「傳址」效果
int main(){
int x = 5;
add(x);
cout << x << endl;
}void add(int a) {
a++;
}void add(int &a) {
a++;
}6
5
參考 - 小測驗
請撰寫一段函式使 x 與 y 的值交換
int main(){
int x = 3, y = 5;
swap(x, y);
cout << x << ' ' << y << endl;
}參考 - 解答
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}#include <iostream>
using namespace std;
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main(){
int x = 3, y = 5;
swap(x, y);
cout << x << ' ' << y << endl;
}kahoot !
指標參考
By ariel tai
指標參考
- 21