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;
}

results matching ""

    No results matching ""