指针的引用——在函数中的巧妙应用

前面有一篇文章讲了指针与引用。并且还提到不能定义指向引用的指针(因为引用不是对象,没有实际的地址)。那么,能否定义指针的引用呢?答案是肯定的,因为指针本身就是一个对象。即然是对象,就能定义一个引用邦定该对象。先来看看指针的引用的用法:

以int类型为例如下:

void ReferencePointer()
{
	int		i = 5;		// 变量i
	int*	p = &i;		// 指针p,指向变量i
	int*&	pr = p;		// 指针的引用,与p指向同一个变量i
	cout << i << "  " << *p << "  " << *pr << endl;
	i = 10;
	cout << i << "  " << *p << "  " << *pr << endl;

	cout << "addr: " << p << "  " << pr << endl;	// 指针的引用其它就是指针p的一个别名,和p有相同的地址
	pr = NULL;										// 因此也可以给指针赋空
	cout << "addr: " << p << "  " << pr << endl;
}

结果:

5  5  5

10  10  10

addr: 0045FE50  0045FE50

addr: 00000000  00000000

在函数中,指针的引用作为参数可以起到很巧妙的作用。

假设有一个书的类Book,基定义如下:

struct Book

{

string isbn;

string name;

double price;

string author;

};

现在需要这样一个函数:有一个文件存放着一本书的相关信息(ISBN、书名、价格),现要从这个文件中读取信息并赋给Book的对象。

要定义这样一个函数,我们首先会想到的是有一个输入(文件的路径)和一个输出(Book的对象)。你可能会这样定义函数:

Book* GetBookFromFile(const string& filePath);

这种方式你必须在函数体内创建Book的对象(也就创建一个Book的内存空间),但函数体内创建的内存空间只在函数的作用域内有效,在函数体外是无效的,也就是说返回的指针将指向一个任意的值,这将是非常危险的。

如函数内:

在函数被调用后:

既然不行,您应该会想到另外一种定义方式如下:

Book GetBookFromFile(const string& filePath);

没错,这样定义确实可以,但需要在函数体内声明一个Book的对象,函数返回值的时候会进行一次对象的拷贝。这样增加了一个对象拷贝的过程,使效率降低。

Book GetBookFromFile(const string& filePath)
{
	Book book;
	fstream fileInput(filePath);
	fileInput >> book.isbn >> book.name >> book.price;
	return book;
}

您可能还会想到这种方式:

void GetBookFromFile(Book &book, const string& filePath);

没错,这确实可以解决上面的问题,不用再对对象进行拷贝。但新的问题又来了,上层调用这个函数时,如果要判断返回book对象是否正确获取了文件的信息得逐个地判断基属性是否空,如下代码。这无疑加重了上层调用的负担。

Book book;

GetBookFromFile(book, "E:\\book.txt");

if (!book.isbn.empty() && !book.name.empty() && book.price > 0)

{

// TO DO ...

}

当然,这有一种改进的方式,就是把返回值类型void改为bool,这样就可以通过返回的bool值确定函数是否成功调用。

针对上面的这个问题,如果返回的是Book的指针,直接判断返回的指针是否为NULL就可以。那么您可以有以下两种定义:

void GetBookFromFile(Book* book, const string& filePath);

void GetBookFromFile(Book*& book, const string& filePath);

当然,我是建议选择第二种方式,因为引用确保了传进来的指针有一个正确的值(引用必须在定义时被初始化)

定义如下:

void GetBookFromFile(Book* pBook, const string& filePath)
{
	if (pBook == NULL)
	{
		return;
	}
	fstream fileInput(filePath);
	fileInput >> pBook->isbn >> pBook->name >> pBook->price;
}

void GetBookFromFile(Book*& pBook, const string& filePath)
{
	if (pBook == NULL)
	{
		return;
	}
	fstream fileInput(filePath);
	fileInput >> pBook->isbn >> pBook->name >> pBook->price;
}

对这两个函数,调用方式都可以如下:

	Book* pBook = new Book();
	pBook->author = "SimileSunrise";
	GetBookFromFile(pBook, "E:\\book.txt");
	delete pBook;

时间: 2024-10-13 17:49:01

指针的引用——在函数中的巧妙应用的相关文章

闭包允许内层函数引用父函数中的变量,但是该变量是最终值

今天在学习JavaScript的时候碰到的一个类似于如下代码的问题: /** * <body> * <ul> * <li>one</li> * <li>two</li> * <li>three</li> * <li>one</li> * </ul> */ var lists = document.getElementsByTagName('li'); for(var i =

[C++] 变量、指针、引用作函数参数的区别

//============================================================================ // Name : CppLab.cpp // Author : sodino // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //===============================

c++中函数中变量内存分配以及返回指针、引用类型的思考

众所周知,我们在编程的时候经常会在函数中声明局部变量(包括普通类型的变量.指针.引用等等). 同时,为了满足程序功能的需要,函数的返回值也经常是指针类型或是引用类型,而这返回的指针或是引用也经常指向函数中我们自己声明的局部变量. 这样,程序在某些情况下就可能存在一定的问题.看似很简单的问题,通过仔细的分析,我们就能够更好的理解c++中内存分配和释放的问题. 好,废话不多说,我们进入正题.首先,简单介绍一下程序的内存区域的分配: 程序的内存分配 ①堆区(heap).这一部分主要是由程序开发人员自己

浅谈C++中指针和引用的区别

指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址. 而下面2句定义了一

转 浅谈C++中指针和引用的区别

浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a

C++ 浅谈C++中指针和引用

浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单

#详解C++中的指针与引用

指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作.但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此介绍一下指针和引用,力争将最真实的一面展现给大家. 1.指针和引用的定义 在深入介绍之前我们首先来看一下指针和引用的定义.指针和引用的区别,然后分别针对指针和引用展开讨论,深入细节为何有这些差异. 指针的权威定义: In a declaration T D where D has the form * cv-qualifier-seqopt

C++中的指针和引用

此文来自Listening_music:   http://blog.csdn.net/listening_music/article/details/6921608 感谢作者提供的美文,本人很受用,谢谢! 1.指针和引用的定义 下面用通俗易懂的话来概述一下指针和引用: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图,所示指针的含义: 引用-引用是一个对象的别名,主要用于函数

C++ 指针与引用 知识点 小结

[摘要] 指针可以指向变量.数组.字符串.函数.甚至结构体.即指针可以指向不同数据对象.指针问题 包括 常量指针.数组指针.函数指针.this指针.指针传值.指向指针的指针 等.主要知识点包括:1.指针与引用在概念上的三个区别及其在const.sizeof.自增运算上的差异:2.熟记经典swap函数的指针实现与引用实现,并能反映输出错误的两个函数的思想弊端:3.熟记GetMem函数的错误形式以及错误产生的原因:4.比较数组.指针与静态变量作为函数返回值的差异:5.str.*str以及&str三者