2013-03-06 139 views
0

我想創建一個數組,產生隨機值,然後分配一個指向該數組的指針,以便在其他函數中使用它。指定一個數組的指針

問題1:這是正確的做法嗎?

問題2:當我運行下面的代碼時,我的指針函數生成的值與實際數組的值不一致。我究竟做錯了什麼?

int size = 100; 
int theray[size]; 
for(int i=0; i<size; i++) 
{ 
    theray[i] = (rand()%100); 
} 
//Output array 
cout<<"The array: "; 
for(int j=0; j<size; j++) 
{ 
    cout<<theray[j]<<" "; 
} 
cout<<endl; 

int (*parray)[100] = &theray; 
cout<<"The array pointer: "; 
for(int k=0; k<size; k++) 
{ 
    cout<<*parray[k]<<" "; 
} 
+1

通過「什麼你的意思,然後才能在其他使用它的指針分配給數組功能」?這味道不好 – 2013-03-06 07:21:32

+0

指針是[** EVIL **](http://www.parashift.com/c++-faq/defn-evil.html)! – 2013-03-06 07:26:33

+1

'int theray [size];'這是無效的C++; 'size'需要被聲明爲'const'才能工作。 – 2013-03-06 07:28:33

回答

3

問題1:這是正確的做法?

號正確的方法是使用std::vector<int>如果size在編譯時,和std::array<int, size>如果是是未知的。這裏不需要指針。

void foo(const std::vector<int>& v) 
{ 
    // do stuff with v 
} 

... 

std::vector<int> v(size); // vector with size elements 
// do something with v 

// pass v to a function 
foo(v); 

問題2:當我運行下面的代碼,我的指針函數生成與實際陣列的價值是什麼不一致的值。我究竟做錯了什麼?

如果你使用C++習慣用法,你甚至不會遇到這個問題,所以我認爲這個問題沒有意義。然而,在你的情況,你有運算符優先級的問題:是明確有關訪問[]前申請去參考*

cout<< (*parray)[k] << " "; 

如示例所示,您可以使用std::vector作爲一個固定大小數組,在運行時無需知道大小。請記住,施工後可以改變它的大小。

在你的榜樣,size不是編譯時間常數,所以你不能使用std::array。但是,如果您已將其聲明爲const int size = 100;,那麼它將被視爲編譯時間常量。

+1

@Dukeling:答案指出「編譯時間」,因爲它*表示*「編譯時間」。在C++中使用可變長度數組的唯一方法是'std :: vector'。 – 2013-03-06 07:24:40

+0

@JanHudec我可能對'std :: array'的工作方式有點不熟悉,但在我現在看到一個快速的Google搜索之後。 – Dukeling 2013-03-06 07:29:38

1

您的代碼有三種方式有點關閉。首先,不需要使用&列表。數組名稱已經引用了一個內存地址。您可以簡單地將指針指向列表。其次,你正在聲明一個100個指針的數組。根據你的描述,這聽起來像你只是想要一個指向數組的指針。你的聲明應該是int * parray而不是int * parray [100]。最後,一旦你有一個指向數組的指針,你可以像使用原始數組一樣訪問數組的元素,只需要使用指針的名稱而不是數組的名稱。試着改變的代碼的最後一塊(與指針聲明這個開始:

int *parray; 
parray = theray; 
cout<<"The array pointer: "; 
for(int k=0; k<size; k++) 
{ 
    cout<<parray[k]<<" "; 
} 
2

問題1

這是正確的做法

通常不是這取決於什麼?你正在努力實現。

對於高級語義,在大多數情況下,您會使用std::vector<int>或者如果大小是固定的並且您使用的是C++ 11,std::array<int, size>。如果你確實有下井指針的水平,你平時就這樣寫:

int *parray = theray; 
cout<<"The array pointer: "; 
for(int k=0; k<size; k++) 
{ 
    cout<<parray[k]<<" "; 
} 

這工作,因爲陣列將降級爲指針,並且[…]標上這些指針工作,就像他們上工作原始數組。

問題2

當我運行下面的代碼,我的指針函數生成的值與實際陣列的價值是什麼矛盾,我究竟做錯了什麼?當你打算用它作爲(*parray)[k]

*parray[k]被解釋爲*(parray[k])

+0

btw,'int size = 100; int theray [size];'不能傳入一些編譯器。應該使用'const'。 – shengy 2013-03-06 07:38:08

1

問題1:這是正確的做法嗎?

。對於大小可以動態變化(運行時)的數組,使用std::vector<>。優先避免指針和手動內存管理。

問題2:當我運行下面的代碼,我的指針函數生成與實際陣列的價值是什麼不一致的值。我究竟做錯了什麼?

首先,創建指針的事實,以便您可以將數組傳遞給函數。這不是必需的。這是我會怎麼用類從C++標準庫編寫程序(C++ 11):

#include <vector> 
#include <algorithm> 
#include <iostream> 
#include <iterator> 

// Sample function that prints the vectors's content 
void foo(std::vector<int> const& v) 
{ 
    copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " ")); 
} 

int main() 
{ 
    // Populate the vector... 
    size_t sz = 10; 
    std::vector<int> v(sz); 
    generate(begin(v), end(v), []() { return rand() % 100; }); 

    // Pass it to a function... 
    foo(v); 
}