欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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字節(jié),這取決于指針的大?。ㄍ獠拷Y構體不算)。

正確的代碼:

這樣的代碼最簡單的變形像這樣:

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++核心指南》中的一些想法。我建議看《不要用一個單獨的指針傳遞數組》章節(jié)??偠灾谀阌锌諘r讀讀《C++核心指南》總是有好處的。里面有很多有用的想法。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

相關文章

  • 解決 VSCode 編寫 C++11 代碼報紅問題分析

    解決 VSCode 編寫 C++11 代碼報紅問題分析

    今天在寫 C++ 代碼的時候用上 C++11 的特性,然后發(fā)現 VSCode 雖然可以編譯通過,但是會在相應位置報紅,這是怎么回事呢?下面小編給大家?guī)砹私鉀Q方法,一起看看吧
    2021-09-09
  • C/C++ 運用Npcap發(fā)送UDP數據包的完美過程

    C/C++ 運用Npcap發(fā)送UDP數據包的完美過程

    UDP 是一種無連接、輕量級的傳輸層協議,與 TCP 相比,它不提供可靠性、流控制和錯誤恢復機制,但卻更加簡單且具有較低的開銷,這篇文章主要介紹了C/C++ 運用Npcap發(fā)送UDP數據包,需要的朋友可以參考下
    2023-11-11
  • C++強制類型轉換(static_cast、dynamic_cast、const_cast、reinterpret_cast)

    C++強制類型轉換(static_cast、dynamic_cast、const_cast、reinterpret_ca

    本文主要介紹了C++強制類型轉換,主要介紹了static_cast、dynamic_cast、const_cast、reinterpret_cast的4種方法,感興趣的可以了解一下
    2021-08-08
  • C語言運算符與表達式

    C語言運算符與表達式

    這篇文章主要介紹了C語言運算符與表達式,表達式是C語言的主體。在C語言中,表達式由操作符和操作數組成,更多相關介紹需要的小伙伴可以參考下面文章內容
    2022-07-07
  • C語言?struct結構體超詳細講解

    C語言?struct結構體超詳細講解

    C語言中,結構體類型屬于一種構造類型(其他的構造類型還有:數組類型,聯合類型),下面這篇文章主要給大家介紹了關于C語言結構體(struct)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • 簡單總結C++中的修飾符類型

    簡單總結C++中的修飾符類型

    這篇文章主要介紹了C++中的修飾符類型總結,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2016-05-05
  • C++98/11/17表達式類別(小結)

    C++98/11/17表達式類別(小結)

    這篇文章主要介紹了C++98/11/17表達式類別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • C++中的偽隨機數

    C++中的偽隨機數

    這篇文章主要介紹了C++中的偽隨機數,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++如何切割String對象的方法

    C++如何切割String對象的方法

    C++相較于Java,Python 并沒有提供的字符串分割的函數split,因此需要自己進行編寫,本文主要介紹了C++如何切割String對象的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C語言數據結構中二分查找遞歸非遞歸實現并分析

    C語言數據結構中二分查找遞歸非遞歸實現并分析

    這篇文章主要介紹了C語言數據結構中二分查找遞歸非遞歸實現并分析的相關資料,需要的朋友可以參考下
    2017-03-03

最新評論