将指针强制转换为Array(int * to int [2])

时间:2013-11-18 11:16:32

标签: c++ arrays pointers

如何将int *转换或转换为int [x]?

作为示例,我尝试将指针int* c = new int[x]强制转换为数组int b[2]

int b[2] = { 2, 3 };
int* c = new int[b[1]];

c[0] = b[0];
c[1] = b[1];
c[2] = a;

首先,我知道我可以遍历指针和数组。因此,将指针转换为具有[]运算符的数组,以索引指针和数组,在迭代时将指针元素分配给数组元素(例如arr[i] = p[i])。我想知道在更少的代码行中是否可以实现相同的结果。

我试图自己搞清楚,所以我做了一个快速的程序,以确保我确切地知道我想要放置什么和在哪里。输出如下:

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的答案。

3 个答案:

答案 0 :(得分:25)

首先,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

答案 1 :(得分:0)

首先强制转换为C样式数组的指针,这通常是非常糟糕的做法。

但是您可以将临时数组(“右值数组” )衰减到地址/指针。 就是这样写

created            |updated            |
-------------------|-------------------|
2018-11-12 16:00:22|2018-11-12 16:00:22|

尽管我再次强调:这样做时,您应该有充分的理由进行此类技巧。

上面列出的

P.S。代码仅对C99 / C11有效,对现代C ++编译器无效。

答案 2 :(得分:-1)

通过指针索引数组:

int* arr;
int x = arr[2];  // Pointers can be subscripted

请注意,这不是强制转换,但通常情况下,这是执行您真正需要的最简单方法。