首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带星号的C-问题中作为参数的空指针

带星号的C-问题中作为参数的空指针
EN

Stack Overflow用户
提问于 2022-05-27 20:57:49
回答 2查看 64关注 0票数 1

任务是通过用户输入填充数组中的数字,然后使用stats()函数计算该数组每一行的平均值等。stats()函数的标题如下:

代码语言:javascript
运行
复制
int stats(int (*ptr)[5], int width, int height, int row_id, int* max, int* min, float *avg)

当ptr是指向矩阵的指针时,宽度和高度是它的大小,row_id是被分析行的索引,max、min和avg是指向存储每个统计量的变量的指针。

使用以下行调用函数时:

代码语言:javascript
运行
复制
stats(*ptr, 5,5,2, *max = NULL, *min = NULL,  *avg=NULL);

出现以下错误:

代码语言:javascript
运行
复制
 error: invalid type argument of unary '*' (have 'int')

我尝试了不同的方法,但总是有一个错误,我如何解决这个问题?谢谢你的任何线索。

编辑:这是整个代码:

代码语言:javascript
运行
复制
#include <stdio.h>

int stats(int (*ptr)[5], int width, int height, int row_id, int* max, int* min, float *avg)
{
    int j, vmax,vmin;
    int max = &vmax;
    int min = &vmin;
    int i = row_id;
    int m = *ptr;

    for(j = 0; j<5; j++){
        if(m[i][j]>max)
        {
            max = m[i][j] ;
            j++;
            else
                j++;
        }

    }
printf("%d", max);
    return 0;
}

int main(void){
    int n, i, j, vmin, vmax; // vmax - value of the maximum
    int min = &vmin; // min - pointer to the minimum
    int max = &vmax;
    float vavg;
    int avg = &vavg;
    int m[5][5];

    for(i = 0; i<5; i++)
    {
        for(j = 0; j<5; j++)
        {
            printf("ENTER A NUMBER: ");
            scanf("%d", &n);
            m[i][j] = n;
        }
    }
    int ptr = &m;
    stats(*ptr, 5,5,2, *max = NULL, *min = NULL,  *avg=NULL);

    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-27 21:27:55

你的代码里到处都是bug。

例如,minmax不被声明为指针

代码语言:javascript
运行
复制
int min = &vmin; // min - pointer to the minimum
int max = &vmax;

此外,还不清楚为什么变量avg具有int类型,并由类型float *的指针表达式初始化。

代码语言:javascript
运行
复制
float vavg;
int avg = &vavg;

或者由二维数组的地址初始化int类型的变量int

代码语言:javascript
运行
复制
int ptr = &m;

至于函数,如果函数只在一行上运行,那么就没有意义将整个二维数组传递给函数。

此外,函数的返回类型和返回值也没有意义。

该函数将不输出任何消息。决定是否输出消息的是函数的调用方。

此外,该函数还包含错误,您在其中重新声明其参数,例如

代码语言:javascript
运行
复制
int max = &vmax;

这也是没有道理的。

使用您的方法,可以通过以下方式声明和定义函数

代码语言:javascript
运行
复制
#include <assert.h>

//...

void stats( const int *a, size_t n, int *max, int *min, float *avg )
{
    assert( n != 0 );

    *max = a[0];
    *min = a[0];
    float sum = a[0];

    for( size_t i = 1; i < n; i++ )
    {
        sum += a[i];

        if ( *max < a[i] )
        {
            *max = a[i];
        }
        else if ( a[i] < *min )
        {
            *min = a[i];
        }
    }

    *avg = sum / n;
}

给我打电话

代码语言:javascript
运行
复制
int min = 0;
int max = 0;
float avg = 0.0f;;

//...

stats( m[2], 5, &max, &min, &avg );

printf( "max = %d\n", max );
printf( "min = %d\n", min );
printf( "average = %f\n", avg );
票数 1
EN

Stack Overflow用户

发布于 2022-05-27 23:38:28

当您使用指针作为函数参数时,请小心。如果你有这样的东西:

代码语言:javascript
运行
复制
int func(int *max){

}

max,这里是一个指针,需要保存一个地址。因此,在这个函数中,当您需要使用它时,您需要使用*解除它的引用。例如:

代码语言:javascript
运行
复制
int func(int *max){
   *max = $someAddress
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72411009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档