2010-03-01 31 views
1

我有這段代碼,但它不會編譯,我不明白什麼是錯的 - 我猜矢量的指針是不正確的。 我的想法是在main()中收集一些數字並將它們存儲在向量和數組中,然後將它們的內存地址傳遞給函數,並使用指針來打印存儲的數據。錯誤在函數中使用向量指針

我想出了這個,當我讀了一些關於指示我說應該使用它們以節省內存的東西,所以IMO下面的代碼將不會複製向量和數組的內容,但使用訪問指針他們在記憶中的位置 - 這就是我想要做的。

#include <iostream> 
#include <vector> 
using namespace std; 

void function(vector<int>* a, int *s) 
{ 
    cout << "function starts.." << endl; 
    for(int i=0;i<a->size();i++) 
    { 
     cout << a[i] << endl; 
     cout << s[a[i]] << endl; 
    } 
    cout << "function ends..." << endl; 
} 


int main(void) 
{ 
    vector<int> m; 
    int s[102]; 
    for(int i=0;i<10;i++) 
    { 
     m.push_back(i*i); 
     s[i*i] = i-2; 
    } 
    function(&m, &s); 
    return 0; 
} 

我在編譯時收到幾個錯誤,有些錯誤。

請告訴我我的代碼有什麼問題,以及如何解決它。謝謝...

+1

猜猜你遇到的編譯錯誤是否是你的問題的一部分? ;-) – 2010-03-01 12:09:01

+1

我已經教了C和C++編程多年,所以我很善於猜測,因爲通常的問題描述是「不起作用」。我從eBay購買的水晶球也有幫助。 – Tronic 2010-03-01 12:16:47

回答

5

您應該通過矢量參考,而不是指針:

void function(vector<int>& a, int *s) 

然後

function(m, ...); 

上的指針,向量使用[]肯定會導致奇怪問題,因爲它的行爲就像一個指向std :: vectors的數組(雖然它實際上只指向一個)。載體本身從來沒有被索引。您也可以使用(*a)[...]通過指針索引向量。

+1

請確保當您進行上述更改以進行如下調用:'function(m,s);' – 2010-03-01 12:17:54

+0

Downvoting,因爲這是危險的建議 - 很多編碼標準建議不要傳入非const引用,並且有很好的理由爲了那個原因。至少,矢量引用應該是const。但是這個答案也沒有解決真正的問題,這就是指針在被使用之前需要被解除引用。用(* a)[i]代替[i]就足夠了,可能對試圖理解這個問題的讀者更有幫助。 – 2016-04-05 14:19:45

2

如果在解析由堅持指針然後正確的語法shoulld是:

void function(vector<int>* a, int *s[]) 
{ 
    cout << "function starts.." << endl; 
    for(int i=0;i<a->size();i++) 
    { 
     cout << (*a)[i] << endl; 
     cout << (*s)[(*a)[i]] << endl; 
    } 
    cout << "function ends..." << endl; 
} 
+0

錯誤:無法將int(*)[102]'轉換爲'int **' 這不起作用。 – VaioIsBorn 2010-03-01 12:25:51

+0

抱歉,請閱讀下面的AndreyT評論。但是請調用函數(m,s)並通過引用來解析。 – 2010-03-01 13:13:47

1

(校正)

&s實際上int(*)[102]:指針的指針102項的數組。

你應該只說

function(&m, s); 

這是因爲舊的C遺留的規則,數組本質上是一個常量指針與索引0項所以s已經int*

+1

'&s'是* not *'int **'。 '&s'是'int(*)[102]'。數組不是一個常量指針。在價值上下文中,它可能會出現這種情況,但在這種情況下,不會在發生地址時出現。 – AnT 2010-03-01 12:22:39

+0

是的,確實如此。無論如何,'&s'不是一個'int *',它已經足以將's'作爲參數。 – Vlad 2010-03-01 13:36:10

0

這個版本的作品:

#include <iostream> 
#include <vector> 
using namespace std; 

void function(const vector<int>& a, int s [102]) 
{ 
    cout << "function starts.." << endl; 
    for(int i=0;i<(int)a.size();i++) 
    { 
     cout << a [i] << endl; 
     cout << s[a [i]] << endl; 
    } 
    cout << "function ends..." << endl; 
} 


int main(void) 
{ 
    vector<int> m; 
    int s[102]; 
    for(int i=0;i<10;i++) 
    { 
     m.push_back(i*i); 
     s[i*i] = i-2; 
    } 
    function(m, s); 
    return 0; 
} 
+0

不錯,它的作品。但是,正如我所看到的,s不是作爲指針傳遞的 - 爲什麼?我也想在函數中傳遞一個指向s的指針,所以我不會將整個數組傳遞給函數 - 有沒有辦法做到這一點? – VaioIsBorn 2010-03-01 12:55:21

+0

按價值傳遞整個數組並不是很好的做法。我會使用 「void函數(常量矢量&一個,INT * S)」 並調用它作爲 「功能(M,S);」 – 2010-03-01 13:01:03

+0

@VaiolsBorn:它作爲一個指針傳遞 - 你不能通過C++中的值傳遞一個數組。參數中的int s [102]'完全等同於'int s []'(大小被忽略)和'int * s'(數組衰減到指針)。 – visitor 2010-03-01 13:01:45

1

首先在主程序中是一個指向int的指針,而m是一個向量。因此函數調用應該如下:

函數(& m,s);其次在函數a中是一個指向矢量的指針,所以應該按如下索引:(* a)[i]。

但是你確實應該使用常量引用傳遞在你的載體:

void函數(常量向量&一,詮釋* S){ .. COUT < < A [1] < < ENDL ; .. }

並調用它喜歡:

功能(M,S);