2016-03-20 245 views
1

这里是我的代码:如何将指针传递给函数?

#include <stdio.h> 

#include <stdlib.h> 


void AverageOfAss(float marks[][101], int numStudents, int numAss, float *avg[]) { 
    int i, j; 
    for (j=0; j<numAss; j++) {  
     *avg[j] = 0; 
     for (i=0; i<numStudents; i++) { 
      *avg[j] += marks[i][j]; 
      *avg[j] = *avg[j]/(float)numStudents*100; 
      return ; 
     } 
    } 
} 

void PrintAvg(float *avg[], int numAss) { 
    int i; 
    for (i=0; i<numAss; i++) { 
     printf("Average for Exam %d = %.1f\n", i, *avg[i]); 

     return; 
    } 
} 

int main(int argc, char* argv[]) { 
    float grades[1001][101], avgAss[1001]; 
    float *p; 
    int i, j, row, col; 

    p = avgAss; 

    row = atoi(argv[1]); 
    col = atoi(argv[2]); 

    FILE *input_grades; 

    input_grades = fopen("grades.txt", "r"); 

    // READ IN GRADES 
    for (i=0; i<row; i++) { 
     for (j=0; j<col; j++) { 
      fscanf(input_grades, "%f, ", &grades[i][j]); 
     } 
    } 

    // OUTPUT GRADES LIST 
    printf("==================================\n"); 
    printf("Student grades from the input file\n"); 
    printf("==================================\n"); 
    for (i=0; i<row; i++) { 
     printf("\n"); 
      for (j=0; j<col; j++) { 
       printf("%.1f, ", grades[i][j]); 
      } 
    } 
    printf("\n\n"); 
    AverageOfAss(grades, row, col, &avgAss); 
    PrintAvg(&avgAss, col); 

    fclose(input_grades); 
} 

一切都只是正常的,当我试图在终端上执行代码,它表现出一些警告:

  1. 不兼容的指针类型,把“浮动( *)[1001]”到参数类型的 '浮动**'

    AverageOfAss(等级,行,列,& avgAss);

  2. 传递参数参数 '平均' 这里

    空隙AverageOfAss(浮动马克[] [101],诠释numStudents,整数numAss,浮*平均[]){

  3. 不相容指针类型传递 '浮动(*)[1001]' 到参数类型的 '浮动**'

    PrintAvg(& avgAss,列);

  4. 传递参数参数 '平均' 这里

    无效PrintAvg(浮动*平均[],INT numAss){

有谁知道发生了什么事我的代码?我应该如何解决它? (新手在这里)

+0

无关,即*即使在修改调用两端的参数类型后,也不会正确计算平均值。并且计算for-loop和报告for-loop都有'return;'埋在循环体中。我怀疑你希望他们只迭代一次,然后返回给调用者。 – WhozCraig

+0

这正是我现在所面临的问题,就像代码工程一样,但它计算的平均值是错误的,我不知道它是如何得到数字的。你知道我的代码有什么问题吗? – user6089062

回答

2

问题是指向float的数组的指针与指向float的指针的指针不同。

错误信息实际上告诉你如何解决你的问题......编译器告诉你的是&avgAss的类型为float(*)[1001],而你的参数类型为float **。所以你需要改变你的函数参数类型以符合编译器的期望,比如float (*avg)[1001]。那么你有一个问题,即*avg[j]实际上意味着*(avg[j]),而不是你所需要的(*avg)[j]

但是你根本不需要传递指向数组的指针。所有你需要的是让阵列自然而然地衰减到一个指向它的第一个元素,让你真正应该做的是函数参数更改为float *avg并使用它像一个正常的阵列avg[j]。当然,不要将指针传递给数组,在调用中只使用avgAss

0

如果你想一个数组作为参数传递给函数,修改数组的内容,该功能并保留修改后的数组,就没有必要对一个指针传递给一个指针数组,只要传递指向数组的指针(即没有[]或运算符的数组名称)。 在C,基本类型的数据是通过复制传递给函数,所以你需要指针传递给他们保留的修改。数组不能通过复制传递,一个间接级别就足够了。