C 學習筆記 資料型別

2021-08-22 14:13:00 字數 3888 閱讀 6166

每天花點時間,重新拾起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 ...