2013-03-06 86 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); 
}