指针 (*) 如何在以下代码中进行更改?
Posted
技术标签:
【中文标题】指针 (*) 如何在以下代码中进行更改?【英文标题】:How is the pointer (*) making changes in the following code? 【发布时间】:2021-04-15 06:11:42 【问题描述】:以下程序旨在检查给定元素是否在给定数组中、元素出现的数组索引以及元素出现的次数。但是,它没有给出正确的结果。我尝试将 seqsearch 函数中的 poscount
替换为 *poscount
并对此指针数据类型进行了进一步更改。然后代码运行良好。为什么会这样?
#include <iostream>
using namespace std;
const int SIZE = 100;
void seqsearch(int[], int, int, int[], short);
int main()
int array[SIZE], indices[SIZE];
int num, value;
short count = 0;
cerr << " Give number of elements in array : ";
cin >> num;
cerr << " Key in the array elements ";
for(int i = 0; i < num; i++) cin >> array[i];
cout << endl;
cerr << " Give the value to be searched : " << endl;
cin >> value;
cout << endl;
seqsearch(array, num, value, indices, count); // void function
if(count >= 0)
cout << value << " found in array " << count << " times"
<< " at index positions " << endl;
for(int i = 0; i < count; i++) cout << indices[i] << " ";
cout << endl;
else
cout << value << " not found in array " << endl;
return 0;
void seqsearch(int arr[], int size, int elm, int pos[], short poscount)
int i, item;
poscount = 0;
for(i = 0; i < size; i++)
if(arr[i] == elm)
pos[poscount] = i;
poscount = poscount + 1;
return;
【问题讨论】:
【参考方案1】:函数seqsearch
应该在pos
和poscount
中返回结果,但该函数采用poscount
按值,这意味着您对@987654326 所做的任何更改@ 在函数内部,将是函数本地的,在调用站点中不可见。
如果您更改函数以获取参数通过引用,您在函数内部所做的更改实际上将针对函数调用中使用的变量进行。像这样:
seqsearch(int arr[], int size, int elm, int pos[], short& poscount) // note short&
int pos[]
没有同样的问题,因为数组 衰减 成指针,所以它可能是 int* pos
- 并且该指针指向您在呼叫站点。
还要注意,调用后的检查将使程序显示“在数组中找到”,即使它在数组中没有找到,因为条件检查count
是零还是大于零。
if(count >= 0) // should be if(count > 0)
与您的问题无关的建议:
如果在编译程序时不知道元素的数量,最好使用可以动态增长的容器,例如std::vector<int>
。在您的程序中,您的硬编码限制为 SIZE
元素数量,但是:
您很少会使用所有这些。
您不检查用户是否要输入超过 SIZE
的元素,您的程序会很乐意尝试写入越界 - 这将导致 undefined behavior。
将程序的子任务划分为功能。如果您可以单独测试每个单独的功能,则搜索错误会更容易。
检查从std::cin
中提取值是否确实成功。
int number;
if(std::cin >> number) /* success */ else /* failure */
检查输入的值是否也有意义。
int wanted_container_elements;
if(std::cin >> wanted_container_elements && wanted_container_elements > 0)
/* success */
else
/* failure */
【讨论】:
【参考方案2】:您的代码中的poscount
(或调用者上下文中的count
)似乎应该是一个输出参数。
要修改传递的值,您必须具有其地址(指针)或对该值的引用。
目前您正在使用“按值传递”,这意味着poscount
是count
的副本。
原始的count
保持不变。
我个人最喜欢的是返回值而不是使用输出参数:
short seqsearch(int arr[], int size, int elm, int pos[])
int i, item;
short poscount = 0;
for(i = 0; i < size; i++)
if(arr[i] == elm)
pos[poscount] = i;
poscount = poscount + 1;
return poscount;
count = seqsearch(array, num, value, indices);
或者,您可以使用引用来操作输出参数:
void seqsearch(int arr[], int size, int elm, int pos[], short& poscount)
int i, item;
poscount = 0;
for(i = 0; i < size; i++)
if(arr[i] == elm)
pos[poscount] = i;
poscount = poscount + 1;
return;
seqsearch(array, num, value, indices, count);
而且,正如你已经尝试过的,你也可以通过传递一个指向值的指针来解决这个问题:
void seqsearch(int arr[], int size, int elm, int pos[], short* poscount)
int i, item;
*poscount = 0;
for(i = 0; i < size; i++)
if(arr[i] == elm)
pos[*poscount] = i;
*poscount = *poscount + 1;
return;
seqsearch(array, num, value, indices, &count);
【讨论】:
仔细检查您的价值回报,例如。这是最好的解决方案,你应该把它放在第一位。代码似乎有一个错误,但您没有返回任何内容。 @FantasticMrFox 谢谢 - 看起来我复制了旧版本。已更正 其次,在您投票之前。函数指针版本不正确。如果您将指向函数的指针作为输出参数传递,那是因为您希望它是可选的,也就是说,我可以传递 NULL。如果将 nullptr 传递给该函数会发生什么? @FantasticMrFox 我不同意这个假设总是可以接受的。尤其是在您经常使用 C 样式代码的世界中,您不能假定指针是可选的。另外,C 风格的数组呢?但是,是的,如果一个参数可以为空,它也应该被检查。我稍后会在我的回答中添加一个简短的提示,因为它也适用于arr
和pos
在所有情况下。【参考方案3】:
当您传递 posscount 参数时,您将副本传递给 main 中的 count 变量,而不是变量本身。这就是它起作用的原因,当你通过指针传递它时。您也可以通过引用传递。 https://www.includehelp.com/cpp-tutorial/argument-passing-with-its-types.aspx
【讨论】:
以上是关于指针 (*) 如何在以下代码中进行更改?的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中创建等效结构并使用malloc更改空指针的引用