簡體   English   中英

傳遞指針數組並返回這些指針指向的值數組

[英]Passing an array of pointers and return an array of values pointed by those pointers

我想編寫一個函數,該函數將n指針的數組傳遞給float並返回包含這些n float值的新創建的數組。 這是代碼:

float* duplicate(float* p[], int n){
    float* const b = new float[n];
    for (int i = 0; i < n; i++)
        b[i] = *p[i];
    return b;
}

我的問題是,為什么我們要聲明bconst 如果我刪除const ,結果將如何受到影響? 非常感謝!

b聲明為

float* b = ...;

在這里將同樣有效。 const表示不能更改b存儲的指針(指向float s數組的開頭)。

由於代碼不會嘗試對其進行任何更改(如果嘗試則將無法編譯),因此刪除const不會有任何區別。

const是一種安全機制。 程序員問編譯器“告訴我,如果我嘗試對此變量做一些愚蠢的事情”。 通常,除非您確實知道需要更改它們,否則默認情況下將其設置為const是個好主意。 這意味着您不會無意間分配給您本來不是想要的東西,從而使您可能難以找到錯誤。

(可能還會有一個爭論,認為編譯器使用const有更多的優化機會。也許在某些情況下是正確的,但是在這里它並不重要。在這種情況下,安全是主要考慮因素。)

但是在這種情況下,無論如何,所有手動內存管理和使用指針的麻煩總會帶來麻煩,因此最好使用可以為您完成所有工作的庫組件,例如std::vector

編輯:只是為了完整性,這是使用std::vector的版本:

std::vector<float> duplicate(float* f[], std::size_t n)
{
    std::vector<float> copyOfF;
    copyOfF.reserve(n); // save enough space; not essential
    std::transform(f, // front of f
                   f+n, // back of f
                   std::back_inserter(copyOfF), // push them into the vector
                   [](float* f){return *f;} ); // deref the pointers
    return copyOfF; // will steal the internal array
}

constfloat* const b意味着指針不能被改變。 例如,這將無法編譯:

float* const b;

在您的情況下,如果刪除const,則什么都不會改變。

當您使變量const ,您不能在初始化后更改其值。

因此,當您編寫:

 float* const b = new float[n]; 

您告訴編譯器b的內容在下一行代碼中不會更改。 並且,如果由於某些原因(例如通過重新分配b變量)對其進行了更改,則會收到編譯器錯誤。

您可以將const視為“只讀” ,即b的值(這是new[]調用返回的地址) 不能在以下代碼行中更改。

請注意,您可以更改new[]分配的數組內容 實際上,在編寫代碼時, const僅適用於b的值(即new[]返回的內存地址),而不適用於b 指向的數組的內容。

請注意,相反,如果您編寫如下代碼:

const float* b = ...

然后,這是完全不同的。 實際上,在這種情況下,您可以更改b的值,例如,可以將b重新分配為指向其他對象, 不能更改b指向的數組內容

您還可以結合兩個const的作用,例如

const float * const b = ...

在這種情況下, 可以改變任一個值b (即不能重新分配b )或所述陣列的內容通過指向b

當然,在您的情況下,由於您要將某些內容寫入分配給new[]的數組中,因此僅將const用作b (指針)的值,而不是所指向的數組是有意義的。 換句話說, b指向的數組應該是讀/寫(即non- const ),而不是只讀(即const )。


注意:在現代C ++中,通常最好使用一些容器類 ,例如std::vector ,而不要使用raw new[]分配內存。
(使用std::vector的優點之一是,由於vector的析構函數,存儲在vector中的內存和資源會自動釋放。)

因此,除非這是一個學習型實驗代碼,否則您有充分的理由要使用new[] ,請考慮對現代C ++中的動態分配數組使用std::vector

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM