3月24号左右就要计算机二级考试了,这几天在忙着看C++,前几天刚刚把面向过程的那一部分内容看完,面向对象的东西还没有看。在看的过程中有三个概念息息相关,他们是:指针,变量的地址,引用。
指针:指针是一种特殊的变量,它存放的是变量的地址值,通过指针可以间接对这个变量操作。指针的类型与它所存地址的变量的类型是相同的。
指针的定义与一般变量的定义差不多,只是变量名前面要加一个“*”,以说明定义的变量是指针类型的,例如:int *pa;就是一个简单的指针变量的定义,它所存放的是int类型的变量的地址,如 int a; pa=&a;将整型变量a的地址赋给指针pa
地址:即变量的地址,内存中每个字节都有一个地址值,而变量的地址是它所占有的相应字节的首地址,如:int a;&a指的是int型变量a所占4个字节中的第一个字节的地址
对于一个已经定义的变量,他有两个重要的值,一个是变量的值(就是我们通常所说的变量值),另一个是变量的地址值。系统通过地址找到内存中对应的变量,然后再对变量值进行处理。
引用:引用也是一种比较特殊的数据类型,一个引用就是一个已存变量的别名,而且在定义引用时必须给它赋初值,如:int a;int & b=a;(定义引用就是在相应的变量名前加“&”)。
引用与指针很相似,但是他们又有很大的区别:
1指针在内存中是要有自己的空间的,它存放的是变量的地址值,而引用不占用内存空间,它只是一个已经存在的变量的一个别名,引用的变量值和地址值都是和被引用变量相同的。语句 int & b=a;其实就是给变量a又起了一个名b
2引用和指针的作用是很相似的,就是当他们作为函数的形参时,对指针和引用的操作都会反映到实参上,如
void fun1(int & a,int &b)
{
a=a+1;
b=b+1;
}
void fun2(int *a,int *b)
{
*a=*a+1
*b=*b+1
}
在调用函数时,下面两种情况都将改变实参的值
int c,d;
c=1;
d=1;
fun1(c,d);
cout<<c<<d;
fun2(&c,&d);
cout<<c<<d;
两次的输出结果分别是:
22
33
其实fun1函数其实就是VB里面的函数调用传引用方式,相当于vb里面的 public function fun1(byref a as integer,byref b as integer)
如果改变了 形参a,b的值,实参的值也就改变了
3虽然指针和引用具有相似的作用,但是指针是不安全的,引用是安全的,因为引用在定义时就得赋初值给定被引用变量,以后就不能变了;而指针所指向的变量是可以改变的。所以在C#和Java里面保留了引用而弃用指针
希望通过这篇博客,能对大家有所帮助。