将指针转换为数组(int* 到 int[2]) - 从指针转换为数组? [重复]

问题描述 投票:0回答:2

如何将 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];

这显然不起作用。

c++ arrays pointers
2个回答
48
投票

首先

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


2
投票

虽然您无法重新分配数组标识符..有时您所做的事情的精神允许您简单地创建一个引用并将自己伪装成一个数组。 注意:这只是罗德里戈答案的轻微扩展......仍然值得一提的是,可能有更好的方法来完成任何任务。

#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
© www.soinside.com 2019 - 2024. All rights reserved.