C++小知识:C/C++中不要按值传递数组

 更新时间:2019年01月16日 15:04:04   作者:修语讲编程  
今天小编就为大家分享一篇关于C++小知识:C/C++中不要按值传递数组,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

错误的代码:

ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) {
 memcpy( mat, src, sizeof( src ) );
}

说明:

有时候程序员会忘记 C/C++ 里数组不能按值传递给函数。当你试图这样做时,是数组的指针(第一个元素的地址)而不是整个数组被传递。我们还应该记住,方括号中的数字没有任何意义。它们仅仅是程序员所做的标志,记录了传递数组的『假定』大小。事实上,你也可以传递一个大小完全不同的数组。例如,下面的代码就会成功编译:

void F(int p[10]) { }
void G()
{
 int p[3];
 F(p);
}

相应的,sizeof(src) 运算符表示的不是数组的大小,而是指针的大小。结果就是memcpy() 仅复制了数组的一部分。也就是4或8字节,这取决于指针的大小(外部结构体不算)。

正确的代码:

这样的代码最简单的变形像这样:

ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) {
 memcpy(mat, src, sizeof(float) * 3 * 3);
}

建议:

有几种让你的代码更安全的方法。

数组大小已知。你可以在函数中使用数组的引用。但并不是每个人都知道可以这么做,知道如何编写这样的代码的人则更少。所以我希望这个例子是有趣并有用的:

ID_INLINE mat3_t::mat3_t( float (&src)[3][3] )
{
 memcpy( mat, src, sizeof( src ) );
}

现在就可以给函数传递大小正确的数组了,而且最重要的是,sizeof() 得到了数组的实际大小。

解决这个问题的另一个方法是使用std::array类。

数组大小未知。一些书的作者建议使用std::vector类,或者其他相似的类。然而实际中这样做并不总是很方便。

有时你想用一个简单的指针。在这种情况下,你应该向函数传递两个参数:一个指针和元素的数量。然而,总的来说这不是一个好做法,它会导致很多bug。

这种情况下,可以去读一下《C++核心指南》中的一些想法。我建议看《不要用一个单独的指针传递数组》章节。总而言之在你有空时读读《C++核心指南》总是有好处的。里面有很多有用的想法。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • C++深入讲解类与对象之OOP面向对象编程与封装

    C++深入讲解类与对象之OOP面向对象编程与封装

    学习过C语言的小伙伴知道:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题,接下来让我们详细的了解
    2022-05-05
  • opencv实现轮廓高斯滤波平滑

    opencv实现轮廓高斯滤波平滑

    这篇文章主要为大家详细介绍了opencv实现轮廓高斯滤波平滑,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C语言如何正确的终止正在运行的子线程

    C语言如何正确的终止正在运行的子线程

    这篇文章主要介绍了C语言如何正确的终止正在运行的子线程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • 使用Libmicrohttpd搭建内嵌(本地)服务器的方法

    使用Libmicrohttpd搭建内嵌(本地)服务器的方法

    下面小编就为大家带来一篇使用Libmicrohttpd搭建内嵌(本地)服务器的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • C语言实现扫雷游戏附注释

    C语言实现扫雷游戏附注释

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏附注释,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 解析C++编程中的选择结构和switch语句的用法

    解析C++编程中的选择结构和switch语句的用法

    这篇文章主要介绍了解析C++编程中的选择结构和switch语句的用法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++异常使用详解(看这一篇就够了)

    C++异常使用详解(看这一篇就够了)

    C++中的异常是指在程序执行过程中发生错误,导致程序无法正常运行的情况,下面这篇文章主要给大家介绍了关于C++异常使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • C语言链表与单链表详解

    C语言链表与单链表详解

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,本章带你详细了解链表与单链表
    2022-02-02
  • C++将二叉树转为双向链表及判断两个链表是否相交

    C++将二叉树转为双向链表及判断两个链表是否相交

    这篇文章主要介绍了C++将二叉树转为双向链表及判断两个链表是否相交的方法,文中还给出了求两个链表相交的第一个节点列的实现方法,需要的朋友可以参考下
    2016-02-02
  • 详解C++中typedef 和 #define 的区别

    详解C++中typedef 和 #define 的区别

    这篇文章主要介绍了C++中typedef 与 #define 的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论