每天花點時間,重新拾起c++,記錄一些學習筆記,內容根據自己理解逐步更新。
1.指標
我們最熟悉的,乙個位元組由8位構成,乙個字由32位構成,這是針對32位作業系統,其實字的大小是依賴於機器的,c++基本資料型別,int/short/long/float/double/long double長度都是以字為單位,如short為半個字,int為乙個字,double是兩個字,具體它們能代表多少位資料,能儲存多大範圍的值就需要根據作業系統環境而定。
文字常量是不可定址的,變數可以。根據乙個例子學習指標和位址的儲存空間變化。
#include "iostream"
using namespace std;
int _tmain(int argc, _tchar* argv)
2.字串
c風格的字串和標準c++ string型別,前者是作為標準c++乙個部分的標準c庫,後者是標準c++提供的string類,主要描述c風格的字串。
字串為空的定義:
char *pc1 = 0;
char *pc2 = "";
c風格字串的字元指標總是指向乙個相關聯的字元陣列,通過自增可以前進到終止空字元之後,這個地方容易出錯。
#include "iostream"
using namespace std;
const char *st = "the expense of spirit\n";
int _tmain(int argc, _tchar* argv)
可以單獨增加乙個指標計算st長度
const char *p = st;
由於字元指標的底層特性,使得用它表示字串容易出錯,因此c++標準庫提供了字串類抽象的乙個公共實現,要使用string型別,必須包含標頭檔案
#include "string"
3.const關鍵字
「試圖將乙個非const物件的指標指向乙個常量物件」的動作都將引起編譯錯誤,const物件的位址只能賦值給指向const物件的指標,但是指向const物件的指標可以被賦以乙個非const物件的位址。
注意這三者區別:
/* 指向double型別的,定義成const物件的指標 */
const double *pc = 0;
const double minwage = 9.60;
pc = &minwage;
/* 指向int型別的const指標 */
int errnumb = 0;
int *const curerr = &errnumb;
/* 指向double型別的,定義成const物件的const指標 */
const double pi = 3.14159;
const double *const pi_ptr = π
這段**:
using namespace std;
const int ival = 1024;
const int *const &pi_ref = &ival;
int _tmain(int argc, _tchar* argv)
如果這樣定義就會出錯:
const int *&pi_ref = &ival;
定義int*為t,上面的**等價於:
const t &pi_ref = &ival;
編譯器會這樣來處理這段賦值計算:
t temp;
temp = &ival;
const t &pi_ref = temp;
這裡temp是"int *"型別,編譯器不能強制把"const int *"轉變為"int *"型別,原程式沒有問題,是因為編譯器這樣處理了,定義"const int *"為t:
t temp;
temp = &ival;
t const &pi_ref = temp;
這樣就解決了之前型別不匹配的賦值問題。
4.陣列
非const的變數不能被用來指定陣列的維數,這是初學c語言時會犯的錯誤之一。c++不能在編譯時刻或執行時刻對陣列下標進行範圍檢查,因此即使程式能夠通過編譯並執行,但仍可能存在錯誤。
ia[ 1, 2 ]在c++中是合法的,但"1,2"是乙個逗號表示式,因此它等價於ia[2]。
定義陣列
int ia[9] = ;
ia、&ia[0]是等價的,ia+1、&ia[1]是等價的,可以通過指標實現陣列的遍歷:
#include "iostream"
using namespace std;
int _tmain(int argc, _tchar* argv)
;int *pbegin = ia;
int *pend = ia + 9;
while ( pbegin != pend )
return 0;
}
5.vector容器
使用vector需要新增標頭檔案vector,vector有兩種不同形式:陣列習慣和stl習慣。
陣列習慣
vectorivec(10);//與int a[10]類似
stl習慣
vectortext;
6.typedef
為內建的或使用者定義的資料型別引入助記符號,例如:
typedef vectorvec_int;
vec_int vec1(10);//與vectorvec1(10);一樣
typedef可以用來增強「複雜模板宣告的定義」的可讀性,增強「指向函式的指標」以及「指向類的成員函式的指標」的可讀性。
/* cstr型別非"const char *" */
/* const修飾cstr型別,cstr是乙個指標 */
/* cstr是乙個指向字元的const指標 */
typedef char *cstring;
extern const cstring cstr;
用typedef可以方便地定義大量pair型別的物件:
typedef pairauthors;
authors joyce("james", "joyce");
authors musil("robert", "musil");
if (joyce.first == "james" && joyce.second == "joyce")
/* 滿足if條件,處理相關任務 */
7.volatile
volatile修飾符的用法和const類似,主要目的是提示編譯器,該物件的值可能在編譯器未檢測到的情況下被改變,因此編譯器不能武斷的對引用這些物件的**作優化處理。
C 學習筆記 資料型別
c 有六種資料型別 bool char wchar t int float和double型。1.bool 布林型 bool型表示兩個邏輯值1或0,如 bool a a true true表示1,false表示0.2.char 字元型 char型變數佔乙個位元組 8位 所以乙個字元型變數可表示0 25...
C學習筆記 資料型別
在程式中不可變化的量,也就不可賦值 常用兩種定義方式,define和const 另外還有乙個字串常量 define define max 100 define在預編譯的時候,其實也是做的簡單文字替換 可以通過gcc e test test.c進行驗證 注 使用define定義時候叫做巨集定義,其原理...
C 學習筆記 資料型別
1 資料型別存在的意義 給變數分配合適的空間。2 整形變數 短整型short 2位元組 整型int 4 長整型long 4 長長整型long long 8 3 sizeof 統計資料型別所佔記憶體的大小。sizeof 資料型別 變數 例如 sizeof short 2。3 浮點型 單精度float ...