指標&參考

戴瑢溱

戴瑢溱

  • 楓資 教學長
  • 學術力 : 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