0

我有两个问题:

1)如何创建一个指向整数对象的数组?

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

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

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

谢谢您的帮助!

4

6 回答 6

5

如何创建一个指向对象的数组?

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

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

从技术上讲,您编写此函数:

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

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

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

这样,您现在可以随心所欲地访问项目getStuff()[0] = &someInteger;

于 2008-11-26T00:55:05.760 回答
2

请注意,您的代码,

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,等等。

于 2008-11-26T02:44:19.097 回答
1

1) 正确 - 这是一个由 5 个指向ints的指针组成的数组

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

int **getStuff() {
    return myName;       // 1
    return &myName[0];   // 2
}
于 2008-11-26T00:55:27.833 回答
1
int **myName;

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

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

  return array;
}
于 2008-11-26T00:57:47.113 回答
0

史蒂夫杰索普,我想你的意思是:

int **myFunction() {
    int **myArray = new int*[5];
    return myArray;
}
于 2008-11-26T14:55:36.127 回答
0

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

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;
    }
于 2012-08-06T20:28:01.340 回答