【问题标题】:C++ filling arrays by pointersC++ 通过指针填充数组
【发布时间】:2016-08-06 16:27:38
【问题描述】:

在创建用户输入的大小字符串数组时遇到问题。我得到了用户输入的数组大小,但是我不能将此值传递给另一个函数来创建字符串数组。关于我在这里做错了什么的任何解释?我通过引用将用户输入的值传递给我的新函数,但出现错误无法将string 转换为string*

using namespace std;
#include <iostream>
#include <fstream>
#include <string>


//function prototypes
void getSize(int &arraySize);
void getSpace(int arraySize, string *word);

   //Calls other functions otherwise does nothing
int main()
{ 
  int numStrings;
  string *words;

  getSize(numStrings);

  getSpace (numStrings, *words);

}//end main


// asks the user how many strings they want
void getSize(int &arraySize){
  cout << "How many strings do you want? ";
  cin >> arraySize;
}

// gets an array in the heap of the size requested by the user
void getSpace(int arraySize, string *word){
  word = new string [arraySize];
}

【问题讨论】:

  • 不需要这个指针的东西 -- std::vector&lt;std::string&gt; word(arraySize);
  • @PaulMcKenzie 我很感激,但我正在努力学习如何更好地使用指针。不过,感谢您为我提供了一种简单的方法。
  • 一般建议:如果不是绝对必要,请不要使用输出参数。 getSize 应该只返回一个 int 并且 - 如果你想坚持使用指针 - getSpace 应该返回一个指向分配数组的指针。

标签: c++ arrays pointers reference pass-by-reference


【解决方案1】:

忽略房间里的大象,std::vector

void getSpace(int arraySize, string *word);

指定一个接受int 和指向string 的指针的函数。在函数内部,您将一个数组分配给strings 的指针。

但是!

指针是一个包含地址的变量,该地址按值传递给函数。 getSpaceword 内部是调用者提供的地址的副本。两者具有相同的值,指向同一个地方,但如果你改变一个指向的地方,那个改变不会反映在另一个上。更改 word 的值不会改变调用函数中的原始值。您需要通过引用传递指针才能在调用者中更新指针。

您可以将getSpace 定义为

void getSpace(int arraySize, string * & word);

然后调用它

getSpace (numStrings, words);

但定义它会更容易

string * getSpace(int arraySize);

然后调用它

words = getSpace (numStrings);

省去麻烦。也更容易阅读。通过返回指针,函数清楚地为调用者提供了一个指向字符串的指针。以前的版本可能正在使用一个字符串,导致未初始化变量警告 Mikhail Genkin 在对其他答案之一的评论中提到。

完成后记得delete[] words;

【讨论】:

  • 感谢您的解释。我以前有时也遇到过类似的问题,现在我明白了* &amp; word 的含义
【解决方案2】:

您只需要在getSpace 函数中通过引用而不是值传递word。即将*word更改为*&amp;word

请记住,如果您打算更改指针指向的位置,则需要通过引用传递它。

当您在getSpace 中说word = new string[arraySize] 时,您所做的是将word 设置为指向包含新字符串数组中第一个元素的内存位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多