天天看點

C++ 回憶錄3

1.數組

一般最好是使用vector ,除非對性能要求很高才使用array. array 很容易出錯.

定義數組

int a [5];//

int a[]={1,2,3,4};

int  a[5]={1,2,3,4};

int k=5;

const int k=10;

int [k]; //這樣可以.

const int k=getCont();

int p[k]; //要在runtime 才能計算getCount(();//是以不可以.

int a[k];// 這中情況下,沒到runtime 都不知道a 有多大,在C++中是不可以的.

可以使用動态數組

int * p;

p=new int[5]; //這樣是可以的.

使用指針通路數組

由于數組名稱本身就是個指針

int a[5]={12,23,4,5};

int * p=a;

for (;p!=a+5;p++) //a+5 ,其實是one pass to the last element/指針過一個元素的位置是可以比較的.

{

   cout<<*p<<endl;

}

//注意字元數組

char a[]={'a','b','c'}; /3 個元素,沒有\0;

char a[]={'a','b','\0'}; //3 個元素,明确訓示\0

char a []="abc"; //3個元素,加上\0 占空間是4 個byte.

2.指針

int * p=5;//不行.

int a =5;

int * p=&a;//ok

int * p2=p; //ok

int * p3;

p3=&a;//ok

p3=p2;//ok

int * p4=0;//可以的.指針可以跟0比較,  其實在cstddef.h  中定義了#define NULL 0 ;//把NULL 定義成0

以表示這個指針沒有指向任何變量.

if(p4)  //非0都是真.  由于0的可比性...是以指針這樣做判斷也是可以的.

{

}

*p3=10;//其實就是 p3 所指向的a 重新指派10;/

指針的運算比如++,--,+,- 都是位址的運算.

比如

int a[]={1,2,3,4,4,5,6};

int *p=a;

p+3;// 其實就是a[3] 這個元素的位置.

*p+3//則是 a[0]+3;// 解引用後就不一樣了.

指針可以指向常量,也可以自身是常量也就是指向的位址不能變一旦初始化後

int a=5;

const int pi=3;

const int * pi; //這是一個指向常量的指針的定義,但沒初始化.

pi=&pi;// ok

pi=&a;//不可以.

int * const p2;// 不行,這個是指針自己是個常量,是以他一定義就必須初始化.

int * const p3=&a; //可以的.

*p3=10;//可以的, 位址是常量,但還是可以改變他所隻指向的變量的.

const int * const p4=&pi;//ok

*p4=100;//這個就不可以了.

如果加上typedef 則有些不一樣.

typedef string *  str_ptr;

const str_ptr  pA;//這種情況下不能等價于const string * pA;// 不能做這種簡單的替換.

其實const 修飾的是一總類型.而str_ptr 已經看成是一中類型.是以是等價月

string a="asdfasfasdf";

string * const PA=&a;

const str_ptr pA=&a;

//void * 這個指針可以指向任意類型,可以作為函數的傳回值,,,但卻不能用于對所在的對象進行運算.

ptrdiff_t  pDiff=p1-p2;//ptrdiff_t is a type specifier when substractr 2 different

just like size_t is use to specify the dimesion of th array

int b[5]={1,2,3,4,,5};

for(size_t i=0;i<5;++i) //标準的寫法應該是用size_t

{

}

上一篇: C++ 回憶錄2
下一篇: OI回憶錄