什么时候使用引用?和什么时候使用指针

什么时候使用引用?和什么时候使用指针

1.问题提出:

当一个类的对象作为实参数传递时,使用值传递和引用传递有什么区别?

比如: DateType ExampleFun(CString &strFileName,...)与

DateType ExampleFun(CString strFileName,...)

解答之前,我们先来看2个基本的概念:形参和实参。

->通俗的讲:形参是形式上的参数,实参是实际的参数;

->详细的讲:形参只是对实参的一种抽象类型描述,只是声明一个函数(方法)能接受什么类型的实参,而不确定接受的实参具体内容是多少;

实参就是传递给函数(方法)对应形参的具体内容(值),形参的初始指(内容)由实参决定.形参在函数(方法)结束返回后就被释放了.

2.参数传递方式分:传值和传址;

1).传值方式,只是将实参的值的拷贝传递给函数(方法),在方法内对形参进行操作,其对象是实参的拷贝,对实参不能造成影响.在方法结束返回后,形参被释放丢弃,实参的内容并不会改变;

2).传址方式,将实参的地址传递给函数(方法),在方法内对形参进行操作即等于对实参进行相同的操作,在方法结束返回后,形参同样被释放,实参的内容将会是对形参进行操作的结果.

而传址方式,又可以细分为:引用传递(pass-by-reference) , 指针传递(pass-by-pointer)

引用其实就是对象的别名,传对象的引用,用于把一个对象的地址作为参数传过去,而不是对象本身。

这是我们就明白了前面问题的答案:传递引用,避免了一次实参到形参的拷贝,提高了效率。

3.关于何时使用引用参数?

(1)使用引用参数的主要原因有:

程序员能够修改调用函数中的数据对象

通过传递引用而不是整个数据对象,可以提高运行速度

(2)对于使用传递的值而不做修改的函数:

如果数据对象很小,如内置数据对象,则按值传递

如果数据对象是数组,则使用指针,并将指针声明为指向const的指针

如果数据对象是较大的结构则使用const指针或const引用,以提高效率,节省复制结构所需的时间和空间

如果数据对象是类对象则使用const引用。类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因,因此传递类对象的标准方式是按照引用传递。

(3)对于修改调用函数中数据的函数:

如果数据对象是内置数据类型则使用指针。

如果数据对象是数组则只能使用指针

如果数据对象是结构则使用引用或指针

如果数据对象是类对象则使用引用

4.总结:

在c/c++编程中,到底什么时候该用指针来传递参数呢?总结如下:

1. 需要改变实参的时候, 只能用指针.

2. 传递大型结构并且"只读"其元素的时候,

因为大型结构通过值传递, 需要拷贝其每个元素, 这样效率太低.

3. 需要遍历数组或频繁引用其元素时, 这样效率比使用下标高.

4. 动态分配空间时, 必须使用指针.

5. 传递数组时, 必须使用指针.

6. 函数返回指针时, 比如fopen

7. 另外,有时候需要使用二级指针,即指针的指针,例如:

MemAllocate(char *a){

a=(char *)malloc(sizeof(char));

}

当调用此函数进行内存分配时,发现不能分配内存不能成功,因为此时对于a来说,形参改变了,但实参并不会改变,他们对应于不同的内存单元。正确的写法应该是:

MemAllocate(char **a){

*a=(char *)malloc(sizeof(char));

}

这样就能够正确地分配内存了。

指针和引用很多时候效果是一样的,但是引用往往会带来阅读上的困难,因为在使用方法上和形参一样,但 是具备指针的特性。再加上 如果数据对象是类对象则使用const引用。类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因,因此传递const类对象的标准方式是按 照引用传递。其他时候用指针较好

什么时候用指针和引用(二)

首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。

1.如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针

2.如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

3.不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。

引用的一些规则如下:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

