首页 > 解决方案 > 如何正确取消引用指向指针数组的指针?

问题描述

我正在处理涉及字符串指针的任务。有两个功能。第一个接收一个字符串数组,将每个元素的地址放入一个单独的数组中,然后返回指向该数组的指针。第二个函数获取返回的指针,并仅使用指针打印出原始数组的元素。但是当我测试它时,取消引用的字符串** ptrToPtr 在每个指针中都是不同的。我想知道为什么

这是功能1:

string** arrayOfPtrs(string arr[], int size)
{
  string* ptrArray; //The array of string pointers
  string** ptrToPtr; //A pointer to the array of string pointers
  ptrArray = new string[size];
  //ptrArray = arr;
  int i = 0;

  while (i < size)
  {
    ptrArray = &arr[i];
    i++;
    ptrArray++;
  }

ptrToPtr = &ptrArray;
return ptrToPtr;
}

这是功能2:

void outputArray(string** arr, int size)
{
   int count = size; //An int variable that stores the size of array
   string* ptr = *arr; //A pointer that stores the address to the last    element
                   //in the string pointer array

    while (count > 0)
    {
       cout << *(ptr - count) << " ";
       count--;
    }
   cout << endl;
  }

这是 main() 的一部分:

string strArr[] = { "echo", "charlie", "delta", "bravo", "delta" };
string** strPtrs;

strPtrs = arrayOfPtrs(strArr, 5);
cout << "Actual results: ";
outputArray(arrayOfPtrs(strArr, 5), 5);
cout << endl << endl;

我哪里错了?还是有更好的方法来将指针指向字符串指针?

这是一个完全在 main 中运行的类似程序:

int main()
{
string words[30];
string* s;
s = new string[30];
string** t;
createArray(30, words); 
int num = 0;
t = &s;
while (num < 30)
{
    s = &words[num];
    num++;
    s++;
}
string* u = *t;
int j = 30;
for (int i = 0; i < 30; i++)
{
    cout << "*(s - " << j << ") - " << *(s - j) << endl;
    cout << "words[ " << i << " ] - " << words[i] << endl;
    cout << "*(u - " << j << " ) - " << *(u - j) << endl << endl;
    j--;
}
}

这个程序完美运行。有任何想法吗?

标签: c++arraysstringpointers

解决方案


这是不正确的:

while (i < size)
{
  ptrArray = &arr[i];
  i++;
  ptrArray++;
}

替换ptrArray = &arr[i];*ptrArray = arr[i];。就目前而言,您只是在每次循环中都覆盖同一个指针,而从未对它做任何有用的事情。

这也是不正确的:

string* ptrArray; //The array of string pointers
// ...
ptrToPtr = &ptrArray;
return ptrToPtr;

一旦你return这样做,它就会变得悬空。一旦超出范围,您就不能使用指向本地(堆栈)变量的指针。


推荐阅读