指针
指针是用来操纵地址的特殊类型变量,它可以作为函数参数来传递数组变量,也可以用来访问和操作内存空间。
在指针中,有两种特殊运算符:& 和 *;其中,&运算符是用来去地址的,而*运算符则是用来取值和声明指针的。
指针的声明和使用:
int*p; //声明一个int 型指针 int x=37; p=&x; //p为x变量的地址
从指针的使用来看,指针指向了一个变量,于是,在对变量的值进行操作时,我们有了两种思路:一是直接改变变量的值;二是通过指针来间接改变变量的值。在对单个变量进行运算时,这两种方法看似相同,但是在对数组进行运算时,即处理大数据量时,指针运算就比数组运算快了,这时,指针的优势就显示了出来。
以前在学习VB的时候,是把数组和循环放在一起学习的,一般处理非常小的问题是不用数组和循环的,但是,当碰到需要重复处理的大的数据量的时候,就要用到数组和循环,在C++里面,提供了指针,用指针加上循环,处理起来会更快,所以,指针和数组在使用中,也具有密不可分的联系。
虽然指针有诸多好处,但是,也是存在漏洞的:比如,指针的悬挂问题:即两个指针指向一个空间,一个指针所指向的空间被删除,另一个指针所指向的空间也就被删除了。例如:
#include<iostream> #include<cstring> using namespace std; void suspension(char * s); void suspension(char * s) { cout<<s<<endl; //输出指针所指区域的内容 delete s; //释放指针所指空间 } int main() { char * p; p=new char[100]; //声明p所指空间的大小 strcpy(p,"c++ language"); //在p所指向的空间内放入字符 suspension(p); //输出p所指内容,并且同时释放形参s指向的内存空间 cout<<p<<endl; //输出指针p所指的内容,但是因为此区域已被释放,所以出现了指针悬空问题 return 0; }
如上,p和s同时指向一个空间,当s指向的空间内容被释放了,p就成了空指针,造成了指针悬空的问题。
引用
引用是个别名。就像以前使用API函数一样,因为名字太长了,给它重新起个好用的名字。
例如:
Int i=1; Int&r=I;
此处r初始化为对i的引用。在此,要求i已经声明或定义,而引用仅仅是它的别名。
建立时需用一个数据对象的名字进行初始化,以指定该引用所代表的的数据对象。此后,对引用的任何操作实际上就是对所代表的数据对象的操作。系统不会为引用再次分配存储空间。
引用示例:
引用和指针
1,创建指针的时候,可以不初始化,但是创建引用的时候,要立即对其初始化。
2,指针则可以在任何时候改变为指向另一个对象,但是,一旦一个引用被初始化为一个对象的引用,它就不能再被改变为另一个对象的引用,从这种程度上看,引用像是静态变量,一旦被赋值,程序运行中不可改变,但是指针像动态变量,一有需要,可以随时改变。
3,引用和一块合法的存储空间关联,即:不可能有NULL引用。必须确保引用是对具体合法的对象的引用。
4,如果有占用空间大的对象需要作为函数参数传递的时候,在C中往往使用指针,而在C++中,既可以使用指针,也可以使用引用。引用作为参数的最大好处是可以像指针那样工作,其使用方式又和一般变量相同。所以,引用比指针有更好的可读性。
,