我正在尝试创建一个生成随机值的数组,然后指定一个指向该数组的指针,以便在其他函数中使用它。
问题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]<<" ";
}
答案 0 :(得分:3)
问题1:这是正确的方法吗?
没有。如果在编译时 1 不知道std::vector<int>
,则使用size
,如果 2 ,则使用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] << " ";
1 如示例所示,您可以将std::vector
用作固定大小的数组,其中大小在运行时无需知道。请记住,在施工后可以改变它的尺寸。
2 在您的示例中,size
不是编译时常量,因此您无法使用std::array
。但是,如果您已将其声明为const int size = 100;
,那么它将被视为编译时常量。
答案 1 :(得分:2)
您的代码有三种方式。首先,不需要使用&amp; 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]<<" ";
}
答案 2 :(得分:2)
这是正确的方法吗?
通常不是。这取决于你想要达到的目标。
对于高级语义,您在大多数情况下使用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]<<" ";
}
这是有效的,因为数组会降级为指针,[…]
下标可以处理这些指针,就像它们在原始数组上工作一样。
当您打算将当我运行下面的代码时,我的指针函数生成的值与实际数组的值不一致,我做错了什么?
*parray[k]
用作*(parray[k])
时, (*parray)[k]
会被解释为{{1}}。
答案 3 :(得分: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);
}