首先声明:在C++编程时,尽可能减小数组和指针的使用。首先数组和指针容易产生不可预料的错误,相对也复杂和繁琐。在程序中,不少时候数组和指针的写法可使用Vector类型和迭代器来替代。编程
cppint *ip1; int* ip1; //两种方式都可以定义指针,可是在连续声明多个函数时容易出错。 string* ip1, ip2;//ip1为指向string类型对象的指针,ip2为string类型的对象。 string* ip1, *ip2;//ip1和ip2同为指向string类型对象的指针。 string *ip1,*ip2;//对比可见这种方式比较不容易产生歧义。
因为未初始化的指针容易引起错误,在定义指针的时候,先定义指针所要指向的对象,若必须分开定义,给指针赋值为0
。数组
cpp//赋给指针的地址必须是合法得到的地址,该地址所存储的数据类型与指针类型相同 int a = 11; int *ip = &a; int *ip1 = 0;
除了基本数据类型,还有void指针,代表该指针与一地址值相关,可是不知道改地址上对象的数据类型。可是没法对地址上的对象进行操做。函数
cppstring str="abc"; void *ip = &str;
cppint a[] = {2,4,6,8,10}; int *ip = a;//这里的a实际上是数组a的首地址,即为&a[0] //若是想让指针ip指向a[4],能够用如下两种方式 ip = &a[4]; ip = a + 4;
下面根据上面的定义来计算两个式子的值:
1.*(a + 4)
2.*a + 4
指针
第一个式子是a[0]地址向后移四位,获得a[4]的地址,在用*号结引用最后获得的结果是a[4]中的值,即为10
。
第二个式子在a[0]处解引用,获得a[0]中存储的数值2,而后对2进行算术运算,最后的结果是6
。code
能够归结为两种:对象
指针能够改变指向的地址,可是不能改变const对象的值。
定义const int *ip;
const对象只能使用指向const指针指向它,可是指向const指针也能够指向非const对象,被指向const对象的指针所指向的对象的值不能被修改。ip
cppint a = 1; int *const ip = &a;
因为const指针的值不能被修改,因此在定义const指针时必须初始化const指针。
修改const指针所指对象的值是容许的:string
cpp*ip = 0; cout << a << endl;//输出0
最后放一个绕的不行的变量
cpptypedef string *pstring; const pstring cstr; //等价于 string *const cstr;