C++中指针(pointer)和引用(reference)的区别和联系
2005-04-04 18:57
726 查看
估计很多人在编写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
如果有兴趣的话也可以使用其他类型的变量来测试,并且打印出各个变量占用内存的大小,我在这里就不把具体的程序贴出来了。
如果对上述看法有异议的话欢迎email至andyzhange@yahoo.com.cn 交流一下。
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
如果有兴趣的话也可以使用其他类型的变量来测试,并且打印出各个变量占用内存的大小,我在这里就不把具体的程序贴出来了。
如果对上述看法有异议的话欢迎email至andyzhange@yahoo.com.cn 交流一下。
相关文章推荐
- 详解c++ 引用(reference)与 指针(pointer)的区别与联系
- 详解c++ 引用(reference)与 指针(pointer)的区别与联系
- c++中引用和指针的区别和联系
- C++中指针和引用的区别与联系
- C++ 中引用(reference)和指针的区别
- C++中引用和指针的联系和区别
- C++中引用、指针,传值的联系和区别
- 引用和指针的区别 Difference between pointer and reference
- 读thinking in java的收获(一)——java中的引用,c++引用与c指针的区别与联系以及java的数据类型
- (整理)C++中指针和引用的区别和联系(待补充)
- c++之引用和指针的区别和联系
- C++指针和引用的区别与联系
- C++之函数参数的值传递、指针传递以及引用传递的区别和联系
- c++引用与指针的区别与联系
- c++中引用和指针的区别和联系
- c++ 指针point 和引用reference的区别
- c++ 指针point 和引用reference的区别
- 指针(Pointer)和引用(Reference)的区别
- C++中引用与指针的区别与联系
- C++指针和引用的区别与联系