数据结构、算法与应用c++语言描述--1.2习题总结

之前一直都是使用c,最近恰好打算自学数据结构,就顺便把c++一起学了。当然,很多时候出了问题还是得找c++ primer 去自己看,毕竟c++的内容比较多。

 

习题1.2 编写一个函数count,返回值是数组a[0,n-1]的数值大小

思路1:获取数组大小在c中的解决方案是return sizeof(a)/sizeof(a[0])

实现1:这个题目看起来很容易实现 代码如下

template <class T>
int count(const T * num){
    return sizeof(num)/sizeof(num[0]);
}

问题1:使用实际函数调用发现,返回值并非数组的大小。调试发现,sizeof(num)在这里是指针num所占内存的大小,而非数组。

解决1:通过查阅c++primer page187:c++中传递参数有两种,一种叫做值传递,一种叫做引用传递。

值传递通过复制构造函数将实参的值拷贝到形参来实现的,这时对形参的改变不改变实参。

引用传递不会拷贝其值到形参,而是将形参作为实参的引用(别名),直接对实参进行读取,同时也节省来一部分计算时间。教材书上往往推荐我们使用引用传递来避免复制构造函数的拷贝操作,或者有些数据结构不支持拷贝,也只能通过引用传递的方式才能实现。

在我们的代码中使用的是值传递。所以num只是一个值和原数组相同的指针。

可见,数组在传给函数的时候会被退化成一个指向其首元素的指针。这时数组的一些特性就会丢失,造成了sizeof(a)的值不一样。

实现2:因此这里应该采用引用传递的方式实现 代码如下

template<class T>
int count(const T & num)
{
    return sizeof(num)/sizeof(num[0]);
}

 

小结:这个问题看似简单,但实际上关系到很多基础却又常常被搞错的知识。引用传递与值传递只是其中的一个,数组名与指针之间的差异也从而显现。

其实这个问题还有一些尚未解决,恰好我又在习题1-5中碰到了它,详细请看http://www.cnblogs.com/sleeploke/p/7614649.html

转载于:https://www.cnblogs.com/sleeploke/p/7612334.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值