2012-05-03 71 views
1

我無法在myfunc()內創建對unsigned char數組z的引用。我嘗試了幾種方法,但無法弄清楚。這是我最近一次嘗試:C++對數組的引用

int myfunc (int &y, unsigned char (&z)[2]); 

int main(int argc, char *argv[]) { 
int y = 1; 
unsigned char z[2]; 

int x = myfunc(y, z[2]); 
} 

int myfunc(int &y, unsigned char (&z)[2]) { 
y = 123; 
z[0] = foo; 
z[1] = bar; 
return 456; 
} 

我收到以下錯誤:

error: in passing argument 2 of ‘int myfunc(int&, unsigned char (&)[2])’ 

對於線int myfunc (int &y, unsigned char (&z)[2]);

和:

error: invalid initialization of reference of type ‘unsigned char (&)[2]’ from expression of type ‘unsigned char’ 

對於線int x = myfunc(y, x);

我該如何引用它自己的數組(而不是引用數組?)?

+0

使用向量使得這非常簡單,而且比原始數組要好得多。無論如何,你通過傳入一個元素來調用你的函數。使用'z',而不是'z [2]'。 – chris

+0

我正在嘗試沿着這一邊學習矢量,這將如何讓這更容易?我能看到做這項工作的唯一方法是讓數組在全局範圍內定義,據我所知它並不好。 – jwbensley

+1

使用一個向量,你的簽名是:'int myfunc(int&y,std :: vector &z)'。它們提供了使用其他類型參數所期望的語法。 – chris

回答

10
myfunc(y, z[2]); 

表達z[2]unsigned char型的(並且是指超出陣列的端部的元件,所以它是未定義的行爲)。你想做的事:

myfunc(y, z); 
+0

感謝您的迅速反應:) – jwbensley

2

調用應該是:int x = myfunc(y, z);

這是因爲z表示unsigned char [2]z[2]代表鍵入char。另外z[2]訪問數組越界。

+1

感謝您也快速響應:) – jwbensley

1

我對你想要做的事有些困惑。恕我直言,你的簽名應該是int myfunc (int &y, unsigned char z[2])

的陣列不獲得通過「按值」(如果你想這樣做,那麼使用矢量是最簡單的方法),以及默認使你get_mac功能(我認爲應該是myfunc)工作根據需要(除非我誤解了你的願望)。

簽名int myfunc (int &y, unsigned char (&z)[2])建議,你可能要更改來電者的z本身的價值(不僅僅是z元素),但即使調用者不能做到這一點(!),你會得到如果你嘗試一個錯誤。如果你想要的話,使用一個實際的指針。

還有合法使用傳遞數組通過引用使用您的示例中的語法,這是執行聲明的數組大小。但是如果你只是在學習,我認爲你還不需要擔心。