繁体   English   中英

指针指针方法C ++

[英]Pointer Pointer Methods C++

我有两个问题:

1)我如何制作一个指向整数对象的数组?

int* myName[5];  // is this correct?

2)如果我想返回一个指向数组的指针,该指针指向对象(如(1)),该如何在方法中做到这一点? 即)我想暗示的方法:

int **getStuff() {
// what goes here?
return *(myName); // im pretty sure this is not correct
}

谢谢您的帮助!

如何制作一个指向对象的数组?

int * myName[5]; /* correct */

如果我想返回一个指向数组的指针,该数组指向对象(如(1)),该如何在方法中做到这一点?

从技术上讲,您可以编写以下函数:

int * (* getStuff() )[5] {
    return &myName;
}

这将返回一个指向该数组的指针。 但是,您不想这样做。 您想返回一个指向数组第一个元素的指针

int ** getStuff() {
    return myName; /* or return &myName[0]; */
}

这样,您现在可以像getStuff()[0] = &someInteger;一样getStuff()[0] = &someInteger;访问项目getStuff()[0] = &someInteger;

请注意,您的代码

int* myName[5];

声明一个包含5个值的数组,每个值都是您所要求的“指向int的指针”。

但是,这就是C ++,仅此而已。 作为Python脚本编写者,这可能会给您带来一些惊喜。

它不会为这5个指针提供任何明智的值,也不会为它们指向创建任何整数。

如果将其放在函数主体中,则它将在堆栈上创建数组。 这意味着当当前作用域结束时,该数组将不复存在(简单地说,这意味着您到达封闭的封闭状态,因此例如return即可)。 因此,特别是以下代码是错误的:

int **myFunction() {
    int *myArray[5];
    return myArray;
} // <-- end of scope, and return takes us out of it

它可能会编译,但是函数会返回一个指针,该指针指向的是调用者看到该对象时不再存在的对象。 这导致了我们所谓的“不确定行为”。

如果要让数组存在于其创建的函数之外,则可以在每次调用函数时在堆上创建一个数组,然后返回一个指针,如下所示:

int **myFunction() {
    int **myArray = new int[5];
    return myArray;
}

每次调用该函数都会返回一个不同的数组。 调用者完成操作后,应销毁该数组,如下所示:

delete[] myArray;

否则,它将永远不会被释放,并且将永远占用内存(或在大多数操作系统上退出程序时)。

另外,您可以使用关键字“静态”创建一个具有“全局存储持续时间”的数组(这意味着它在程序运行时就存在,但是只有一个,而不是每次都有一个)。 这意味着函数每次被调用时都会返回相同的数组。 调用者可以在其中存储一些指针,不用理会,再次调用该函数,然后看到仍然存在相同的指针:

int **myFunction() {
    static int *myArray[5];
    return myArray;
}

请注意,此代码与之前的非常糟糕的代码有多相似。

最后,如果您只想创建一个整数数组,而不是一个指向整数的指针数组,则可以执行以下操作:

int myArray[5] = { 1, 2, 3, 4, 5};

实际上创建了5个整数(意味着,它分配了可以存储整数值的空间。这不同于指针数组,后者存储用于存储整数值的空间的地址)。

它还将指定的值存储在该空间中:myArray [0]现在为1,myArray [1]为2,依此类推。

1)正确-这是5个指向int的指针的数组

2)可以将指针返回指针数组来int通过指针返回到该阵列的第一个元素秒。 这具有两个间接级别,因此您需要两个星号。 您也可以正常返回数组,因为数组会自动衰减为指向其第一个元素的指针。

int **getStuff() {
    return myName;       // 1
    return &myName[0];   // 2
}
int **myName;

int **getStuff() {
  int **array = new int*[5];

  for (int i = 0; i < 5; i++)
  {
    int key = i;
    array[i] = &key;
  }

  return array;
}

这将返回可测试和可删除的堆数组指针(而不是指向其元素的指针)。 没有泄漏。

template <class T>
T* newarray(int len)
    {
        T *a;
        try
           {
               a = new T[len];
               memset(a,0,len*sizeof(T));
               return a;
           }
        catch (...)         
           {return 0;}
    }   

void foo()
    {
        float *f=0;
        f=newarray<float>(1000000);
        if(!f) return;
        //use f
        delete [] f;
    }

史蒂夫·杰索普(Steve Jessop),我想你的意思是:

int **myFunction() {
    int **myArray = new int*[5];
    return myArray;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM