首先声明:在C++编程时,尽量减少数组和指针的使用。首先数组和指针容易产生不可预料的错误,相对也复杂和繁琐。在程序中,很多时候数组和指针的写法可以使用Vector类型和迭代器来替代。

1.指针变量的定义和初始化

C++指针变量定义有两种方式:

cpp    int *ip1;
    int* ip1;
    //两种方式均可以定义指针,但是在连续声明多个函数时容易出错。
    string* ip1, ip2;//ip1为指向string类型对象的指针,ip2为string类型的对象。
    string* ip1, *ip2;//ip1和ip2同为指向string类型对象的指针。
    string *ip1,*ip2;//对比可见这种方式比较不容易产生歧义。

C++初始化指针

由于未初始化的指针容易引发错误,在定义指针的时候,先定义指针所要指向的对象,若必须分开定义,给指针赋值为0

cpp    //赋给指针的地址必须是合法获得的地址,该地址所存储的数据类型与指针类型相同
    int a = 11;
    int *ip = &a;
    int *ip1 = 0;

void指针

除了基本数据类型,还有void指针,表明该指针与一地址值相关,但是不知道改地址上对象的数据类型。但是无法对地址上的对象进行操作。

cpp    string str="abc";
    void *ip = &str;

2.指针访问数组

指针算术操作

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

指针和const限定符

可以归结为两种:

1.指向const对象的指针

指针可以改变指向的地址,但是不能改变const对象的值。
定义const int *ip;
const对象只能使用指向const指针指向它,但是指向const指针也可以指向非const对象,被指向const对象的指针所指向的对象的值不能被修改。

2.const指针

cppint a = 1;
int *const ip = &a;

由于const指针的值不能被修改,所以在定义const指针时必须初始化const指针。
修改const指针所指对象的值是允许的:

cpp*ip = 0;
cout << a << endl;//输出0

最后放一个绕的不行的

cpptypedef string *pstring;
const pstring cstr;
//等价于
string *const cstr;

载入中...
ViolaMiki ViolaMiki

120 声望

发布于专栏

ViolaMiki

1 人关注

系列文章