C++ 核心基礎:數字、數組、字符串、指針與引用詳解
- 1. C++ 基礎語法
- 1.1 標識符與保留字
- 1.2 數據類型概述
- 1.3 基本輸入輸出
- 2.1 基本整數類型(int、short、long、long long)
- 2.2 無符號整數類型(unsigned int、unsigned short、unsigned long、unsigned long long)
- 2.3 整數類型選擇與應用場景
- 3.1 單精度浮點數(`float`)
- 3.2 雙精度浮點數(`double`)
- 3.3 擴展精度浮點數(`long double`)
- 4.1 一維數組定義與操作
- 4.1.1 定義與初始化
- 4.1.2 訪問與修改元素
- 4.1.3 數組的大小
- 4.1.4 應用場景
- 4.2 多維數組定義與操作
- 4.2.1 二維數組
- 4.2.2 訪問與修改元素
- 4.2.3 數組的大小
- 4.2.4 應用場景
- 4.2.5 高維數組
- 4.3 動態數組與內存管理
- 4.3.1 動態數組的創建
- 4.3.2 動態數組的使用
- 4.3.3 內存管理
- 4.3.4 應用場景
- 4.3.5 注意事項
- 5.1 字符數組與 `std::string`
- 5.2 字符串操作函數與方法
- 5.3 字符串處理技巧
- 6.1 指針基本概念與操作
- 6.1.1 指針的定義
- 6.1.2 獲取變量的地址
- 6.1.3 通過指針訪問變量
- 6.1.4 指針的初始化
- 6.1.5 指針的應用
- 6.2 指針與數組關系
- 6.2.1 數組名作為指針
- 6.2.2 指針與數組的遍歷
- 6.2.3 指針與多維數組
- 6.2.4 指針與函數參數
- 6.2.5 指針與動態數組
- 6.3 指針在函數參數與動態內存中的應用
- 6.3.1 函數參數傳遞
- 6.3.2 動態內存分配
- 6.3.3 注意事項
- 7.1 引用基本概念與操作
- 7.2 引用與指針的區別
- 語法區別
- 語義區別
- 使用場景
- 安全性
- 7.3 引用在函數參數與返回值中的應用
- 函數參數傳遞
- 函數返回值
- 注意事項
1. C++ 基礎語法
1.1 標識符與保留字
在 C++ 中,標識符用于命名變量、函數、類等。一個有效的標識符必須以字母(A-Z 或 a-z)或下劃線 _
開頭,后續可以包含字母、數字(0-9)和下劃線。標識符是區分大小寫的,這意味著 Variable
和 variable
是兩個不同的標識符。例如,int myVariable = 10;
中的 myVariable
是一個合法的標識符。
C++ 中有一些保留字,這些保留字不能用作標識符,因為它們在語言中有特殊的含義。例如,int
、class
、return
等都是保留字。使用保留字作為標識符會導致編譯錯誤。C++ 標準中定義了大約 65 個保留字,這些保留字在不同的上下文中有不同的用途,如控制流程(if
、else
)、數據類型(int
、float
)和函數定義(return
)等。
1.2 數據類型概述
C++ 提供了豐富的數據類型,這些數據類型可以分為基本數據類型和復合數據類型。基本數據類型包括整數類型、浮點類型、字符類型和布爾類型,而復合數據類型包括數組、結構體、類等。
- 整數類型:用于存儲沒有小數部分的數值。C++ 提供了多種整數類型,如
int
、short
、long
和long long
,它們的存儲大小和取值范圍各不相同。例如,int
通常占用 4 個字節,取值范圍為 ([-2^{31}, 2^{31}-1],而long long
占用 8 個字節,取值范圍為 ([-2^{63}, 2^{63}-1]。選擇合適的整數類型可以優化內存使用和程序性能。 - 浮點類型:用于存儲包含小數部分的數值。C++ 提供了
float
、double
和long double
三種浮點類型,它們的精度和存儲大小不同。float
通常占用 4 個字節,有效數字為 7 位;double
占用 8 個字節,有效數字為 15-16 位;long double
的精度更高,占用字節數根據實現而變化。在科學計算和工程應用中,通常使用double
類型以獲得更高的精度。 - 字符類型:用于存儲單個字符,如字母、數字和符號。C++ 中的字符類型是
char
,它占用 1 個字節,可以存儲 ASCII 字符集中的字符。例如,char c = 'A';
定義了一個字符變量c
并賦值為大寫字母 A。 - 布爾類型:用于存儲邏輯值,只有兩個可能的值:
true
和false
。布爾類型在條件判斷和邏輯運算中非常有用。例如,bool isTrue = true;
定義了一個布爾變量isTrue
并賦值為true
。
1.3 基本輸入輸出
C++ 提供了強大的輸入輸出功能,主要通過標準輸入輸出流 cin
和 cout
來實現。這些流對象與 C++ 標準庫中的輸入輸出操作符 <<
和 >>
配合使用,可以方便地進行數據的輸入和輸出。
- 輸出操作:使用
cout
和<<
操作符可以將數據輸出到標準輸出設備(通常是屏幕)。例如,std::cout << "Hello, World!" << std::endl;
會在屏幕上輸出 “Hello, World!”,并換行。std::endl
是一個特殊的操縱符,用于在輸出后添加一個換行符,并刷新輸出緩沖區。 - 輸入操作:使用
cin
和>>
操作符可以從標準輸入設備(通常是鍵盤)讀取數據。例如,int num; std::cin >> num;
會從鍵盤讀取一個整數并存儲到變量num
中。cin
可以讀取多種類型的數據,包括整數、浮點數和字符。 - 格式化輸入輸出:C++ 提供了一些操縱符,如
std::setw
、std::setprecision
等,用于控制輸入輸出的格式。例如,std::cout << std::setw(10) << num << std::endl;
會將變量num
的輸出寬度設置為 10 個字符,不足的部分用空格填充。std::setprecision(2)
可以設置浮點數的輸出精度為小數點后兩位。
C++ 的輸入輸出功能不僅簡單易用,而且具有很強的靈活性和可擴展性。通過標準庫中的輸入輸出流和操縱符,可以方便地實現各種復雜的輸入輸出需求。# 2. 整數類型
2.1 基本整數類型(int、short、long、long long)
C++ 中的基本整數類型包括 int
、short
、long
和 long long
,它們的存儲大小和取值范圍各不相同,適用于不同的應用場景。
int
:這是最常用的整數類型,通常占用 4 個字節(32 位),取值范圍為 ([-2^{31}, 2^{31}-1],即 ([-2147483648, 2147483647])。它適用于大多數需要整數的場景,如計數器、索引等。例如:int age = 25;
short
:短整數類型,通常占用 2 個字節(16 位),取值范圍為 ([-2^{15}, 2^{15}-1],即 ([-32768, 32767])。它適用于需要節省內存的場景,尤其是在處理大量數據時。例如:short count = 100;
long
:長整數類型,通常占用 4 個字節(32 位),在 64 位系統中可能為 8 個字節(64 位),取值范圍為 ([-2^{31}, 2^{31}-1] 或 ([-2^{63}, 2^{63}-1])。它用于存儲比int
更大的整數。例如:long distance = 1000000;
long long
:更長的整數類型,占用 8 個字節(64 位),取值范圍為 ([-2^{63}, 2^{63}-1],即 ([-9223372036854775808, 9223372036854775807])。它適合處理非常大的整數,例如在金融計算或大數運算中。例如:long long bigNumber = 1234567890123456789;
2.2 無符號整數類型(unsigned int、unsigned short、unsigned long、unsigned long long)
無符號整數類型與基本整數類型的主要區別在于它們只能表示非負數,因此其取值范圍是正數和零,且范圍更大。
unsigned int
:無符號整數類型,通常占用 4 個字節(32 位),取值范圍為 ([0, 2^{32}-1],即 ([0, 4294967295])。它適用于需要表示非負數的場景,如數組索引、計數器等。例如:unsigned int index = 1000000000;
unsigned short
:無符號短整數類型,通常占用 2 個字節(16 位),取值范圍為 ([0, 2^{16}-1],即 ([0, 65535])。它適用于需要節省內存且只處理非負數的場景。例如:unsigned short port = 8080;
unsigned long
:無符號長整數類型,通常占用 4 個字節(32 位),在 64 位系統中可能為 8 個字節(64 位),取值范圍為 ([0, 2^{32}-1] 或 ([0, 2^{64}-1])。它用于存儲比unsigned int
更大的非負整數。例如:unsigned long fileSize = 4294967295;
unsigned long long
:無符號超長整數類型,占用 8 個字節(64 位),取值范圍為 ([0, 2^{64}-1],即 ([0, 18446744073709551615])。它適合處理非常大的非負整數,例如在大文件處理或高精度計算中。例如:unsigned long long bigFileSize = 18446744073709551615;
2.3 整數類型選擇與應用場景
選擇合適的整數類型可以優化內存使用和程序性能,同時避免溢出和數據丟失等問題。以下是一些選擇整數類型的建議和常見應用場景:
- 通用場景:對于大多數需要整數的場景,
int
是首選類型。它在大多數平臺上占用 4 個字節,取值范圍足夠大,適用于計數器、索引、循環變量等。 - 節省內存:當需要處理大量數據且數據范圍較小時,
short
或unsigned short
是更好的選擇。例如,在嵌入式系統或內存受限的環境中,short
可以節省內存。 - 大整數處理:當需要處理非常大的整數時,
long long
或unsigned long long
是合適的選擇。例如,在金融計算、大文件處理或高精度數學模型中,long long
可以提供足夠的范圍。 - 非負數場景:當變量的值總是非負數時,使用無符號整數類型可以提供更大的范圍。例如,數組索引、文件大小、端口號等通常使用無符號整數類型。
- 跨平臺兼容性:在跨平臺開發中,應避免使用依賴于平臺的整數類型(如
long
),而是使用固定寬度的整數類型(如int32_t
、int64_t
),這些類型在不同平臺上具有相同的大小和范圍。# 3. 浮點類型
浮點類型用于存儲包含小數部分的數值,C++ 提供了三種主要的浮點類型:float
、double
和long double
。它們在存儲大小、精度和適用場景上各有不同。以下將從不同角度對這三種浮點類型進行詳細分析。
3.1 單精度浮點數(float
)
float
是單精度浮點數類型,通常占用 4 個字節(32 位),其有效數字為 7 位。它適用于對精度要求不高但需要快速計算的場景。
- 存儲格式:
float
類型的存儲格式遵循 IEEE 754 標準,分為符號位、指數位和尾數位。其中,符號位占用 1 位,指數位占用 8 位,尾數位占用 23 位。這種格式使得float
能夠表示非常大或非常小的數值,但精度相對較低。 - 取值范圍:
float
的取值范圍大約為 ([-3.4 \times 10^{38}, 3.4 \times 10^{38}]),但其有效數字僅為 7 位,因此在表示較大或較小的數值時,可能會出現精度損失。 - 應用場景:
float
適用于對精度要求不高但需要快速計算的場景,例如實時圖形渲染、簡單的物理模擬等。在這些場景中,計算速度比精度更為重要,因此float
是一個合適的選擇。
3.2 雙精度浮點數(double
)
double
是雙精度浮點數類型,通常占用 8 個字節(64 位),其有效數字為 15-16 位。它適用于需要更高精度的場景,例如科學計算和工程應用。
- 存儲格式:
double
類型的存儲格式同樣遵循 IEEE 754 標準,分為符號位、指數位和尾數位。其中,符號位占用 1 位,指數位占用 11 位,尾數位占用 52 位。這種格式使得double
能夠表示更大范圍的數值,并且具有更高的精度。 - 取值范圍:
double
的取值范圍大約為 ([-1.7 \times 10^{308}, 1.7 \times 10^{308}]),其有效數字為 15-16 位,因此在表示較大或較小的數值時,能夠保持較高的精度。 - 應用場景:
double
適用于需要更高精度的場景,例如科學計算、工程應用、金融計算等。在這些場景中,計算結果的精度至關重要,因此double
是一個更可靠的選擇。例如,在計算復雜的數學模型、進行高精度的數值分析時,double
能夠提供更準確的結果。
3.3 擴展精度浮點數(long double
)
long double
是擴展精度浮點數類型,其占用的字節數根據實現而變化,通常為 12 或 16 個字節,精度更高。它用于需要極高精度的計算,例如高精度的數學模型。
- 存儲格式:
long double
的存儲格式在不同的實現中可能有所不同,但通常遵循 IEEE 754 標準的擴展精度格式。它包含更多的尾數位和指數位,因此能夠表示更大范圍的數值,并且具有更高的精度。 - 取值范圍:
long double
的取值范圍和精度取決于具體的實現,但通常比double
更高。例如,在某些實現中,long double
的取值范圍可以達到 ([-1.7 \times 10^{4932}, 1.7 \times 10^{4932}]),有效數字可以達到 18-19 位。 - 應用場景:
long double
適用于需要極高精度的計算場景,例如高精度的數學模型、復雜的物理模擬等。在這些場景中,計算結果的精度要求極高,因此long double
是一個必要的選擇。然而,由于long double
的計算速度相對較慢,并且占用更多的內存,因此在實際應用中需要權衡精度和性能之間的關系。
在選擇浮點類型時,需要根據具體的應用場景和精度要求進行權衡。如果對精度要求不高但需要快速計算,可以選擇 float
;如果需要更高的精度,可以選擇 double
;如果需要極高精度的計算,可以選擇 long double
。# 4. 數組
數組是一種基本的數據結構,用于存儲相同類型的多個元素。在 C++ 中,數組的大小在定義時必須確定,且數組的大小在運行時不可變。數組的元素在內存中是連續存儲的,這使得數組在訪問元素時非常高效。
4.1 一維數組定義與操作
一維數組是最簡單的數組形式,它存儲的是一系列相同類型的元素。
4.1.1 定義與初始化
一維數組可以通過指定數組的類型、名稱和大小來定義。例如:
int arr[5]; // 定義一個包含 5 個整數的數組
數組也可以在定義時直接初始化:
int arr[5] = {1, 2, 3, 4, 5}; // 定義并初始化一個包含 5 個整數的數組
如果初始化的元素個數少于數組的大小,剩余的元素將被自動初始化為 0:
int arr[5] = {1, 2}; // 剩余的元素將被初始化為 0
4.1.2 訪問與修改元素
數組的元素可以通過索引訪問和修改。索引從 0 開始,因此第一個元素的索引為 0,最后一個元素的索引為數組大小減 1。例如:
int value = arr[2]; // 獲取數組的第三個元素
arr[2] = 10; // 修改數組的第三個元素
4.1.3 數組的大小
可以使用 sizeof
運算符來獲取數組的大小(以字節為單位),并結合數組元素的大小來計算數組的長度:
int size = sizeof(arr) / sizeof(arr[0]); // 計算數組的長度
4.1.4 應用場景
一維數組常用于存儲和處理一系列數據,例如學生成績、溫度記錄等。它也常用于算法實現中,如排序和搜索算法。
4.2 多維數組定義與操作
多維數組是數組的擴展,它允許在多個維度上存儲數據。最常見的多維數組是二維數組,但也可以定義三維甚至更高維度的數組。
4.2.1 二維數組
二維數組可以看作是一個表格,它有行和列。定義二維數組時需要指定行數和列數。例如:
int matrix[3][4]; // 定義一個 3 行 4 列的二維數組
二維數組也可以在定義時初始化:
int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7