1、每种编程语言都会使用指针,C++将指针暴露给用户(程序员),而JAVA和C#等语言将指针隐藏起来了。
2、指针能够有效的表示数据结构;
3、能动态分配内存,实现内存的自由管理
4、方便使用字符串和高效使用数组
5、指针直接与数据的储存地址有关,比如:值传递不如地址传递高效,因为值传递先从实参的地址中取出值,再赋值给形参代入函数计算;而指针则把形参的地址直接指向实参地址,使用时直接取出数据,效率提高,特别在频繁赋值等情况下(注意:形参的改变会影响实参的值!)
先用通俗易懂的话介绍一下:
指针-对于一个类型T,T就是指向T的指针类型,也即一个T类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const、volatile等等。见下图,所示指针的含义:
引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。见下图,所示引用的含义:
总之,可以归结为"指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。"
int main()
{
int i= 0;
int j=1;
//常量引用,指向的地址的内容是个常量,不可以修改,即i的值不可以修改
const int &r = i ;
//常量指针,p指针的地址可修改,但无法修改指向地址的内容,*p不可修改,即p指针不可以修改j的值,但可以指向i的地址
const int* p=&j;
p = &i;
//指针常量,q指向的地址不可修改,可以修改指向地址的内容,*q可以修改,即q指针只能指向j的地址,但可以修改j的值
int* const q = &j;
*q=5;
//常量指针常量,w指向的地址和内容都不可修改,即w和*w均不可修改
const int* const w = &j;
cout<<j<<endl;
cout<<i<<endl;
return 0;
}
引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量, 那就得使用指向指针的指针,或者指针引用。
最后,总结一下指针和引用的相同点和不同点:
★相同点:
这种传递方式中,实参和形参是两个不同的地址空间,参数传递的实质是将原函数中的变量值,复制到形参所在的存储空间,形参的地址空间在函数执行完毕后,会被回收掉。函数对形参的操作,不会影响实参的值。
这种传递方式中,实参是变量的地址,形参是指针类型的变量,在函数中对指针变量的操作,就是对实参进行操作。
这种传递方式中,形参是引用类型变量,其实就是实参的一个别名,在被调用函数中,对引用变量的所有操作等价于对实参的操作。
在内置类型当中三种传递方式的效率差不多;
在自定义类型中,传引用效率更加高效,因为没有对形参进行一次拷贝