C 基礎總結(C Primer 回顧)

2021-06-25 20:50:03 字數 4569 閱讀 9988

int乙個機器字長

short

半個機器字長

long

乙個(32位)或兩個機器字長

注:int、short、long預設是帶符號的,通過unsigned指定型別為無符號的

char

單個機器位元組

wchar_t

用於擴充套件字符集

注:有無符號型(unsigned,0-255)和有符號型(signed,-128 - 127)兩種

bool

真值true和false

浮點型

float

乙個機器字長

double

兩個機器字長

long double

三個或四個機器字長

tips:

1.  整型運算時很少使用short。而大多數機器上,int進行整型運算不會出錯。選擇long比int型別能表示的精度高(32位機器上int與long都是32位),但是執行代價大。具體應用時應視情況而定;

2.  浮點型運算時使用double型別基本不會有錯,而且其執行代價也與float相當,有些機器上double型別反而快一些;

3.  無符號整型的物件永遠不可能儲存負數,但是把負數複製給unsigned物件在c++中完全合法,其結果是負數對該型別的取值個數求模後的值。超出unsigned物件取值範圍的賦值,編譯器都會自動將該值對(unsigned物件的取值個數)取模。如:336 儲存到8位的unsigned char 中,實際賦值為80;-1儲存的實際賦值為255

字面值常量:20

