您的位置:首页 > 编程语言 > C语言/C++

C++指针问题与学习

2017-02-22 07:04 232 查看
1.指针进行初始化和赋值操作的约束

<wbr> 1.0值常量表达式 如编译时可获得0值的整型const对象或字面值常量0</wbr>

<wbr> 2.类型匹配的对象的地址</wbr>

<wbr><wbr>3.另一对象之后的下一地址</wbr></wbr>

<wbr> 4.同类型的另一有效指针</wbr>

<wbr> int val;</wbr>

<wbr> int zero = 0;</wbr>

<wbr> const int c_val = 0;</wbr>

<wbr> int *p1 = val;<wbr> //error int *p1 = &val</wbr></wbr>

<wbr> p1 = zero; //error</wbr>

<wbr> p1 = c_val; //ok</wbr>

<wbr> p1 = 0; //ok</wbr>

<wbr> int *p2 = NULL; //ok</wbr>

<wbr><wbr>double *p3 = &val; //error:类型不匹配</wbr></wbr>

2.void*指针

<wbr> 可以指向任何类型对象的地址</wbr>

<wbr> 但:void*指针只有几种操作:</wbr>

<wbr> 1.与定义指针进行比较</wbr>

<wbr> 2.向函数传递void*指针或从函数返回void*指针</wbr>

<wbr> 3.给另一void*指针赋值</wbr>

<wbr> 不允许使用void*指针操纵它所指向的对象<wbr></wbr></wbr>

3.指针与引用的差别

<wbr><wbr>1.引用总是指向某个对象,定义引用时没有初始化是错误的。</wbr></wbr>

<wbr> 2.给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。</wbr>

<wbr> 3.引用一经初始化就始终指向同一个特定对象。</wbr>

4.下标与指针

<wbr> int a[10] = {0};</wbr>

<wbr> int *p1 = &a[10];</wbr>

<wbr> int j = p1[-2]; //j=a[2]</wbr>

<wbr> int k = p1[2]; //k=a[6]</wbr>

<wbr> a++; //error</wbr>

5.指针与const

<wbr> 1.指向const对象的指针</wbr>

<wbr><wbr><wbr> const double *cptr; //指针cptr本身不是const的,而是它所指向的对象是const的</wbr></wbr></wbr>

<wbr><wbr><wbr> //在定义时可以对cptr不初始化,如果需要,就对其重新赋值,使其指向一个const对象,一旦赋值后就不能通过cptr指针修改其指向的对象的值,但是此指针可以指向别的对象</wbr></wbr></wbr>

<wbr><wbr><wbr> 如</wbr></wbr></wbr>

<wbr><wbr><wbr> const int val = 56;</wbr></wbr></wbr>

<wbr><wbr><wbr> const int *cptr = &val;</wbr></wbr></wbr>

<wbr><wbr><wbr> *cptr = 10; //error</wbr></wbr></wbr>

<wbr><wbr><wbr> const对象的地址不能赋给非const对象的指针</wbr></wbr></wbr>

<wbr><wbr><wbr> 如:</wbr></wbr></wbr>

<wbr><wbr><wbr><wbr>const double *pi = 3.14;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> double *ptr = &pi;//error</wbr></wbr></wbr>

<wbr><wbr><wbr> const *cptr = &pi;//ok</wbr></wbr></wbr>

<wbr><wbr><wbr> 不能使用void*指针指向const对象</wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> 如:</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> const int val = 10;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> void *p1 = &val; //error</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> const void *p2 = &val; //ok</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> 允许把非const对象的地址赋给指向const对象的指针</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr>const double *cptr;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr>double val = 10.0;</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr>cptr = &val; //ok</wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> 尽管val不是const的,但是企图通过cptr来修改val值都是错误的</wbr></wbr></wbr></wbr>

<wbr> 2.const指针</wbr>

<wbr><wbr><wbr><wbr>指针本身的值不能改变,即该指针需要在定义时初始化,以后不能再指向别的对象,但是可以通过该指针修改所指对象的值</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> 如:</wbr></wbr></wbr>

<wbr><wbr><wbr><wbr>int num1 = 10,num2 = 20;</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> int *const ptr = &num1;</wbr></wbr></wbr>

<wbr><wbr><wbr> *prt = 20;//ok ,modify num1 = 20</wbr></wbr></wbr>

<wbr><wbr><wbr><wbr>ptr = &num2; //error</wbr></wbr></wbr></wbr>

<wbr> 3.指向const对象的const指针</wbr>

<wbr><wbr><wbr> int val = 10; //或者const int val = 10;</wbr></wbr></wbr>

<wbr><wbr><wbr> const int *const ptr = &val;</wbr></wbr></wbr>

<wbr><wbr><wbr> 在定义该指针时必须初始化,之后该指针不能指向其他的对象,也不能通过该指针修改其指向的对象的值</wbr></wbr></wbr>

<wbr><wbr><wbr> int val_1 = 20;</wbr></wbr></wbr>

<wbr><wbr><wbr> ptr = &val_1;<wbr> //error</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> *ptr = 20; //error;</wbr></wbr></wbr>

一个难搞的指针问题

<wbr><wbr><wbr> typedef string* pString;</wbr></wbr></wbr>

<wbr><wbr><wbr> const pString cstr; 这句话等价于?</wbr></wbr></wbr>

<wbr><wbr>是 const string *cstr;</wbr></wbr>

<wbr> 还是 string *const cstr;</wbr>

<wbr> 还是const string *const cstr;</wbr>

<wbr> 答案是string *const cstr;</wbr>

<wbr> 相当于 const (string*) cstr; 等价于 string *const cstr;也等价于 pString const cstr;</wbr>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: