【问题标题】:Assigning values to all the elements of a dynamically allocated pointer array?为动态分配的指针数组的所有元素赋值?
【发布时间】:2019-04-22 15:08:52
【问题描述】:

我有一个包含两个元素的指针数组 (ptrArr1)。我希望动态分配指针数组。我可以很好地为指针数组的第一个元素分配地址,但我不知道如何为指针数组的第二个元素分配地址。我不希望使用任何 STL 或其他预编码函数。我正在做这个练习来增强我对指针的理解。谢谢。

int main()
{
    int one = 1;
    int two = 2;
    int *ptrArr1 = new int[2];
    ptrArr1 = &one;
    ptrArr1[1] = &two;  //does not work
    ptrArr1 + 1 = &two; // does not work


    delete[]ptrArr1;
    return 0;

}

【问题讨论】:

  • 当您执行ptrArr1 = &one 时,它类似于执行one = two 并期望one 的值仍然是1
  • 此外,ptrArr[x]int 而不是 int*(例如 &one 是)。
  • ptrArr[1] = &two; 尝试将地址 (int*) 分配给 int -> 类型不匹配。 ptrArr1 + 1 = &two; 不是类型不匹配,而是尝试将地址分配给非左值。强烈简化,这和1 = 0;一样错误。
  • 还有int *ptrArr1 = new int[2];ptrArr1 = &one; 之后覆盖ptrArr1。这有点像写foo = 2; foo = 42;

标签: c++ arrays pointers dynamic-memory-allocation


【解决方案1】:

整数数组和指向int 的指针数组是有区别的。在您的情况下,ptrArr1 是一个指向整数数组的指针,其中包含两个整数的空间。因此,您只能将int 分配给ptrArr1[1] = 2,但不能分配地址。比较

int xs[] = { 1, 2, 3 };    // an array of integers

int y0 = 42;
int *ys[] = { &y0, &y0 };  // an array of pointers to integers

现在您还可以拥有指向xs 的第一个元素的指针。 ys:

int *ptr_xs = &xs[0];
int **ptr_ys = &ys[0];

// which can be simplified to:
int *ptr_xs = xs;
int **ptr_ys = ys;

对于简化步骤,您应该查看What is array decaying?

【讨论】:

    【解决方案2】:

    你有一个 int 数组,而不是一个指针数组。您可以使用

    创建一个指针数组
    int **ptrArr1 = new int*[2];
    

    然后将指针分配给数组中的每个指针:

    ptrArr1[0] = &one;
    ptrArr1[1] = &two;
    

    【讨论】:

    • 谢谢eozd! '**' 的使用对我来说是全新的,但它可以让我做我想做的事情。
    • @CarlosRobinAlvarenga 如果 eozd 回答了您的问题(恕我直言,她/他回答了),请不要忘记accept
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2012-09-16
    • 1970-01-01
    • 2015-09-14
    • 2013-05-26
    相关资源
    最近更新 更多