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.
  这个地方我们主要强调一点:当用引用传参时应该尽量将不修改相应实参的形参定义为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 }

  上面的例子形参用的是string &s 而不是const string &s,这样find_char("hello world",'o')就无法顺利编译通过(不能将类型为‘std::string&’的非 const 引用初始化为类型为‘const char*’的临时变量)。而且还有一种情况,假设const string &str是另外一个函数的形参,那么该函数也无法通过find_char(str,'c')来调用find_char。

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.其他总结待续,不对地方请多多指教...

原文链接: https://www.cnblogs.com/yuyanfeng/archive/2011/12/19/2293810.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    c/c++中的指针

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/38829

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午3:27
下一篇 2023年2月8日 下午3:27

相关推荐