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=π// ok
pi=&a;//不可以.
int * const p2;// 不行,這個是指針自己是個常量,是以他一定義就必須初始化.
int * const p3=&a; //可以的.
*p3=10;//可以的, 位址是常量,但還是可以改變他所隻指向的變量的.
const int * const p4=π//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
{
}