C++ Primer筆記 第三篇:C++基礎(chǔ)——數(shù)組和字符串

一、數(shù)組

數(shù)組存放的對象都是同一類型;數(shù)組一旦定義,大小就固定不變了。

1、定義、初始化數(shù)組

  • 定義: 基本數(shù)據(jù)類型 聲明符[size];
    定義數(shù)組時,必須指定數(shù)組的類型,不允許使用auto關(guān)鍵字來進行類型推斷。數(shù)組的元素必須是對象,不能是引用

  • 復雜的數(shù)組聲明: 數(shù)組可以存放對象,當然可以存放指針,也就是可以定義 指針數(shù)組 ;又因為數(shù)組本身也是對象,因此可以定義 數(shù)組的指針 以及 數(shù)組的引用 。

    int arr[10];
    int *ptrs[10];  //ptrs是含有10個整型指針的數(shù)組
    int &refs[10] = /* ? */;  //錯誤:不存在引用的數(shù)組,數(shù)組元素不能是引用
    int (*parray)[10] = &arr;  //parray是一個指針,指向一個含有10個整數(shù)的數(shù)組
    int (&rarray)[10] = arr;   //rarray是一個引用,綁定在一個含有10個整數(shù)的數(shù)組上
    int *(&array)[10] = ptrs;  //array是一個引用,綁定在一個含有10個整型指針的數(shù)組上
    
  • 初始化:

    const unsigned sz = 3;
    int a1[sz] = {0,1,2};  //含有3個元素的數(shù)組
    int a2[] = {0, 1, 2};  //維度是3的數(shù)組
    int a3[5] = {0,1,2};  //維度是5的數(shù)組,等價于a3[] = {0,1,2,0,0};
    int a4[2] = {0,1,2};  //錯誤:維度小于初始值個數(shù)
    
    // **數(shù)組不允許拷貝和賦值** 
    int a5[] = a1;  //錯誤:不允許使用一個數(shù)組初始化另一個數(shù)組
    a2 = a1;   //錯誤:不能把一個數(shù)組直接賦值給另一個數(shù)組
    

2、訪問數(shù)組元素

數(shù)組的索引從0開始。使用數(shù)組下標時,通常將其定義為size_t類型。

size_t類型是一種 機器相關(guān)的無符號類型 。它被設(shè)計的足夠大以便能表示內(nèi)存中任意對象的大小。C++在 cstddef 頭文件中定義了size_t類型,這個頭文件對應的C語言版本是C標準庫 stddef.h 頭文件。

3、指針和數(shù)組

C/C++中,編譯器會把數(shù)組轉(zhuǎn)換成指針。在用到數(shù)組名字的地方,編譯器會自動 將數(shù)組名替換為一個指向數(shù)組首元素的指針。對數(shù)組使用下標運算符時,編譯器會自動轉(zhuǎn)換為對指向數(shù)組元素的指針進行下標運算:

int nums[] = {1,2,3};
int *p = nums;       //等價于 int *p = &nums[0];
int i = nums[2];
i = *(p + 2);       // 等價于 i = nums[2];
p = &nums[1];   //p指向nums第二個元素
int j = p[1];      //等價于 *(p+1),即nums 第三個元素
int k = p[-1];    //等價于 *(p-1), 即nums 第一個元素

二、字符串

1、C風格字符串

C風格字符串不是一種類型,而是C中為了表達和使用字符串而形成的一種約定俗成的寫法 —— 字符串存放在字符數(shù)組中并以空字符'\0'結(jié)束 。一般利用指針來操作這些字符串。

C++提供了 cstring 頭文件,對應C語言頭文件 string.h 。其中定義了一組操作C風格字符串的函數(shù),如返回字符串長度、比較字符串、連接字符串等。注意: 這些函數(shù)接收的參數(shù)都是 指針 (指向存放C風格字符串的字符數(shù)組)。

2、標準庫類型string

標準庫類型string表示可變長的字符序列。使用 string 類型必須先包含 string 頭文件,string 定義在命名空間 std 中。

建議: 使用標準庫string類型,而不是C風格字符串。

2.1 初始化 string 對象的方式
string s1;     //默認初始化,s1是一個空字符串
string s2(s1);   //s2是s1的副本(即s1中所有字符都拷貝到s2中)
string s3 = s1;  //等價于 s3(s1)
string s4 = "value";   //s4是字符串字面值"value"的副本,但不包含最后的空字符
string s5("value");   //等價于 s5 = "value";
string s6(n, 'c');   //s6初始化為n個連續(xù)字符'c'組成的字符串
2.2 string::size_type類型

string類型定義了一系列函數(shù)來操作 string 對象。

size() 函數(shù)返回 string 對象的長度。實際上,返回值本身是一個string::size_type類型的值。

大多數(shù)標準庫類型都定義了幾種配套的類型,這些配套類型體現(xiàn)了標準庫類型和機器無關(guān)的特性。類型 size_type 就是在類 string 中定義的:它是一個無符號類型,且足以存放任意 string 對象的大小。所有用于存放 string 類的 size() 函數(shù)返回值的變量,都應該是 string::size_type 類型的。

2.3 string 類型中的下標運算符 [ ]

string 類型重載了下標運算符[ ],接收的輸入?yún)?shù)是 string::size_type 類型的值,返回值是該參數(shù)位置上字符的 引用 。

無論何時用到字符串的下標,都要注意檢查其合法性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容