c/c++中的指针
1. 指针和const
指针是c/c++中重要的一部分,但是指针一旦跟const相关联就很容易使人困惑。我们常听任说指针常量和常量指针,那他们有什么区别呢?我们从下面简单的例子入手来讲解下。
1 int a=10;
2 const int *pa1=&a;
3 int const *pa2=&a;
4 int *const pa3=&a;
5 const int *const pa4=&a;
其实上面的例子中2和3的效果是一样的,const修饰的是*pa,也就是说const修饰的是指针指向的内容,这样的话我们通过指针是无法修改a的值得,这种指针叫做指针常量。事实上,c++规定指向const对象的指针也必须具有const特性,也就是说如果a是常量的话(const int a=10),就必须用2或3所示的方式定义了。
例子中第四行定义的是个常量指针,也就是说const修饰的是指针而不是指针指向的内容。通过这中方式定义的指针,可以通过*pa3=20;来更改a的值,但却不能pa3=&b;来更改pa3的值。
当然了,两者也是可以结合起来用的,第五行定义的就是一个指向常量的常量指针,既不可以通过指针修改原有值,也不可以修改指针值。
2. 函数和常量
其实函数用到常量的地方也很多。我们抛开函数指针等比较复杂的场景来说,函数用到const地方主要有:
- 函数的参数,包括const引用,const指针,const值等;
- 函数的返回值,其实主要也是返回const指针或者const引用;
- 函数内部用到const.
1 //return index of occurrence of c in s or s.size() if c isn't in s
2 string::size_type find_char(string &s, char c){
3 string::size_type i=0;
4 while(i!=s.size() && s[i]!=c)
5 ++i;
6 return i;
7 }
3. 指针和类中的成员函数
如果将一个类中的成员函数定义为const,那么该成员函数是无法修改类中的成员变量的。例如:
1 inline void print_tree::Tree() const {
2 //print code
3 }
上面的print_Tree函数就不会错误的修改类中的成员变量的值。
另外一个比较有意思的是类中隐含的this指针,在普通的非const成员函数中,this的类型是一个指向类类型的const指针,可以改变this所指向的值,但不能更改this所保存的地址。在const成员函数中,this的类型是一个指向const类类型对象的const指针,既不能改变this所指向的对象,也不能改变this所保存的地址。
4.其他总结待续,不对地方请多多指教...