vlambda博客
学习文章列表

C语言基础教程12----C语言引用参数与指针参数

大家好,我是御峰,又到了C语言基础教程更新的时间了,拖更了好久请见谅哈(就是这周问题太多了,到现在我有一部分都还没搞懂,还在问老师的路上,这次的问题比较新鲜,也比较丰富,大家看图)

C语言基础教程12----C语言引用参数与指针参数

这个是在小甲鱼带你学C带你飞中的第29课发生的问题,当时我是认为系统的不同会导致sizeof b的输出不同,但老师好像并不怎么想(我自己的想法也可能不对,和老师探讨可以出现很多效果)

C语言基础教程12----C语言引用参数与指针参数

目前探讨的结果还没有出来,如果老师有在课堂上讲的话到时候我截取出来给大家听一下哈
C语言基础教程12----C语言引用参数与指针参数


C语言基础教程12----C语言引用参数与指针参数

根据小甲鱼的课程,我自己总结了一些知识,大家可以参考一下

注:这次所有代码全是截图....由于我复制代码到编译器上会错位,导致大家无法直观看明白..下次我修改一下再进行上传





引用和指针参数,这两种参数都允许函数修改实参,也都允许有效地向函数传递大型类对象。那么,怎么样决定把函数参数声明成引用还是指针呢?

引用必须被初始化为指向一个对象,而且一旦初始化了,就不能指向其他对象。而指针可以指向一系列不同的对象也可以什么都不指向。

因为指针可能指向一个对象或者没有任何对象,所以函数在确定指针实际指向一个有效地对象之前不能安全地解引用一个指针。例如:


   
     
     
   
  1. C语言基础教程12----C语言引用参数与指针参数


另一方面,对于引用参数,函数不需要保证它指向一个对象。例如:


   
     
     
   
  1. C语言基础教程12----C语言引用参数与指针参数


如果一个参数可能在函数中指向不同的对象,或者这个参数可能不指向任何对象,则必须使用指针参数。

上一句的理解方式:有参函数在没有被调用的情况下,其参数没有被实例化,可以允许其不指向任何对象,只要在其调用的时候为其实例化使其指向某个对象即可


引用参数的一个重要用法是,它允许我们在有效实现重载操作符的同事,还能保证用法的直观性。

看个实例,它使用了Matrix类类型。我们想支持两个Matrix对象的加法和赋值操作符,使他们的用法同内置类型一样“自然”:


   
     
     
   
  1. C语言基础教程12----C语言引用参数与指针参数

Matrix类对象的加法和赋值操作符用重载操作符来实现。

为重载操作符提供一个定义:


   
     
     
   
C语言基础教程12----C语言引用参数与指针参数

实参按值传递,效率很低。


为提高效率,假设我们将参数声明为指针。operator+()新的实现代码:


   
     
     
   
C语言基础教程12----C语言引用参数与指针参数
&a + &b;


但是这样比较难看,接口不友好。而且,在一个复合表达式中加三个对象变得很困难:


   
     
     
   

程序必须这样写:

&(&a + &b) + &c;

但是,引用参数提供了我们需要的方案。此时函数接收到的是实参的左值而不是值得拷贝。引用参数的实参是Matrix对象本身,这允许我们像对内置数据类型的对象一样自然地使用加法操作符。

operator+()实现代码:


   
     
     
   

它支持如下形式的Matrix对象的加法:

a + b + c;