c++ - 如何正确取消引用指向指针数组的指针?
问题描述
我正在处理涉及字符串指针的任务。有两个功能。第一个接收一个字符串数组,将每个元素的地址放入一个单独的数组中,然后返回指向该数组的指针。第二个函数获取返回的指针,并仅使用指针打印出原始数组的元素。但是当我测试它时,取消引用的字符串** 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--;
}
}
这个程序完美运行。有任何想法吗?
解决方案
这是不正确的:
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
这样做,它就会变得悬空。一旦超出范围,您就不能使用指向本地(堆栈)变量的指针。
推荐阅读
- python-3.x - 复制和过滤嵌套列表 Python
- android - 更新 Firebase 数据库中的现有数据
- python - 根据参数导入 Python 模块
- javascript - 创建和查询 Sequelize 模型时时间戳值之间的差异
- javascript - 如何删除在控制台中显示未定义的代码行?
- android - 查看 SQLite 数据库时,片段列表视图崩溃
- javascript - 分配失败 - loopback.js 中的 javascript 堆内存不足
- ajax - 如何使用 Ajax 并在另一个 URL 上发布数据请求?
- xml - 如何从 Scala 中的“#PCDATA”获取数据?
- trace32 - 如何从 t32 cmm 脚本中的给定地址查看变量名?