C和 C++ 的指针的最重要的区别在于 C++ 使一种类型要求更强的语言,就 void* 而言这一点更明显!
比如在C 中你可以这么写:
int* b;
float* f;
b=f;
最多编译器会给你个警告,说你在把一个float 指针赋给一个 int 指针!但并不会报错!
如果你是个追求完美的人!你可以这样写:
int *b;
float *f;
void * w
w=f;
b=f;
这下子编译器被你征服了,连警告都不会有了!但是我们这是个危险的操作,把一种类型当成另一种类型去处理,会使程序给出莫名其妙的结果!
你可以自己尝试一下在C++ 里写一遍上边的代码,无论是第一个还是第二个代码,都会出错!
可见C++ 提升了对类型安全的保护!
但是如果你一定非要把一种类型当成另一种类型去处理(我还没遇到过)的话,你可以通过“显式”类型转换!
比如:
int*b;
float *f;
b=(int*)f;
这样子C++ 编译器也拿你没辙了!编译通过,但是你一定要确认你有一定要这么做的必要,否则还是避免对指针类型使用类型转换!
引用(reference )( & ):
你可以把它理解成指针常量!主要用于函数的返回值以及参数表中!
它是一个奇特的指针,他的优点是不必怀疑它是否被初始化了(编译器强迫初始化),也不必知道怎么样对它间接引用的(编译器来帮你忙)!
很多时候有人说:既然有指针了为什么还要提出引用的概念呢:
这里我说说我自己总结主要两点:1. 引用用起来更直观,提高了代码的可读性!
2. 很多事情引用能做而指针做不了,比如对于流插入运算符<< 和流提取运算符 >> 在对他们进行重载的过程中,指针是达不到一些要求的!
建议大家在写以引用为形参的函数时,最好把形参写成常量引用的形式,这样子会避免一些不必要的麻烦!主要是避免实参和形参参数匹配的问题!
有个很好的例子可以说明引用比指针简洁:
比如在一个函数里你想改变一个指针本身而不是指针所指向变量的值!
如果你用指针的话,你可能会这样子写:
void f(int** ip){...}
main(){int i=47;int* ip=&i; f(&ip);}
下面我们来看看引用:
void f(int*& ip ){...}
main(){ int i=47;int *ip=&i; f(ip);}
在f ()定义时参数里少了一个 * ,调用时少了一个 & 是不是看起来更顺眼!
如果你说没什么感觉,那你也许不适合写代码!
最后一小部分:参数传递的准则:
我们知道在调用函数进行参数匹配的过程中有两种方式:传值, 传引用 !
(其实我自己认为归根结底都是传值!只是由于方式不同造成结果不同吧!)
言归正传:传值有很多弊病:比如在使用拷贝构造函数时如果是传值的话因为会调用构造函数这样子就会陷入死递归! 如果是通过引用进行传地址时 , 只需要进行简单单的一步:压栈!
当然也有一种情况不适合使用地址传递方式,这就是当传值是唯一安全的途径,否则将会破坏外部对象!