天天看点

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回忆录