以下程序调用findmax函数返回数组中的最大值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以下程序调用findmax函数返回数组中的最大值相关的知识,希望对你有一定的参考价值。

、findmax(int *a,int n)
int *p,*s;
for(p=a,s=a; p-a<n; p++)
if ( ) s=p;
return(*s);

main()
int x[5]=12,21,13,6,18;
printf("%d\n",findmax(x,5));
在下划线处应填入的是
A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s

此处if判读后,将p赋给s,说明是将较大的数的地址保存到s中,所以应该是判断出当前p指向的数大于s指向的数,即*p>*s,选B 参考技术A 选B 参考技术B B追问

if ( ) s=p;
这是啥

追答

用s记录前几次循环数组中最大的数的地址,如果后面的循环中有比s指向的数更大的数,就把该数的地址赋给s,循环结束后s指向数组中最大的数。

本回答被提问者采纳

通过C中的void函数返回动态数组

【中文标题】通过C中的void函数返回动态数组【英文标题】:Returning dynamic array through void function in C 【发布时间】:2012-12-16 18:00:40 【问题描述】:

在我的 C 程序中,我使用带有以下参数的 void 函数: 一个 2D int 数组,一个用于创建新动态数组的 int 指针和一个 last int 指针,它将保存函数内部发生的一些计数。 所以动态数组是使用 malloc 在函数中创建的,一切正常,直到我在调用函数后在 main() 中打印它的元素。我得到的是垃圾而不是我应该看到的数字。函数代码如下:

void availableMoves(int array[][3], int *av, int *counter)

    int i, j;
    for (i=0; i<3; i++)
    
        for (j=0; j<3; j++)
        
            if (array[i][j] == E)
            
                printf("%d ", 3*i + j + 1);
                (*counter)++;
            
        
    
    av = (int *) malloc(*counter * sizeof(int));
    if (av == NULL)
    
        printf("ERROR!");
    
    else
    
        for (i=0; i<*counter; i++)
            *(av + i) = 0;
        int pos = 0;
        for (i=0; i<3; i++)
        
            for (j=0; j<3; j++)
            
                if (array[i][j] == E)
                
                    *(av + pos++) = 3*i + j + 1;
                
            
        
    

【问题讨论】:

只是对代码进行评论:由于您有错误情况,因此您不应该像在错误情况下那样修改*counter。使用一个临时的int tmp_count = *counter; 变量,并仅在函数成功时将其分配回*counter。或者,如果 malloc 失败或其他原因,请将其设为 abort();。避免产生“部分”结果(av=null*counter 仍被修改)。 尝试理解指针解引用和索引。 *(av + pos++) = 3*i + j + 1;av[pos++] = 3*i + j + 1; 相同,但大多数人类读者更喜欢第二种形式。与(*counter)++; 类似,可以写成*counter += 1;,避免使用括号。 @hyde:你是对的,但这是对 malloc 的快速检查,我还没有完成。 :) @wildplasser:括号有问题吗? 不,它们没有任何问题。但大多数人倾向于减少括号的数量,只是因为用更少的 ((.)(.)) 更容易阅读。 【参考方案1】:

在这个函数中,av是一个拷贝传递的指针。所以当你在函数内部改变指针的值时,原来的指针不会被修改。

有两种可能:

使用指向指针的指针(int **av); 返回分配的指针 (return av)。

所以要么:

void availableMoves(int array[][3], int **av, int *counter);

或者:

int *availableMoves(int array[][3], int *av, int *counter)

还有电话:

availableMoves(array, &av, &counter);
av = availableMoves(array, av, &counter);

【讨论】:

第三种(IMO 最一致的)方法是返回布尔值:当 avcounter 都已成功修改时返回 true,否则返回 false 并离开 avcounter未修改。 @hyde:否则使用返回值确实是个好主意。 决定使用第一种方法,它似乎工作!谢谢!【参考方案2】:

对动态数组使用双指针int **av 而不是int *av

void availableMoves(int array[][3], int **av, int *counter)

并进入函数将av更改为*av

【讨论】:

以上是关于以下程序调用findmax函数返回数组中的最大值的主要内容,如果未能解决你的问题,请参考以下文章

求救C++编程实现findmax函数

C++设计一个在数组中找最大数的函数findmax, 要求该元素的下标通过参数返回,其地址通过函数值返回

下面findmax函数将计算数组中的最大元素及其下标值,请编写该函数。

两个递归程序(数组最大元素,汉诺塔)

C语言中函数调用怎么返回两个值

ZZNUOJ_用C语言编写程序实现1158:矩阵的最大值(指针专题)(附完整源码)