将指针分配给数组
Assign a pointer to an array
我正在尝试创建一个生成随机值的数组,然后为该数组分配一个指针,以便在其他函数中使用它。
问题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:这是正确的方法吗?
没有。正确的方法是,如果size
在编译时1未知,则使用std::vector<int>
;如果std::array<int, size>
在编译时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如示例所示,可以使用std::vector
作为固定大小的数组,其中大小在运行时不需要知道。请记住,施工后可以更改其尺寸。
2在您的示例中,size
不是编译时常数,因此不能使用std::array
。但是,如果您将它声明为const int size = 100;
,那么它将被视为编译时常数。
您的代码在三个方面有点偏离。首先,没有必要使用&治疗。数组名称已引用内存地址。您可以简单地将指针分配给治疗。其次,您要声明一个由100个指针组成的数组。根据您的描述,听起来您只需要一个指向数组的指针。您的声明应该只是int*parray,而不是int*parray[100]。最后,一旦有了指向数组的指针,就可以像访问原始数组一样访问数组的元素,只需使用指针的名称,而不是数组的名称。尝试更改您的最后一块代码(从指向以下内容的指针声明开始:
int *parray;
parray = theray;
cout<<"The array pointer: ";
for(int k=0; k<size; k++)
{
cout<<parray[k]<<" ";
}
问题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]
。
问题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);
}
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 如何通过 malloc 为队列数组分配内存?
- 具有动态数组分配的OpenMP嵌套循环
- 如何为数组结构的数组分配内存
- 如何为结构数组分配内存?
- cpp 数组 - 分配常量索引有效,而非常量索引不起作用
- 如何为字符指针数组分配内存?
- 在 C++ 中初始化后的数组分配
- 将数据分配给了数组分配,但程序显示了以缓冲区超支的输出
- C++函数问题中的数组分配
- 子数组分配:使用聚合对象错误的预期"{...}"进行初始化
- 为什么我的指针数组分配不起作用
- std::堆栈和堆栈溢出错误的数组分配
- 在 c++ 中是否有通过声明"implicit"数组分配?
- 在 c++ 中为 2-D "Dynamically Created"数组分配值时遇到问题
- 如何为C++数组分配指向第一个元素的指针
- 字符数组分配
- 将数组分配在固定数量的线程之间
- 为构造函数中的数组分配值