(2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

时间: 2024-10-12 15:51:04

什么时候使用引用?和什么时候使用指针的相关文章

《C++ Primer》学习 之 返回数组的引用(返回数组的指针,方法与之相同)

/* 返回数组的引用(返回数组的指针,方法与之相同) 共四种方法(在下面示例程序中,调用其中一种方法时,需要将其他三种方法注释掉)*/ 1 #define _CRT_SECURE_NO_WARNINGS 2 #define HOME 3 #include <iostream> 4 #include <stdexcept> 5 #include <ctype.h> 6 #include <locale> 7 #include <iterator>

引用是包装过的指针

从语义上理解,引用就是变量的别名,指针是一个变量,保存着变量的地址 因为引用是别名,所以引用不能单独存在,没有空引用,而能有空指针 但作为C++程序员,只从这个层面理解引用显然心里会发虚 因此上测试代码 #include <iostream> void t1() { char c = 'a'; char &r = c; char *p = &c; r = 'b'; *p = 'c'; int size; size = sizeof(r);//1 size = sizeof(p)

指针和引用(4)指向指针的指针

1.知识点 (1)在程序中可以声明指向任何数据类型的指针,指针也可以指向指针类型,成为指向指针的指针.下面是一个使用例子 1 int a=10,b=20; 2 int *q=&a; 3 int **p=&q; 4 **p=30; (2)如果想通过指针在被调函数中修改主调函数的变量,必须将主调函变量(务必确定该变量的类型,有时候可能变量本身就是指针,这时候形参就需要是指针的指针了)的地址作为参数,在被调函数中修改主调函数指向的内容. 2.面试题 2.1指针作为参数的常见错误 1 int fi

指针和引用(5)函数指针

1.知识点 (1)指针可以指向任何类型,也可以指向函数.每个函数在内存中都占用一段存储单元,这段存储单元的首地址称为函数的入口地址,指向之歌函数入口地址的指针称为函数指针. (2)函数基本用法如下: 1 int max(int a, int b) { 2 return a > b ? a : b; 3 } 4 int (*p)(int, int) = max;//定义函数指针时必须指明函数返回的类型和参数列表 5 int x = 10, y = 20; 6 int z = p(x, y);//可

C++学习笔记----2.4 C++引用在本质上是什么,它和指针到底有什么区别

从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调

C++中的引用

引用就是某个目标变量的别名,对引用的操作与对变量的直接操作效果完全相同. 引用的声明方法:类型标识符 &引用名=目标变量名: 如下:定义引用ra,它是变量a的引用,即别名. int a; int &ra=a; 1)  声明一个引用,必须进行初始化. 2)引用声明完毕后,相当于目标变量有两个名称即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名. 3)引用本身不是一种数据类型,因此引用本身不占存储单元,系统也不会给引用分配存储单元. 4)不能建立数组的引用.因为数组是一个由若干个

Java对象及其引用 (1)

Java对象及其引用 [文章转载自:http://zwmf.iteye.com/blog/1738574] 说明:所有转载为个人学习存档使用,凡转载内容均注明转载出处.以后不再说明. 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没法很好地理解下面的面向对象技术.把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路. 为便于说明,我们先定

实习第二天-对象-对象引用-引用变量-精-精-精-下雨天

class Person{ } Person是一个数据类型-引用类型 数据类型-变量名   Person a;  声明一个引用类型的变量a,然后在栈中给引用变量a分配了内存空间 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没法很好地理解下面的面向对象技术.把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路. 为便于说明,我们先定义一个简单的类: class Vehicl

c++指针与引用问题

本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #include<iostream>using namespace std;void foo(int*p);int main(){    int a=5;    int *b=&a;    printf("%d %d\n",b,*b);    foo(b);    printf

(C/C++)区别:数组与指针,指针与引用

1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存.指针远比数组灵活,但也更危险. 数组和指针特点的简单比较: 数组 指针 保存数据 保存地址 直接访问数据 间接访问数据,先取得指针的内容,然后以它为地址取得数据 用于存储数目固定且类型相同的数据 通常用于动态数据结构 编译器自动分配和删除