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]<<" ";
}
4

4 回答 4

3

问题1:这是正确的方法吗?

不,正确的方法是使用std::vector<int>if sizeis not known at compile time 1std::array<int, size>if it is 2。这里不需要指针。

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] << " ";

1如示例所示,您可以将 anstd::vector用作固定大小的数组,其大小在运行时不需要知道。请记住,可以在施工后更改其尺寸。

2在您的示例中,size不是编译时间常数,因此您不能使用std::array. 但是,如果您已将其声明为,const int size = 100;那么它将被视为编译时间常数。

于 2013-03-06T07:20:33.030 回答
2

您的代码在三个方面有点偏离。首先,不需要使用&theray。数组名称已经引用了内存地址。您可以简单地将指针分配给theray。其次,您要声明一个包含 100 个指针的数组。根据您的描述,听起来您只需要一个指向数组的指针。您的声明应该只是 int *parray 而不是 int *parray [100]。最后,一旦有了指向数组的指针,就可以像访问原始数组一样访问数组元素,只是使用指针的名称,而不是数组的名称。尝试更改您的最后一个代码块(从指针声明开始:

int *parray;
parray = theray;
cout<<"The array pointer: ";
for(int k=0; k<size; k++)
{
    cout<<parray[k]<<" ";
}
于 2013-03-06T07:32:46.600 回答
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].

于 2013-03-06T07:33:20.207 回答
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);
}
于 2013-03-06T07:35:45.930 回答