Try   HackMD

[C++] 指標與陣列(Pointer & Array)

程式語言就是跟電腦描述如何處理資料,所以要充分瞭解每個程式語言對資料型態的定義,C/C++因為更貼近記憶體的運作來設計,所以很多觀念在描述上略為抽象,在學習上需要格外費心。

建議手繪來幫助記憶。

複合資料型別 (compound type)

相較於基本型別int, double,C++還有一種複合資料型別。

其中很重要,會常用到的複合資料型別,就是參考(reference)、指標(pointer)、陣列(Array)

參考(Reference)

  1. 參考的定義
#include <iostream>
using namespace std;

int main() {
  int i = 1, j = 2;
  int &r = i;       //i is referenced by r  

  cout << "address of r: " <<&r << endl;
  cout << "address of i: " <<&i << endl;

  return 0;
}

  1. 參考本身不是一個物件,而是對於一個已存在物件取別的名稱

指標(Pointer)

  1. 指標本身是一個物件,指向任何一個已存在物件,可以被指定或拷貝
  • 指標宣告時,就要定義是指向哪種資料型態的物件
  • 指標本身儲存的值,有三種情況
    • 指向一個物件,值裡面存放另一個物件的位址
    • 指向另一個物件尾端後的位置
    • 沒有指向任何物件,值即為null
  int i = 42;
  int *p = &i;            //p指向i
  1. 當一個指標指向一個物件,我們可以使用解參考(dereference)運算子*來存取物件
#include <iostream>
using namespace std;

int main() {
  int i = 42;
  int *p = &i;            //p指向i
  cout << *p << endl;     //印出指標p所指向物件i的值,即42

  *p = 0;                //因為p指向i,所以實際是i的值被改變成0
  cout << i <<endl;      //印出指標p所指向物件i的值,即0
  return 0;
}

  1. 關鍵觀念:*, &的符號多重意義
#include <iostream>
using namespace std;

int main() {
  int i = 42;     
  int &r = i;       //& 跟在一個型別,且是宣告的一部份,所以r是一個reference
  int *p;           //* 跟在一個型別,且是宣告的一部份,所以p是一個pointer
  p = &i;           //& 被用在運算式中,做為address-of 運算子
  *p = i;           //* 被用在運算式中,做為dereference運算子
  int &j = *p;      //& 是宣告的一部分;* 是dereference運算子

  cout << "i: " << i << endl;
  cout << "&i: " << &i << endl;
  cout << "r: " << r << endl;
  cout << "&r: " << &r << endl;
  cout << "*p: " << *p << endl;
  cout << "p: " << p << endl;
  cout << "j: " << j << endl;
  cout << "&j: " << &j << endl;
  return 0;
}

  1. void指標:型別void是一個特殊的指標型別,可以存放任何物件的位址

陣列(Array)

  1. 陣列的定義:是一個複合資料型別,放置單一型別物件的容器,並且以位置來存取它們,有固定的尺寸

  2. 宣告與初始化陣列

int a[10];   //宣告一個10int物件的陣列
int *p[10];  //宣告一個10int指標的陣列
  1. 指標算術
    對一個指標做加減,會移動指向陣列中的位置
#include <iostream>
using namespace std;

int main() {
  int a[] = {1,2,3,4,5};
  int *ip = a;          //等同於int *ip = &a[0]
  int *ip2 = ip + 4;    //ip2指向a[4]

  cout << ip2 << endl;

  return 0;
}

參考資料

C++ Primer 5th version

  • CH2.3 複合型別
  • CH3.5 陣列
tags: C/C++程式語言觀念