空指针作为C语言的参数-星号问题



任务是用用户输入的数字填充数组,然后使用stats()函数计算该数组每行的平均值等。stats()函数的头如下所示:

int stats(int (*ptr)[5], int width, int height, int row_id, int* max, int* min, float *avg)

其中PTR是指向矩阵的指针,width和height是矩阵的大小,row_id是分析行的索引,max, min和avg是指向存储每个统计数据的变量的指针。

当调用这样的函数时:

stats(*ptr, 5,5,2, *max = NULL, *min = NULL,  *avg=NULL);

出现以下错误:

error: invalid type argument of unary '*' (have 'int')

我尝试了不同的方法,但总是有一个错误,我怎么能解决这个问题?谢谢你的提示。

编辑:下面是完整的代码:

#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;
}

你的代码漏洞百出

例如,minmax没有被声明为指针

int min = &vmin; // min - pointer to the minimum
int max = &vmax;

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

float vavg;
int avg = &vavg;

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

int ptr = &m;

对于函数来说,如果函数只操作一行,那么将整个二维数组传递给函数就没有任何意义了。

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

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

这个函数也有bug你需要重新声明它的参数比如

int max = &vmax;

还是没有意义。

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

#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;
}

并命名为

int min = 0;
int max = 0;
float avg = 0.0f;;
//...
stats( m[2], 5, &max, &min, &avg );
printf( "max = %dn", max );
printf( "min = %dn", min );
printf( "average = %fn", avg );

使用指针作为函数参数时要小心。如果你有这样的内容:

int func(int *max){
}

这里的max是一个需要保存地址的指针。所以在这个函数内部,当你需要使用它时,你需要通过使用*来解引用它。例如:

int func(int *max){
*max = $someAddress
}

最新更新