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

Jos*_*h C 22 c++ arrays pointers

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

作为一个例子,我试图将指针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;
Run Code Online (Sandbox Code Playgroud)

首先,我知道我可以遍历指针和数组.因此,将指针转换为具有[]运算符的数组,以索引指针和数组,在迭代时将指针元素分配给数组元素(例如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
Run Code Online (Sandbox Code Playgroud)

一旦我确定我知道我在尝试一些事情的地方.想到的第一个想法是将第二个元素的地址放到指针的分配中,然后用它替换数组的内存地址(参见下面的代码).我尝试的所有内容最终都失败了,通常会出现语法错误.

这是我试过的.我真的希望这个工作,因为它是最简单的解决方案.

b = &c[1];
Run Code Online (Sandbox Code Playgroud)

这显然不起作用.

编辑:解决方案: 不要这样做! 如果有必要创建一个指向数组的指针然后指向该数组; 对于我可以理解的任何目的,这都是毫无意义的.有关更多详细信息,请参阅下面的rodrigo的答案.

rod*_*igo 27

首先b是一个数组,而不是指针,因此它不可分配.

此外,您不能将任何内容转换为数组类型.但是,您可以转换为指向数组的指针.请注意,在C和C++中,指向数组的指针并不常见.使用普通指针或指针指针并避免指向数组的指针几乎总是更好.

无论如何,你要求的可以或多或少地完成:

int (*c)[2] = (int(*)[2])new int[2];
Run Code Online (Sandbox Code Playgroud)

但是一个typedef会让它更容易:

typedef int ai[2];
ai *c = (ai*)new int[2];
Run Code Online (Sandbox Code Playgroud)

为安全起见,删除应使用原始类型完成:

delete [](int*)c;
Run Code Online (Sandbox Code Playgroud)

如果你只是为了好玩,那就太好了.对于现实生活,通常使用起来更好std::vector.

  • 实际上C方式是按原样使用指针:记住你可以下标指针就好了.除了可能在多维数组中,转换为指向数组的指针几乎是无用的.我的意思是,您可以将`int*`视为指向单个整数,或指向整数数组的第一个. (5认同)
  • C++ 中这种未定义的行为。`int*` 和 `int(*)[2]` 是两种不同的指针类型。您实际上是在从一种类型到另一种类型执行非法的“reinterpret_case”,并且违反了 _strict 别名规则_。 (3认同)