在C++中为数组分配指针
Assigning pointers to arrays in C++
我想做下面这样的事情:
int main() {
int a[10];
int *d = generateArrayOfSize(10) // This generates an array of size 10 on the heap
a = d;
print(a); // Prints the first 10 elements of array.
}
然而,上面的代码给出了编译错误(在"int*"到"int[10]"的赋值中存在不兼容的类型)。我该怎么做才能使上述代码正常工作?
数组是不可赋值和不可复制的,因此您必须手动(在循环中)或使用std::copy
复制每个元素。
如果使用C++,请使用C++数组,而不是C风格的数组和指针。这里有一个的例子
#include <array>
#include <iostream>
template<size_t N>
std::array<int, N> generateArrayOfSize(void)
{
std::array<int, N> a;
for (int n=0; n<N; ++n)
a[n] = n;
return a;
}
template<size_t N>
void print(std::array<int, N> const &a)
{
for (auto num : a)
std::cout << num << " ";
}
int main() {
std::array<int, 10> a;
std::array<int, 10> d = generateArrayOfSize<10>();
a = d;
print(a); // Prints the first 10 elements of array.
}
其输出0 1 2 3 4 5 6 7 8 9
数组不是指针
你不能做:
int a[10];
int *d;
a = d;
更改为:
int *a;
int *d;
a = d;
C编程中数组和指针之间的主要区别:
Pointer | Array
-------------------------------------------|-------------------------------------------
A pointer is a place in memory that keeps | An array is a single, pre allocated chunk
address of another place inside | of contiguous elements (all of the same
| type), fixed in size and location.
-------------------------------------------|-------------------------------------------
A pointer can point to a dynamically | They are static in nature. Once memory is
allocated memory. In this case, the memory | allocated , it cannot be resized or freed
allocation can be resized or freed later. | dynamically.
-------------------------------------------|-------------------------------------------
你在这里有一个很好的解释:https://stackoverflow.com/a/7725410/1394283
数组是而不是指针(尽管数组的名称通常会衰减为指向其第一个元素的指针)。
要使上面的代码工作,可以将a
声明为指针:int *a;
。print
函数无论如何都采用int*
(或衰减的数组)。
如果您真的想拥有两个数组并将内容从一个数组复制到另一个数组,那么应该在循环中复制数据。
当您将字符串引用分配给指针时,必须使用*ptr来打印指针的值,否则在您的情况下,print(d)类似于cout<在c++中,它将只打印d[0]的位置。
int ary[5]={1,2,3,4,5};
int *d;
d=ary;
for(int i=0;i<5;i++)
cout<<*(d+i);
因为数组名称是不可修改的。所以你不能做
a = d;
将其声明为如下指针:
int *a;
我的C++有点生疏,但试试这样的东西。
int main() {
int *a;
int *d = generateArrayOfSize(10) // This generates an array of size 10 on the heap
a = d;
print(a); // Prints the first 10 elements of array.
}
在C中,当Thing X[10]时总是这样;被声明,X是第一个元素的常量地址(即&X[0])。所以你可以说:
事物*Y=X;//等价于(Thing*Y=&X[0];)
但是在C++中;记得";Thing数组X有10个元素,并且一些C++强加的类型检查规则被破坏。想象一下,我们添加了Thing Z[20];讨论。
事物*Y=X;以及Thing*Y=Z;如果两者都允许,则意味着可以将单个变量设置为长度为10和20的Thing数组,这两个数组非常不同(啊哼)";事物";,快速查看2D阵列就会发现。这证明了为什么C语言假定等价于X和&X[0]在C++中已损坏。
至少对于某些版本的C++来说是这样。所以最好不要想当然,使用事情*Y=&x[0];而Thing*Y=&而不是Z[0];
这种方法有两个优点。它执行所需的操作,并且实际进行编译。:-)
- 通过双指针分配指针
- 在不工作的情况下为数组分配指针,但反过来也可以
- 无法使用"std::make_shared"分配指针
- 分配指针时出现分段错误
- 为什么有时仅使用Ampersand运算符在C 中分配指针
- 重新分配指针阵列的一部分的安全方法
- 为什么在执行增量操作之前分配指针值
- 当指针指向的对象被另一个类的实例删除时,重新分配指针
- 在堆上分配指针的原因是什么?
- 有没有办法防止分配指针?
- 将运算符重写应用于具有动态分配指针的类
- 在堆上分配指针数组
- 在另一个结构中的结构内解除分配指针
- 分配指针后,是否可以为指针指向的事物分配变量名称?
- 重新分配指针后,将类功能与指针一起使用
- 为什么我的新分配指针会自动在程序退出上删除
- 分配指针的方法之间有什么区别?
- 如何声明和分配指针
- 内存分配(指针和堆栈)
- 通过参数分配指针的值