十進位制整型常量(預設為int或long型別

024八進位制(0開頭)

0x24

十六進製制(0x開頭)

3.14159

double型別(預設為double型別

true、false

bool型字面值

『a』字元字面值

l'a'

寬字元字面值

\n 或 \12

換行符\r

回車符\40

空格符\0

空字元"a"

字串字面值(會在末尾自動新增乙個空字元\0)

\多行字面值(用於斷開過長的行,在下一行繼續處理,不允許其後有注釋或者空格)

命名習慣:一般用小寫,包含多個單詞時之間新增下劃線

變數的宣告、定義、初始化:

定義:有且僅有乙個定義,為變數分配儲存空間,可以在定義時為變數賦值,建議在變數使用出定義變數

宣告:向程式表明變數的型別和名字,可以通過(extern 型別 變數名)宣告乙個變數而不去定義

初始化:內建型別變數,在函式體外定義時自動初始化為0,函式體內定義不進行自動初始化。建議:內建型別的物件定義時都要初始化

const限定符:

定義乙個變數,加上const限定符,表示把乙個物件轉化成乙個常量(不可修改),即定義乙個不可修改的常變數

const常變數定義以後就不能修改,所以定義時必須初始化

全域性變數中的非const變數預設為intern,可以在其他檔案中宣告並使用;而const變數預設為非extern,只能在定義該變數的檔案中全域性使用,必須顯示地宣告為extern const 型別 變數名 才能在其他檔案中使用

引用:其繫結的物件的別名,在定義引用時必須用與其同型別的物件初始化。此時對引用的操作即對原物件的操作;

初始化時引用的物件一旦繫結就不能再更改;

不能定義引用的引用

const引用是指指向const物件的引用。非const引用不能繫結到const物件

非const引用只能繫結到同型別的物件,而const引用可以繫結到不同型別的物件或者右值(常量)

typedef:

定義型別的別名(隱藏物件的型別,便於理解,增強**的可讀性)

類型別:

class與struct定義:

都可以用來定義類型別,唯一的區別是預設訪問級別:預設情況下,struct的成員為public,class的成員為private

標頭檔案定義及宣告:

一般包含類的 定義、extern變數的宣告和函式的宣告。只用於宣告不用於定義

標頭檔案可以定義類、const物件、inline函式。const變數放在標頭檔案中後,每個包含標頭檔案的原始檔都有了自己的const變數,且其值和名稱都一樣。

標頭檔案中的const變數必須是用常量表示式初始化,否則不應該在標頭檔案中定義

避免多重包含:如乙個標頭檔案中#include了string庫,原始檔中也#include了string庫,在原始檔包含標頭檔案時將兩次包含string庫,此時可以使用標頭檔案保護符來避免在已經見到該標頭檔案的情況下重新處理該標頭檔案:

#ifndef headerfile_h

#define headerfile_h

// define class,declare var,inline function

#endif

標頭檔案中不要放置using 命名空間宣告,否則所有包含該標頭檔案的原始檔都必須含有相同的命名空間宣告,不推薦

現代c++程式推薦使用stl中的vector、迭代器代替陣列與指標操作,只有在強調速度時,才在類實現的內部使用陣列和指標。

陣列:定義:型別 陣列名 維數

陣列維數:必須用值大於等於1的常量表示式初始化(整型字面值常量、列舉常量、用常量表示式初始化的const整型物件)

顯示初始化陣列:int ia[array_size]=

特殊的字元陣列:char ca = "c++"

不允許陣列的直接複製和賦值

訪問陣列元素:下標操作

for (size_t ix = 0; ix != array_size; ++ix)

ia[ix] = ix

指標:指標指向物件,儲存乙個物件的位址

string s("c++");

string *sp = &s; // *操作符表示sp是乙個指標變數,&是取位址操作符

指標的定義和初始化:string *sp1, *sp2

指標的可能取值:一定要避免使用未初始化的指標

0值常量表示式(表明不指向任何物件)或null

型別匹配的物件位址

同一型別的另乙個有效指標

void* 指標:可以儲存任何型別的物件的位址。其操作僅限於:向函式傳遞void* 指標、從函式返回void*指標、給另乙個void*指標賦值。不允許void*指標操作其所指向的物件

指標操作:

count << *sp; //返回其所指物件的值

*sp = "goodbye" // 修改物件的值

sp = &s2; //指向另外乙個新物件

指向指標的指標:int **ppi = &pi

使用指標訪問陣列元素:

int ia = ;

int *ip = ia; //此時ip指向陣列的首位址,即陣列第乙個元素的位址ia[0]

ip = &ia[4]  或 ip = ip + 4  //ip指向陣列的ia[4]

p[1] 等價於 *(p+1)

指標和const限定符:

指向const物件的指標:本身不是const指標,而是標誌著指向const物件。這樣的指標也可以指向非const物件。但是均不能通過指標修改物件的值。可以給該指標重新賦值,指向新的物件:

const int ui = 42

const int *ptr = &ui

*ptr = 52(error)

(實際程式中常用於函式形參,以此來確保傳遞給函式的實際物件在函式中不因為形參而修改

const指標:本身的值一旦初始化就不能再去修改。但是可以通過該指標修改其所指物件的值

int i = 3

int *const pi = &i

*pi = 4 (right)

pi = &j (error)

動態陣列:

使用new在自由儲存區中分配儲存空間,建立動態陣列。動態陣列與陣列變數不同的是不會自動釋放,動態分配的陣列將一直存在,直到程式顯示地釋放delete

動態陣列的定義:new表示式指定陣列的型別、維數來建立,返回指向新分配陣列的第乙個元素的指標

int *pia = new int[10]

初始化動態分配的陣列:類型別呼叫預設構造方法,內建型別後面加上()可以初始化

const物件的動態陣列: const pi = new const int[10]()  //必須初始化

釋放動態空間:

delete pia //釋放了pia所指向的陣列

delete pia [1] //表示釋放當前元素的空間

c基礎回顧

發現乙個很好的c學習 做了一些練習 include include define arrlen arr sizeof arr sizeof arr 0 f int a ff int a fff char ch char ffff char ch fffff int intarr intarr 2 a...

C 基礎回顧

很簡單 寫個複數的class咯,注意些基本細節 ifndef inc 2 9 complex h define inc 2 9 complex h class complex complex operator const complex double real const double imag c...

C 基礎知識回顧總結

為何需要在c 檔案中寫這段 下面我們將講一下緣由 首先說一下命名空間的意義 命名空間是用來組織和重用 的編譯單元。namespace 名字空間 是為了解決命名衝突的問題而引入的概念。通過使用 namespace 就是 使用的範圍 你所使用的庫函式或變數就是在該名字空間中定義的,這樣一來就不會引起不必...