【问题标题】:Pointer Pointer Methods C++指针指针方法 C++
【发布时间】:2008-11-26 00:50:35
【问题描述】:

我有两个问题:

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

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

2) 如果我想返回一个指向数组的指针,该数组指向对象(如 (1)),我该如何在方法中执行此操作?即)我想暗示该方法:

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

感谢您的帮助!

【问题讨论】:

  • 你的问题真的是C题。如果您想真正编写 C++,只需为您的数组使用 std::vector 类。这是 21 世纪。

标签: c++ pointers methods


【解决方案1】:

我怎样才能使一个数组指向 对象?

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

如果我想返回一个指向 数组,它指向对象(如 (1)) 我怎样才能在方法中做到这一点?

从技术上讲,你编写了这个函数:

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

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

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

这样,您现在可以随意访问项目,例如getStuff()[0] = &someInteger;

【讨论】:

  • 已投票,但请记住不要返回指向函数返回后无法保证存在的事物的指针(即,存在于堆栈上的本地对象)。
【解决方案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,等等。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 已投票,但请记住不要返回指向函数返回后无法保证存在的事物的指针(即,存在于堆栈上的本地对象)。
    【解决方案4】:
    int **myName;
    
    int **getStuff() {
      int **array = new int*[5];
    
      for (int i = 0; i < 5; i++)
      {
        int key = i;
        array[i] = &key;
      }
    
      return array;
    }
    

    【讨论】:

    • 已投票,但请记住不要返回指向函数返回后无法保证存在的事物的指针(即,存在于堆栈上的本地对象)。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多