【问题标题】:Convert a pointer to an array in C++在 C++ 中将指针转换为数组
【发布时间】:2009-08-20 22:13:46
【问题描述】:

CreateFileMapping 函数返回一个指向内存映射文件的指针,我想将该内存映射视为一个数组。

这就是我基本上想做的事情:

char Array[] = (char*) CreateFileMapping(...);

除了显然我不能简单地挥动手臂并声明指针现在是一个数组。

你们知道我该怎么做吗?我不想将指针指向的值复制到数组中,因为这会在大文件中占用太多内存。

非常感谢,

【问题讨论】:

    标签: c++ arrays pointers memory-mapping


    【解决方案1】:

    你不需要。您可以像索引数组一样索引指针:

    char* p = (char*)CreateFileMapping(...);
    p[123] = 'x';
    ...
    

    【讨论】:

    • 请注意,对数组和指针调用 sizeof() 将返回不同的值。指针将返回指针的大小,而不是数组。这意味着您将需要发送数组的大小,而不是执行数组长度技巧。您可以通过 char (*p)[] = ... 创建一个真正的指向数组的指针,然后使用 (*p)[123] = 'x'; 获取成员然后您仍然可以在不传递它的情况下获得大小。
    【解决方案2】:

    在 C/C++ 中,指针和数组不是一回事。

    但在你的情况下,为了你的目的,它们是。

    你有一个指针。

    你可以给它一个下标。

    例如一个 char* 指针指向“hello”的开头

    指针[0]是第一个字符'h'

    指针[1]是第二个字符'e'

    因此,只需将其视为您正在考虑的数组即可。

    【讨论】:

    • 对于语言来说,指针和数组是一回事。数组是指向系列中第一个对象的指针。
    • @dnh828,你错了。尝试在数组和“相同”类型的指针上使用sizeof。或者将一个数组分配给另一个数组。指向数组的指针也不同于指向指针的指针。以此类推。
    • 更具体地说,在 C/C++ 中,数组衰减指向在某些上下文中的指针。并非总是如此。
    • 点和数组在 C/C++ 中绝对不是一回事。仅仅因为数组能够衰减为指针并不能使它们相同。
    • 数组不同的原因是确切地编译器知道它有多大(或者至少在 D-1 维度上有多大)。跨度>
    【解决方案3】:

    “在 C/C++ 中,指针和数组不是一回事。”是的,但是,数组的变量名称与指针 const 相同(我记得这是来自我的旧科里奥利 C++ 黑皮书)。也就是说:

    char carray[5];
    char caarray2[5];
    char* const cpc = carray;    //can change contents pointed to, but not where it points
    
    /*
      cpc = carray2;    //NO!! compile error
      carray = carray2; //NO!! compile error - same issue, different error message
    */
    
    cpc[3] = 'a';  //OK of course, why not.
    

    希望这会有所帮助。

    【讨论】:

    • cpc[3] = 'a';会报错..是否可以让指针指向另一个地址..
    【解决方案4】:

    但是指针和数组有什么不同呢?怎么了

    char *Array = (char*)CreateFileMapping(...);

    从现在开始,您可以或多或少地像对待数组一样对待Array

    【讨论】:

    • 有区别。数组可以调用 sizeof(),但指针将返回指针的大小,而不是数组。因此,内存中目标数据块的长度不能从指向数组的指针中检索。不幸的是,如果没有所述数组的大小,就无法将指向数组的指针转换为真正的数组,但是您将不再需要对其进行转换...
    • @user1884803,是的,问题不是数组和指针之间有什么区别,而是在这种情况下会有什么区别。
    【解决方案5】:

    您可以使用 C 风格的演员表:

    char *p = (char*)CreateFileMapping(...);
    p[123] = 'x';
    

    或首选的重新解释演员表:

    char *p std::reinterpret_cast<char*>(CreateFileMapping(...));
    p[123] = 'x';
    

    【讨论】:

      【解决方案6】:

      我也在寻找这个答案。您需要做的是创建自己的数组类型。

          static const int TickerSize = 1000000;
          int TickerCount;
          typedef char TickerVectorDef[TickerSize];
      

      您还可以将指针转换为这种新类型。否则你会得到“编译器错误 C2440”。它必须是一个固定大小的数组。如果仅将其用作指针,则不会分配实际内存(指针本身的 4-8 字节除外)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 2012-11-21
        • 2013-03-08
        相关资源
        最近更新 更多