如何将带指针的数组传递给函数?

时间:2016-03-20 10:01:43

标签: c arrays function pointers parameter-passing

这是我的代码:

#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. 不兼容的指针类型传递&#39; float(*)[1001]&#39;参数   类型&#39;浮动**&#39;

    AverageOfAss(成绩,行,col和avgAss);

  2. 将参数传递给参数&#39; avg&#39;此处

    void AverageOfAss(float marks [] [101],int numStudents,int numAss,float * avg []){

  3. 不兼容的指针类型传递&#39; float(*)[1001]&#39;参数   类型&#39;浮动**&#39;

    PrintAvg(&amp; avgAss,col);

  4. 将参数传递给参数&#39; avg&#39;此处

    void PrintAvg(float * avg [],int numAss){

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

2 个答案:

答案 0 :(得分:2)

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

错误消息实际上告诉您应该如何解决问题...编译器告诉您的是float(*)[1001]类型为float **,而您的参数类型为float (*avg)[1001] }。因此,您需要更改函数参数类型以匹配编译器期望的内容,例如, *avg[j]。那么您遇到的问题*(avg[j])实际上意味着(*avg)[j]而不是您需要float *avg

然而 您根本不需要传递指向数组的指针。您所需要的只是让数组自然地衰减到指向其第一个元素的指针,因此您真正应该做的是将函数参数更改为avg[j]并将其用作普通数组avgAss。当然,不要将指针传递给数组,在调用中只使用{{1}}。

答案 1 :(得分:0)

如果要将数组作为参数传递给函数,修改该函数中数组的内容并保留修改后的数组,不需要将指针传递给指向数组的指针,只需传递指针即可到数组(即没有[]或&amp;运算符的数组的名称)。 在C中,基本类型的数据通过复制传递给函数,因此您需要将指针传递给它们以保留修改。数组不能通过副本传递,一个间接层就足够了。