为啥指针不能传递正确的值(C)?

Posted

技术标签:

【中文标题】为啥指针不能传递正确的值(C)?【英文标题】:Why does the pointers cant pass the right values(C)?为什么指针不能传递正确的值(C)? 【发布时间】:2022-01-11 23:23:11 【问题描述】:

我被赋予了这个任务:

编写一个接受整数数组“arr”及其大小的函数 “n”和一个整数“key”(已知数组至少有 2 整数)。

如果数组中有两个整数的和小于“key”,则该函数检查并返回 1,否则该函数 返回0。另外如果有满足这个条件的整数,函数会将它们的值传递给“n”和“key”,否则传递-1。

这是我的解决方案:

int ex5(int* arr, int* n, int* key)

    while (*n > 0)
    
        int i;
        for (i = 0; i < *n - 1; i++)
        
            if (arr[*n-1] + arr[i] < *key)
            
                
                *n = arr[i];
                *key = arr[*n-1];*
                return 1;
            
        
        --*n;
    
    *n = -1;
    *key = -1;
    return 0;

这是我的主要功能:

int main()

    int arr[] = 1, 6, 2, 4, 3, n = 5, key = 4;
    int res = ex5(arr, &n, &key);
    printf("%d %d %d", res, n, key);

但是,当我运行我的代码时,函数返回 1 并传递 (n = 1, key = 1),它应该传递 (n = 2, key = 1)

【问题讨论】:

ericlippert.com/2014/03/05/how-to-debug-small-programs 如果将*n*key 的值复制到局部变量中,整个事情会容易得多。然后编写两个嵌套的for循环,找到一对满足条件的数组元素。 【参考方案1】:
*n = arr[i]; 
*key = arr[*n-1]; 

上面代码中的第二行读取arr[arr[i]-1]; 这可能超出范围,例如arr[i] 是 1000,而数组中只有 5 个元素。数组中的值与数组大小之间没有关系。至少颠倒顺序:

*key = arr[*n-1]; 
*n = arr[i];

您还可以使用两个循环来简化代码。示例

int ex5(int* arr, int *size, int *key)

    for (int i = 0; i < *size; i++)
        for (int k = i + 1; k < *size; k++)
            if (arr[i] + arr[k] < *key)
            
                *key = arr[i];
                *size = arr[k];
                return 1;
            
    return 0;

【讨论】:

【参考方案2】:

为满足条件的循环写 2 个。

int ex5(int* arr, int *size, int *key)

int i=0;
while(i<*size)

int k=i+1;
while(k<*size)

if (arr[i] + arr[k] < *key)

*key = arr[i];
*size = arr[k];
return 1;

i++;

return 0;

【讨论】:

以上是关于为啥指针不能传递正确的值(C)?的主要内容,如果未能解决你的问题,请参考以下文章

调用函数时为啥形参的值不能传给实参

C# 为啥我的变量不能在表单之间正确传递?

C语言,用指针方式定义的字符串为啥不能修改?

C++ 为啥我不能将此指针保存到引用?

为啥我不能将模板函数指针传递给可变参数函数?

c语言中,为啥不能对字符指针变量指向的字符串再赋值?