C/C++ 指針與內存操作詳解——從一級指針到字符串轉換函數的完整解析
本文將帶你系統理解 一級指針與二級指針的區別、數組拷貝的注意事項、字符串轉整數函數實現 等 C/C++ 編程中常見且易混淆的知識點,并配合詳細代碼示例與常見坑點分析,讓你從入門到掌握。
一級指針與二級指針的講解
在 C/C++ 中,指針不僅能指向數據,還能指向另一個指針。這就產生了一級指針與二級指針的區別。
-
一級指針
例如char* pt
,它本身存儲的是一個內存地址,該地址指向具體數據值。
舉例:char ch = 'A'; char* pt = &ch; // pt 存放的是 ch 的地址
-
二級指針
例如char** pt
,它存儲的地址指向的是另一個指針變量,而不是直接指向數據。
舉例:char ch = 'A'; char* p1 = &ch; // p1 是一級指針 char** p2 = &p1; // p2 是二級指針,指向 p1
示例:指向字符串數組的二級指針
假設有一個字符串數組:
char* STR[] = {"ABCD", "EFGH", "IJKL"};
STR
存放的其實是多個字符串的首地址(每個元素是char*
)。- 若用指針指向它,應使用二級指針:
char** pt = STR; // pt 是二級指針,指向字符串數組
否則會出現類型不匹配的編譯錯誤。
常見錯誤寫法:
char* pt = STR; // 錯誤!類型不匹配
因為 STR
的類型是 char**
,直接賦給 char*
會丟失一層地址信息。
數組拷貝的注意事項
假設題目要求:從數組 X 拷貝 50 個字節到數組 Y。
錯誤做法
Y = X; // 錯誤!數組名是地址常量,不能直接賦值
正確做法
使用 memcpy
按字節拷貝:
memcpy(Y, X, 50); // 從 X 復制 50 個字節到 Y
注意點:
memcpy
第三個參數是 字節數,不是元素個數。- 如果數組類型是
int
(每個元素占 4 字節),拷貝 50 字節意味著會拷貝 12 個多一點的int
元素,不是整 50 個元素。 - 要明確題目要求的是 “字節” 還是 “元素”。
字符串轉整數函數實現
需求:實現 ascii_to_int
,將數字字符串轉換為整數。
函數原型
int ascii_to_int(const char* string);
實現思路
-
遍歷字符串中的每個字符。
-
檢查是否為數字字符(
'0'
~'9'
)。 -
若是數字,按十進制累加計算:
value=value×10+(當前字符?′0′) value = value \times 10 + (當前字符 - '0') value=value×10+(當前字符?′0′)
-
若遇到非數字字符,立即返回 0。
代碼示例
int ascii_to_int(const char* string) {int value = 0;for (int i = 0; string[i] != '\0'; i++) {if (string[i] < '0' || string[i] > '9') {return 0; // 遇到非數字字符}value = value * 10 + (string[i] - '0');}return value;
}
測試用例
#include <iostream>
using namespace std;int main() {cout << ascii_to_int("123") << endl; // 輸出 123cout << ascii_to_int("12a34") << endl; // 輸出 0
}
其他要點與常見誤區
-
指針類型必須匹配
char*
與char**
不是同一種類型,不能隨意賦值。 -
memcpy
是按字節拷貝
不會考慮類型大小,要自己計算總字節數。 -
題目細節決定實現方式
要分清“字節”與“元素”的概念,尤其在涉及sizeof
時避免出錯。
總結
本文從指針基礎到內存拷貝,再到字符串處理,串聯了 C/C++ 中幾個極易出錯的知識點:
- 一級指針與二級指針的內存關系;
- 字符串數組指針的正確定義;
- 數組拷貝的正確方法與細節;
- 字符串轉整數的完整實現。