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
{
}