C++ 指標:初學者指南

你好,未來的程式設計師!今天,我們將要踏上一段令人興奮的旅程,探索 C++ 指標的世界。別擔心如果你從未寫過一行代碼——我將成為你的友好指南,我們將一步一步地探索這個主題。那麼,讓我們開始吧!

C++ Pointers

指標是什麼?

想像你在一個巨大的圖書館裡。每本書都有它在書架上的獨特位置,對吧?在計算機的世界裡,記憶體就像這個圖書館,而指標就像小小的紙條,告訴我們如何精確地找到特定信息的位置。

在 C++ 中,指標是一種變量,它存儲另一個變量的記憶體地址。這就像擁有一張藏寶圖,直接引導我們找到數據存放的地方!

讓我們看一個簡單的例子:

int age = 25;          // 一個普通的整數變量
int* ptr_age = &age;   // 一個指標變量,存儲 'age' 的地址

在這段代碼中:

  • age 是一個普通的整數變量,存儲值 25。
  • ptr_age 是一個指標變量。* 告訴我們它是一個指標。
  • &age 給我們 age 變量的記憶體地址。

所以,ptr_age 現在持有 age 在記憶體中存儲的地址。酷炫吧?

在 C++ 中使用指標

既然我們知道了指標是什麼,讓我們看看如何使用它們。我們使用指標主要有兩種操作:

  1. 獲取變量的地址(使用 &
  2. 存取地址上的值(使用 *

這裡有一個更全面的例子:

#include <iostream>
using namespace std;

int main() {
int cookie_count = 5;
int* ptr_cookies = &cookie_count;

cout << "Cookie count: " << cookie_count << endl;
cout << "Address of cookie_count: " << ptr_cookies << endl;
cout << "Value at the address: " << *ptr_cookies << endl;

*ptr_cookies = 10;  // 使用指標改變值
cout << "New cookie count: " << cookie_count << endl;

return 0;
}

讓我們分解這段代碼:

  1. 我們創建一個 int 變量 cookie_count 并將它設為 5。
  2. 我們創建一個指標 ptr_cookies,它存儲 cookie_count 的地址。
  3. 我們直接打印 cookie_count 的值。
  4. 我們打印存儲在 ptr_cookies 中的地址(這是 cookie_count 的地址)。
  5. 我們使用 *ptr_cookies 來存取存儲在 ptr_cookies 地址中的值。
  6. 我們使用 *ptr_cookies = 10 來改變地址上的值。
  7. 我們再次打印 cookie_count 來看變化。

當你運行這個程序時,你會看到通過指標改變的值也會改變原始變量。這就像魔法,但這只是指標的工作原理!

C++ 指標:進階概念

當我們對指標越來越熟悉時,讓我們探討一些進階概念。

指標和數組

在 C++ 中,數組和指標是密切相關的。實際上,數組的名稱本质上是指向其第一個元素的指標。讓我們看一個例子:

int numbers[] = {1, 2, 3, 4, 5};
int* ptr = numbers;  // ptr 現在指向 numbers 的第一個元素

cout << "First element: " << *ptr << endl;
cout << "Second element: " << *(ptr + 1) << endl;
cout << "Third element: " << *(ptr + 2) << endl;

在這裡,ptr 指向 numbers 數組的第一個元素。我們可以通過對指標增加來訪問其他元素。

動態記憶體分配

指標最强大的用途之一是動態記憶體分配。這讓我們能夠創建在編譯時不知道大小的變量和數組。

int* dynamic_array = new int[5];  // 分配記憶體給 5 個整數

for(int i = 0; i < 5; i++) {
dynamic_array[i] = i * 10;
}

for(int i = 0; i < 5; i++) {
cout << dynamic_array[i] << " ";
}

delete[] dynamic_array;  // 記得在使用完畢後釋放記憶體!

在這個例子中,我們使用 new 來為一個整數數組分配記憶體。我們可以像使用普通數組一樣使用這個數組。當我們完成時,我們使用 delete[] 來釋放記憶體。

指標的指標

是的,我們可以有指向指標的指標!這個概念在許多高級編程場景中非常有用。

int value = 42;
int* ptr1 = &value;
int** ptr2 = &ptr1;

cout << "Value: " << **ptr2 << endl;  // 這將打印 42

在這裡,ptr2 是一個指向指標的指標。我們需要使用 ** 來存取它最終指向的值。

常見指標方法

讓我們總結一些常見的指標操作,並以一個方便的表格形式展示:

操作 語法 描述
宣告 int* ptr; 宣告一個指向整數的指標
賦值 ptr = &var; var 的地址賦值給 ptr
解引用 *ptr 存取 ptr 指向的值
递增 ptr++ 將指標移動到下一個記憶體位置
递减 ptr-- 將指標移動到前一個記憶體位置
空值賦值 ptr = nullptr; 將指標賦值为空

記住,能力越強大,責任越大。指標非常强大,但如果不小心使用,也會導致錯誤。總是初始化你的指標,並注意記憶體管理。

總結來說,指標可能在一開始看起來有些複雜,但隨著練習,它們會成為你 C++ 編程工具包中無價的工具。它們允許高效地管理記憶體,實現强大的數據結構,並是許多高級 C++ 概念的基礎。

繼續練習,保持好奇心,並且快樂編程!

Credits: Image by storyset