c++primer筆記
加入光榮的進化吧
數組!
標籤: 數組
- 與vector不同的是,數組的大小確定。所以對於某些特殊的應用來講,程序運行時性能較好。
在不清楚元素的個數時,使用vector!
這裏說的“數組” 不僅是
int a[10]
,也包括了string a[10]
;- int/string [數組名字][維度] ; 維度只能用常量const表示
類似於內置類型的變量,當定義了內置類型的數組時,默認初始化會令數組含有未定義的值。
><這是什麼鬼東西- string不是內置數據類型, int是內置數據類型!
- 用int定義的數組若爲全局的,則被默認初始化爲0,若爲局部的,則爲隨機值。
- 而string定義的字符數組,不論定義在哪,都不初始化,或者理解成初始爲空。
字符數組! string a[6]=”hallo”; 字符串字面值是五個字符,但末尾還有一個‘/0‘ 所以應該定義維度爲6
- 不能將數組內容拷貝給其他數組,也不能用數組爲其他數組賦值
int *a[10]; //a數組含有10個指針整形
int &a[10]; //錯誤,不存在引用的數組
int (*a)[10]; //a是一個指針,指向一個含有10個整數的數組
int (&a)[10]; //a是一個引用,引用一個含有10個整數的數組
int *(&a)[10]; // a是數組的引用,數組含有十個指針
↑ 理解方法:從數組的名字開始,由內向外的順序讀取,先左後右,左邊爲類型。
數組的下標的數據類型: size_t
size_t 是一種機器相關的無符號類型,它被設計的足夠大以便能表示閃存中任意對象的大小。 在cstddef頭文件中定義了size_t類型。 這個頭文件是c標準庫stddef.h的c++版本。
範圍for語句:
標籤: 範圍for
cpp
for(auto i :scores)
cout<<i<<" ";
cout<<endll
for ( for-range-declaration : expression ) statement
使用基於範圍的 for 語句構造一個必須執行的循環範圍,可以定義爲任意一個循環訪問,例如 std::vector,或者其他任意用 begin() 和 end()定義的範圍。 命名在 for-range-declaration 語句是屬於 for 的,不能在 expression 或 statement中再次聲明。 請注意 自動 關鍵字是在 for-range-declaration 中部分語句的首選。
c++中的const和constexpr
標籤: const和constexpr
constexpr是C++11中新增的關鍵字,其語義是“常量表達式”,也就是在編譯期可求值的表達式。最基礎的常量表達式就是字面值或全局變量/函數的地址或sizeof等關鍵字返回的結果,而其它常量表達式都是由基礎表達式通過各種確定的運算得到的。constexpr值可用於enum、switch、數組長度等場合。
C++中的const的目的是通過編譯器來保證對象的常量性,強制編譯器將所有可能違背const對象的常量性的操作都視爲error。
const並未區分出編譯期常量和運行期常量
constexpr限定在了編譯期常量constexpr修飾的函數,簡單的來說,如果其傳入的參數可以在編譯時期計算出來,那麼這個函數就會產生編譯時期的值。但是,傳入的參數如果不能在編譯時期計算出來,那麼constexpr修飾的函數就和普通函數一樣了。不過,我們不必因此而寫兩個版本,所以如果函數體適用於constexpr函數的條件,可以儘量加上constexpr。
作者:藍色
鏈接:https://www.zhihu.com/question/35614219/answer/63798713
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
指針和數組
指針的數組有非常緊密的聯繫。使用數組的時候,編譯器一般會把它轉換成指針。
- 在大多數表達式中,使用數組類型的對象,其實是使用一個指向該數組首元素的指針。
cpp
string nums[]={”ont“,"two"};
string *p=&nums[0];
string *p2=nums; //等價於 p2=&nums[0]
- 指針也是迭代器!
cpp
int arr[]={0,1,2,3,4,5,6,7};
int *p=arr; ///p指向arr[0]
++p; ///p指向arr[1] (p在地址空間移動sizeof(int)個單位)
- 迭代器的end:
- arr中有8個元素 使用 int *e= &arr[9];
- 指針e指向了最後一個元素後面的元素的地址。
- 這時就可以用for循環 for(int *b=arr; b!=e; ++b); 遍歷數組
- C++11的end求法:
- last指向的是arr尾元素的下一位置
- 尾後指針不能執行解引用和遞增操作
cpp
int ia[]={1,2,3,4,5,6,7,8,9};
int *beg = begin(ia);
int *last = end(ia);
- 迭代器的end:
指針運算
- 給一個指針加上或減去一個整數值,結果仍是指針。新指針所指元素爲原來指針所指元素前移或者後移N位。
- 兩個指針相減 ,得到的是他們之間的距離。參與運算的兩個指針必須指向同一個數組當中的元素。
- 數據類型爲 ptrdiff_t, it is same as “size_t”, 差值可能爲負,所以該數據類型爲帶符號類型。
C風格字符串
- 這個。。 恩。。。 很不方便 所以 一般不用。。
- 頭文件 #include
- strlen(p) 返回p的長度,空字符不計算在內
- strcmp(p1,p2) ,比較p1和p2. 若相等 返回0,若p1>p2 返回正值, 小於則返回負值。
- strcat(p1,p2) 將P2附加在P1之後,返回p1
- strcpy(p1,p2) 將p2拷貝給p1 ,返回p1
c++ string和 c的char[] 的接口:
- 混用string和c風格字符串
- const char *str=s.c_str();
- ==s.c_str()== 返回值就是首字符的指針!
- 使用const char *str 確保不會改變字符數組的內容。
- 頂層const : 不能改變所定義的對象的值
- 底層const : 可以改變所定義的對象的值,但不能改變指針所指的對象。 如 const int *p2 = &ci ;
- const int *const p3 = p3; 右邊是頂層const 左邊是底層const;
現代的C++程序應儘量使用vector和迭代器, 避免使用內置數組和指針;應該儘量使用string,避免使用c風格的基於數組的字符串。
- 多維數組
- C++中並沒有多維數組,通常說的多維數組其實是數組的數組。
- 當一個數組的元素仍是數組時,就使用兩個維度來定義它。
- int ia[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 自動區分行、列
- int ia[3][4]={{0,2,3,4},{1},{2}}; 也可以每行每列都定義。未列出的元素執行默認值初始化。
C++11 可以用範圍for來處理多維數組。
- ==太長了懶得看。。==
指針和多維數組
- 多維數組是數組的數組。所以也是指針的數組
- int ia[3][4];
- int (*p)[4] = ia;
- 上述聲明中,圓括號必不可少
- int *ip[4]; ///整形指針的數組
- int (*ip)[4]; ///指針指向含有四個整數的數組
int *p[10]; //首先是一個數組,含有10個指針元 int (*p)[10]; // 一個指向含有10個元素的數組指針