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 = π//error</wbr></wbr></wbr>
<wbr><wbr><wbr> const *cptr = π//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>
<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 = π//error</wbr></wbr></wbr>
<wbr><wbr><wbr> const *cptr = π//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>
相关文章推荐
- c++ 学习笔记(47)-C++中两个类中互相包含对方对象的指针问题
- C++学习记录之函数返回值为指针的问题
- C++指针问题与学习
- C++学习——父类指针和子类指针的步长问题
- c/c++中指针学习的两个绝好例子
- c++入门学习笔记指针篇
- C++程序员在学习C#时需要注意的一些问题(一)
- 指针操作超越变量作用范围的问题(高质量c++)
- c++入门学习(内存与指针及数组)
- [转]C++中this指针理解汇总以及问题和解答
- c/c++中指针学习的两个绝好例子
- c/c++中指针学习的两个绝好例子
- C++之父元旦专访(8+13个问题,关于C++的学习&使用和未来)
- c++学习读书笔记-指针和自由存储空间
- 新手入门学习:浅析c/c++中的指针
- C/C++指针学习的两个经典实例
- c++指针问题
- 学习C++/CLI发现的一些问题,算不算Bug?
- 挑战30天C++入门极限-c/c++中指针学习的两个绝好例子
- C++成员函数指针的应用(学习收录)