首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 基礎復習:數組與字符串深度解析

     編輯:關於C++

前言

本文系統整理 C++ 中數組與字符串的核心知識點,涵蓋數組定義、初始化、作為函數參數的傳遞機制、多維數組細節,以及 C 風格字符串與 std::string 對象的操作差異、轉換、常用函數,配合代碼示例與圖解,適合基礎鞏固與面試準備。

一、數組核心知識點

1. 長度計算與初始化規則

// 計算數組長度
sizeof(A) / sizeof(int);

// 靜態數組未初始化 → 元素自動為 0
static int A[10]; // 全 0

// 函數內部動態數組未初始化 → 隨機值
int A[10]; // 垃圾值

2. 基本使用限制

  • 必須先定義後使用。
  • 只能逐個引用元素,不能一次引用整個數組。
  • 下標必須為正整數(常量/變量/表達式),不允許負數。
  • 整個數組不能進行賦值、算術運算,只能操作單個元素。

3. 數組作為函數參數的傳遞機制

本質:傳遞的是數組首地址(指針),形參數組實為實參數組別名。

// 形參寫法等價
void func(int arr[]);        // 可省略長度
void func(int arr[10]);      // 長度無實際作用
void func(int *arr);         // 本質相同
  • 函數調用不為形參數組分配存儲空間。
  • 形參數組長度說明無實際作用,甚至可不寫。
  • 風險:被調函數不知實參數組實際長度,易越界。解決:額外傳遞長度參數。

4. 多維數組作為參數

// 第一維可寫長度也可不寫,其他維必須與實參一致
void func(int arr[][3][4]);  // 正確
void func(int arr[2][3][4]); // 正確

5. 數組元素 vs 整個數組作參數

  • 元素作參數:按值傳遞,與普通變量無異。
  • 整個數組作參數:實際傳首地址,形參雖定義為數組形式,但內存地址相同,本質上是同一對象。

二、字符串處理全攻略

1. C 風格字符串(字符數組)

  • 定義:以 '\0' (ASCII 0) 結束的字符數組。
  • 判斷結束:遇到空字符即結束。
  • 字符串常量:雙引號括起的字符序列,編譯器自動在末尾添加 \0。

2. 輸入輸出方式

  • 流操作:cin >> str; cout << str; 一次輸入/輸出整個字符串(遇空白停止)。
  • C 庫函數:gets/puts(不安全)、fgets/fputs、scanf/printf 格式化。

3. C 庫字符串處理函數 (<string.h>)

  • strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmp、strchr、strstr 等。
  • 注意緩衝區溢出風險,優先使用 n 版本限制長度。

4. C++ std::string 對象

優勢:自動管理內存、無需手動處理 \0、支持運算符重載(賦值、連接、比較)、提供豐富成員函數。

定義與初始化

string s1;           // 空串
string s2("hello");  // 從 C 串
string s3 = "world"; // 拷貝初始化
string s4(10, 'a');  // 10 個 'a'

與 C 風格字符串轉換

string s = "hello";
const char* cstr = s.c_str();   // 轉 C 串(只讀)
char buf[20];
strcpy(buf, s.c_str());         // 複製到字符數組

常用操作

操作C 風格string 對象
賦值strcpys1 = s2;
連接strcats1 += s2; 或 s1.append(s2)
比較strcmps1 == s2, s1 < s2 等運算符
長度strlens.size() / s.length()
訪問字符s[i]s[i] 或 s.at(i) (帶越界檢查)
查找strchr/strstrs.find(), s.rfind()
子串手動實現s.substr(pos, len)
插入/刪除手動實現s.insert(), s.erase()

字符串對象數組

string names[3] = {"Alice", "Bob", "Charlie"};
vector vec = {"one", "two"}; // 更推薦用 vector

三、常見坑點總結

  1. 數組名不是指針:雖可隱式轉換為首元素指針,但 sizeof(arr) 返回整個數組大小,而非指針大小。
  2. 形參退化:函數參數中的 int arr[] 實為 int* arr,sizeof(arr) 返回指針大小。
  3. 字符串結束符:C 串操作依賴 \0,strlen 不計入,sizeof 計入;string 內部不依賴 \0 但 c_str() 返回的 C 串以 \0 結尾。
  4. 緩衝區溢出:使用 strcpy/strcat 時務必確保目標空間足夠,或改用 strncpy/strncat / string。
  5. 多維數組參數:除第一維外,所有維度大小必須在聲明時給定,否則編譯器無法計算元素偏移。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved