一、
C++中引用和指针的区别
指针初始化的时候,可以指向一个地址,也可以为空。
引用必须初始化为另一个变量.
int ival = 1024;
int *pi = &ival; // a pointer
int &rval = ival; // a reference
二、
估计很多人在编写C++程序都或多或少的会用到pointer 和 reference这两种东西,但是他们两者到底有什么样的区别和联系呢,相信大多数人是不太了解的,今天我就两者的区别和联系从实际程序的角度来加以区别。
C/C++中的指针其实就是一个变量,和其他类型的变量是一个样子的,它是一个占用四字节的变量(32位机上),它与其他变量的不同之处就在于它的变量值是一个内存地址,指向内存的另外一个地方。reference我的理解就是一个别名,它和linux操作系统上的alias是一个样子的。再者,一个pointer变量可以指向NULL,表示它不指向任何变量地址,但是reference必须在声明的时候就得和一个已经存在的变量相绑定,而且这种绑定不可改变。下面是我写的一段程序来验证pointer与reference的区别和联系的,希望能对大家理解pointer & reference的区别和联系有所帮助:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int ival = 1024;
int *pi = &ival; // a pointer
int &rval = ival; // a reference
int jval = 4096;
int xval = 8192;
cout << "ival = " << ival << "/t";
cout << "&ival = " << &ival << "/t";
cout << endl;
cout << "pi = " << pi << "/t";
cout << "&pi = " << &pi << "/t";
cout << "*pi = " << *pi << "/t";
cout << endl;
cout << "rval = " << rval << "/t";
cout << "&rval = " << &rval << "/t";
cout << endl;
cout << "jval = " << jval << "/t";
cout << "&jval = " << &jval << "/t";
cout << endl;
// change the values of the reference and the pointer
pi = &jval;
rval = jval;
// print the changes
cout << endl;
cout << "ival = " << ival << "/t";
cout << "&ival = " << &ival << "/t";
cout << endl;
cout << "pi = " << pi << "/t";
cout << "&pi = " << &pi << "/t";
cout << "*pi = " << *pi << "/t";
cout << endl;
cout << "rval = " << rval << "/t";
cout << "&rval = " << &rval << "/t";
cout << endl;
cout << "jval = " << jval << "/t";
cout << "&jval = " << &jval << "/t";
cout << endl;
cout << endl;
*pi = xval;
cout << "pi = " << pi << "/t";
cout << "&pi = " << &pi << "/t";
cout << "*pi = " << *pi << "/t";
cout << endl;
cout << "jval = " << jval << "/t";
cout << "&jval = " << &jval << "/t";
cout << endl;
return 0;
}
一次的执行结果如下:
ival = 1024 &ival = 0012FF7C
pi = 0012FF7C &pi = 0012FF78 *pi = 1024
rval = 1024 &rval = 0012FF7C
jval = 4096 &jval = 0012FF70
ival = 4096 &ival = 0012FF7C
pi = 0012FF70 &pi = 0012FF78 *pi = 4096
rval = 4096 &rval = 0012FF7C
jval = 4096 &jval = 0012FF70
pi = 0012FF70 &pi = 0012FF78 *pi = 8192
jval = 8192 &jval = 0012FF70
如果有兴趣的话也可以使用其他类型的变量来测试,并且打印出各个变量占用内存的大小,我在这里就不把具体的程序贴出来了。
三、 C++点滴:向函数中传递指针和传递指针的引用的区别:
如果是传递指针,那么回先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针;
但是对于传递指针应用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了