C++ Primer(第四版) 课后习题7.12

问题:什么时候使用指针形参?什么时候使用引用形参?解释两者的优点和缺点。

回答:参数以引用参数传递和以指针形式传递效果相同,程序员能够修改调用函数中的数据对象,参数传递过程中防止拷贝对象,可以提高运行速度。

1.何时使用引用参数和指针形参:

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

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

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

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

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

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

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

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

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

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

2.总结:

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

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

  (2)动态分配空间时, 必须使用指针.

  (3)传递数组时, 必须使用指针.

  (4) 函数返回指针时, 比如fopen

  (5)另外,有时候需要使用二级指针,即指针的指针,例如:

   MemAllocate(char *a){

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

   }

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

   MemAllocate(char **a){

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

   }

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

3.差异:
    指针可能(也可能不)指向某个实际对象。使用指针时要先确定其值为非0。而引用不需要的。

  指针可以移动。 而引用形不能够。在使用过程中,引用形简单,但是灵活度不大, 不容易出错而指针灵活度大, 但是容易出错。
时间: 2024-09-30 10:49:32

C++ Primer(第四版) 课后习题7.12的相关文章

计算机组成原理_第四版课后习题答案(完整版)

计算机组成原理_第四版课后习题答案(完整版) ?第一章 1.?比较数字计算机和模拟计算机的特点. 解:模拟计算机的特点:数值由连续量来表示,运算过程是连续的: 数字计算机的特点:数值由数字量(离散量)来表示,运算按位进行. 两者主要区别见P1?表1.1. 2.?数字计算机如何分类?分类的依据是什么? 解:分类: 数字计算机分为专用计算机和通用计算机.通用计算机又分为巨型机.大型机. 中型机.小型机.微型机和单片机六类. 分类依据:专用和通用是根据计算机的效率.速度.价格.运行的经济性和适应性来划

数学物理方法 高教 第四版 课后习题答案

数学物理方法 高等教育出版社 第四版 课后习题答案 课后习题答案下载地址 链接:https://pan.baidu.com/s/1KqePoJ8AXb4vAxXadOCfCg提取码:73um 如果链接失效扫一扫右侧,回复 数学物理方法答案 即可免费获取 百度文库所有文档原格式下载方法  回复 文库免费下载 数学物理方法 高教 第四版 课后习题答案 更多相关: 高等数学同济七版上册课后答案:https://www.cnblogs.com/need/p/11491277.html 高等数学同济七版下

C++ Primer 第四版课后练习解答 习题1.1

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.1 查看所用的编译器文档,了解它所用的文件命名规范.编译并运行本节的main程序. [解答] 一般而言,C++编译器要求编译的程序保存在文件中.C++程序一般涉及两类文件:头文件和源文件.大多数系统中,文件的名字由文件名和文件后缀(又称扩展名)组成.文件后缀通常表明文件的类型,如头文件的后缀可以是.h或.hpp等:源文件和后缀可以是.cc或.cpp等,具体的后缀与使用的编译

C++ Primer 第四版课后练习解答 习题1.13

注意:本随笔是直接参考<C++Primer(第四版)习题解答(完整版)>中的.此处主要是便于本人以后反复阅读. 习题1.13 编译器不同,理解其诊断内容的难易程度也不同.编写一些程序,包含本小节"再谈编译"部分讨论的那些常见错误.研究编译器产生的信息,这样你在编译更复杂的程序遇到这些信息时不会陌生. [解答] 对于程序中出现的错误,编译器通常会给出简略的提示信息,包括错误出现的文件及代码行.错误代码.错误性质的描述.如果要获得关于错误的详细信息,一般可以根据编译器给出的错误

C++ Primer 第四版课后练习解答 习题1.2

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.2 修改程序使其返回-1.返回值-1通常作为程序运行失败的指示器.然而,系统不同,如何(甚至是否)报告main函数运行失败也不同.重新编译并再次运行程序,看看你的系统如何处理main函数的运行失败指示器. [解答]笔者所使用的Windows操作系统并不报告main函数的运行失败,因此,程序返回-1或返回0运行效果上没有什么区别.但是,如果在DOS命令提示符方式下运行程序,然

C++ Primer 第四版课后练习解答 习题1.3

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.3 编一个程序,在标准输出上打印"Hello,World". [解答] 1 #include <iostream> 2 3 int main() 4 { 5 std::cout << "Hello,World" << std::endl; 6 return 0; 7 } 本人代码示例: 1 #inc

C++ Primer 第四版课后练习解答 习题1.19

注意:本随笔是直接参考<C++Primer(第四版)习题解答(完整版)>中的.此处主要是便于本人以后反复阅读. 习题1.19 如果上题给定的数1000和2000,程序将产生什么结果?修改程序,使每一行输出不超过10个数. [解答] 1 int main() 2 { 3 int v1, v2, low,up; 4 cout << "Enter tow numbers " << endl; 5 cin >> v1 >> v2; 6

C++ Primer 第四版课后练习解答 习题1.8

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.8 指出下列输出语句那些(如果有)是合法的. std::cout << "/*"; std::cout << "*/"; std::cout << /* "*/" */; 预测结果,然后编译包含上述三条语句的程序,检查你的答案.纠正所遇到的错误. [解答] 第一条和第二条语句合法

C++ Primer 第四版课后练习解答 习题1.11

注意:本随笔是直接参考<C++Primer(第四版)习题解答(完整版)>中的.此处主要是便于本人以后反复阅读. 习题1.11 用while 循环编程,输出10 到0递减的自然数.然后用for 循环重写该程序. [解答] 用while循环编写的程序: 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int i = 10; 7 while (i >= 0) 8 { 9 cout <<

C++ Primer 第四版课后练习解答 习题1.12

注意:本随笔是直接参考<C++Primer(第四版)习题解答(完整版)>中的.此处主要是便于本人以后反复阅读. 习题 1.12 对比前面两个习题中所写的循环.两种形式各有何优缺点? [解答] 在for 循环中,循环控制变量的初始化和修改都放在语句头部分,形式较简洁,且特别适用于循环次数已知的情况.在while循环中,循环控制变量的初始化一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不如for语句简洁,但它比较适合用于循环次数不易预知的情况(用某一条件控制循环).两种形式