C++指针及引用

来源:《C++必知必会》

1,引用。

引用与指针的三大区别:1,不存在空引用;2,所有引用都要初始化;3,一个引用永远指向用来对它初始化的那个对象。

编译器可能无法检测到不那么明显的创建空引用的尝试,如下:

1 Employee *getAnEmployee();2 //......3 Employee &anEmployee = *getAnEmployee();//getAnEmployee可能返回为空指针4 if( &anEmployee == 0){5     //......6 }7 //建议使用指针来存放getAnEmployee函数的返回值

2,我们知道,数组形参会产生所谓的“退化”现象,即退化成指向中其首元素的指针,而且会丢失边界。如以下函数声明:

void average(int ary[]);

其形参仍为一个int *类型。

如果数组边界的精确数值非常重要,并且希望函数只接受含有特定数量的元素的数组,可以考虑使用一个引用形参:

void average (int (&ary)[12]);

这样average函数即只能接受大小为12的整形数组。可通过模板来让编译器帮我们推导数组的大小:

template <int n>void average(int (&ary)[n]);

更传统的做法当然是直接将数组大小以参数的形式传入:

void average_n(int ary[], int size);

多维数组形参的情况类似:

1 void process(int (*ary)[20]);//参数为指向20个元素数组的指针2 void process(int ary[][20]);//与上行等价,但可读性更好

3,注意到引用与指针的第三个区别,所以在实际情况下,通常用引用来代替常量指针的使用:

1 T *pt = new T;2 const T &rct = *pt;3 T &rt = *pt;

4,使用多级指针的一种情况是在函数中修改指针参数的值,如:

1 void scanTo(const char **p, char c){2     while( **p && **p != c)3            ++*p;4 }

这种做法是合理的,但是在C++中,更习惯、更简单、更安全的做法是使用指向指针的引用来作为函数参数,而不是指向指针的指针:

1 void scanTo ( const char *&p, char c){2     while (*p && *p != c)3             ++p;4 }5 6 char s[] = "Hello, China!";7 const char *cp = s;8 scanTo(cp, ",");

5,一个常见的误解是:适用于指针的转换同样适用于指向指针的指针。非也。如下:

1 Circle *c = new Circle;2 Shape *s = c; //挺好的3 Circle  **cc = &c;4 Shape **ss = cc; //错误!一个指向Circle指针的指针并不是一个指向Shape指针的指针!

当涉及const时也会发生同样的混淆:

1 char *s1 =0;2 const char *s2 = s1; // no pblm3 char *a[MAX]; // that is, char **4 const char ** ps = a; //Oooooops!

总结:引用比指针安全、优美,能用引用的时候就尽量多用引用吧。
原文链接: https://www.cnblogs.com/cmleung/archive/2011/05/24/2054940.html

欢迎关注

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

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

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

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

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

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

相关推荐