数据结构、算法与应用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

posted @ 2017-09-29 18:43  sleep_loke  阅读(484)  评论(1编辑  收藏  举报