2015-01-16 54 views
2

我想寫,要經過n指針數組float函數指出值的數組,並返回一個新創建的數組包含這些nfloat值。下面是代碼:傳遞指針數組,並返回由這些指針

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,結果如何受到影響?非常感謝!

+0

通過使用[順時針/螺旋規則](http://c-faq.com/decl/spiral.anderson.html),變量'b'是一個指向'float'的常量指針,這意味着指針是恆定的,你不能改變它。 –

+3

代碼無效,我認爲你的意思是'返回b;'。在這種情況下將'b'作爲'const'指針並沒有什麼區別,並且無論你是否這樣做,代碼都很糟糕。改爲使用'std :: vector '。 – Praetorian

+0

對不起,這是一個錯字。這是回報b; 。感謝您指出! – user3204065

回答

4

聲明b作爲

float* b = ...; 

將工作同樣在這裏。 const表示存儲在b(即指向float的數組的開頭)中的指針不能更改。

由於代碼不會試圖改變它(它會失敗,如果它嘗試),刪除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 
} 
2

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

float* const b; 

在你的情況下,如果你刪除了const,什麼都不會改變。

0

當你做一個變量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指向的數組應該是可讀/寫的(即非const),而不是隻讀的(即const)。


注:在現代C++中,它通常是更好地使用一些容器類,像std::vector,而不是用生new[]分配內存。
(對使用std::vector的優點是儲存在vector內存和資源自動釋放感謝矢量的析構函數)。

所以,除非這是一個學習的實驗代碼,或者你有充分的理由要使用new[],請考慮在現代C++中使用std::vector來動態分配數組。