指针 (*) 如何在以下代码中进行更改?

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 应该在posposcount 中返回结果,但该函数采用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&lt;int&gt;。在您的程序中,您的硬编码限制为 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)似乎应该是一个输出参数。

要修改传递的值,您必须具有其地址(指针)或对该值的引用。 目前您正在使用“按值传递”,这意味着poscountcount 的副本。 原始的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 风格的数组呢?但是,是的,如果一个参数可以为空,它也应该被检查。我稍后会在我的回答中添加一个简短的提示,因为它也适用于arrpos 在所有情况下。【参考方案3】:

当您传递 posscount 参数时,您将副本传递给 main 中的 count 变量,而不是变量本身。这就是它起作用的原因,当你通过指针传递它时。您也可以通过引用传递。 https://www.includehelp.com/cpp-tutorial/argument-passing-with-its-types.aspx

【讨论】:

以上是关于指针 (*) 如何在以下代码中进行更改?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中创建等效结构并使用malloc更改空指针的引用

如何使用 ctypes 在 python 中查看指针值的变化

如何使用方法更改指针?

如何将智能指针传递给函数?

如何在 C 语言中返回一个指针

如何根据下拉更改 TextArea 验证