如何将 int* 转换或转换为 int[x]?
首先,我知道指针可以被索引。所以我知道我可以遍历指针和数组并手动转换指针。 (例如,带有
arr[i] = p[i]
的 for 循环)。我想知道是否可以用更少的代码行来实现相同的结果。
作为一个例子,我试图将指针
int* c = new int[x]
转换为数组 int b[2]
int a = 1;
int b[2] = { 2, 3 };
int* c = new int[b[1]];
c[0] = b[0];
c[1] = b[1];
c[2] = a;
我想看看什么值在哪里,所以我做了一个简单的程序来输出地址和值。输出如下:
Address of {type: int} &a = 0031FEF4; a = 1
Address of {type: int[2]} &b = 0031FEE4; b = 0031FEE4
Address of {type: int[2]} &b[0] = 0031FEE4; b[0] = 2
Address of {type: int[2]} &b[1] = 0031FEE8; b[1] = 3
Address of {type: int*} &c = 0031FED8; c = 008428C8
Address of {type: int*} &c[0] = 008428C8; c[0] = 2
Address of {type: int*} &c[2] = 008428D0; c[2] = 1
一旦我确定我知道我尝试了一些东西的地方。想到的第一个想法是获取指针分配的第二个元素的地址,然后用它替换数组的内存地址(参见下面的代码)。我所做的一切尝试最终都失败了,通常是语法错误。
这是我尝试过的。我真的希望它能工作,因为这将是最简单的解决方案。
b = &c[1];
这显然不起作用。
编辑:解决方案: 别这样! 如果必要创建一个指向数组的指针,然后指向该数组;对于我能理解的任何目的,这都是毫无意义的。 有关更多详细信息,请参阅下面 rodrigo 的回答。
首先
b
是数组,不是指针,所以不可赋值。
此外,您不能将任何内容强制转换为数组类型。但是,您可以强制转换为指向数组的指针。 请注意,在 C 和 C++ 中,指向数组的指针并不常见。使用普通指针或指向指针的指针并避免指向数组的指针几乎总是更好。
反正你问的都可以,或多或少:
int (*c)[2] = (int(*)[2])new int[2];
但是
typedef
会让事情变得更容易:
typedef int ai[2];
ai *c = (ai*)new int[2];
为了安全起见,删除应该使用原始类型完成:
delete [](int*)c;
如果你只是为了好玩,那很好。对于现实生活,通常最好使用
std::vector
.
虽然你不能重新分配一个数组标识符.. 有时你正在做的事情的精神允许你简单地创建一个引用并将自己伪装成一个数组。 注意: 这只是罗德里戈的答案的一个小扩展......仍然值得一提的是,无论任务是什么,可能都有更好的方法来完成。
#include <iostream>
int main() {
int x[1000] = {0};
for(int i = 0; i < 10; ++i) {
int (&sub_x)[100] = *(int(*)[100])(&x[i*100]);
//going right to left basically:
// 1. x[i*100] -- we take an element of x
// 2. &x[N] -- we take the address of the element
// 3. (int(*)[100]) -- we cast it to a pointer to int[100]
// 4. *(...) -- lastly we dereference the pointer to get an lvalue
// 5. int (&sub_x)[100] -- we create the reference `sub_x` of type int[100]
for(int j = 0; j < 100; ++j) {
sub_x[j] = (i*100)+j;
}
}
for(int i = 0; i < 1000; ++i) {
if(i != 0) {
std::cout << ", ";
}
std::cout << x[i];
}
std::cout << std::endl;
}
正如您所期望的那样,输出最终打印出 0-999,没有间隙
输出:
0, 1, 2, ..., 999