跟随C中的指针

时间:2015-06-08 19:52:39

标签: c pointers

我将显示整个代码,但在指针上方查找引号,因为我将在那里讨论我的问题。我会在报价评论中告诉你我的想法。代码编译并运行,我只需要帮助理解部分代码。

#include <stdio.h>
#include <stdlib.h>


int *get_data(int num_grades);
float calc_average(int num_grades, int grades[]);
void display_average(float ave);

int main()
{
        int num_grades = 10;
        const int MAX_GRADE = 100;
  

在此引号框下方: int * result = get_data(num_grades);

     

我对这方面的指针有一个非常简单的理解,正如我最近向他们介绍的那样,但我似乎无法理解当你为指针分配一个函数时会发生什么。我认为应该发生的是指针 int * result 应该指向一个地址。相反,它指向一个我认为也是指针的函数。那么这是一个指向指针的指针: int * result = get_data(num_grades);

     

我将把剩下的问题放在下面的get_data函数中。

        int *result = get_data(num_grades);
  

^高于^

        if (num_grades ==0)
                printf("no grades to average\n");
        else
        {
                float ave = calc_average(num_grades, result);
                display_average(ave);
        }

        free(result);
        return 0;
}

float calc_average(int num_grades, int grades[])
{
        float ave;
        int i;
        int sum = 0;
        for (i = 0; i < num_grades; i++)
        {
                sum+=grades[i];
        }
        ave = (float)sum/num_grades;
        return ave;
}

void display_average(float ave)
{
        printf("average: %.2f\n", ave);
}
  

在此报价框下方

     

我认为这是一个返回int指针的函数指针?

     

因此,在函数体内,我们创建一个新指针,为它分配内存,为每个&#39;指针分配等级。我想,然后我不确定为什么[i] =等级正在起作用,这些索引是什么来的,我不明白为什么如果没有声明数组就行。有人能解释一下这里发生了什么吗?这是如何运作的?我真的很困惑。

int *get_data(int num_grades)
{

int* a;
a = malloc(num_grades * sizeof(int));
int i;
for (i = 0; i < num_grades; i++)
{
        printf("enter a grade: ");
        int grade;
        scanf("%d", &grade);
        if(grade<=100)
        {
                a[i] = grade;
        }
        else
        {
                printf("grade needs to be > 0 and <= 100\n");
                i--;
        }
}
return a;
  

^上面,整个功能^

}

2 个答案:

答案 0 :(得分:3)

get_data是一个返回指向整数的指针的函数。首先:

int *result = get_data(num_grades);

在这一行中,您没有为result指定一个指向函数的指针,而是使用num_grades作为参数调用的函数的结果。也就是说,您在a正文中计算的get_data。之后:

int *get_data(int num_grades)

这是一个名为get_data的函数的声明,它接受一个int参数并返回指向int的指针。你可以重新排列这样的空格:

int* get_data(int num_grades)

如果它让事情更清楚。在这种情况下,说get_data是指向函数的指针甚至没有意义,因为它的主体紧随其后。供参考:

int (*get_data)(int num_grades);

这是一个指向函数的指针的声明如何获取一个int参数并返回一个int。并且之后就不会有一个功能体。

答案 1 :(得分:2)

  

...但是,当你将一个函数分配给指针时,我似乎无法理解会发生什么。

您没有为指针分配函数;您将函数的返回值(恰好是int *值)分配给恰好存储int *值的变量。

  

这是一个指向指针的指针:int *result = get_data(num_grades);

没有。 int *表示“指向int”的指针。

  

我认为这是一个返回int指针的函数指针吗?

没有。该函数返回int *(指向int的指针)。你的代码中有一个函数指针,虽然它不是函数(因为它是函数指针)并且它没有< em> return 任何东西(因为它的不是函数;它是函数指针)。

请记住,int *表示'指向int'的指针。

  

然后我不确定为什么[i] =等级正在工作,这些索引是什么来的,我不明白为什么如果没有声明数组这就行。有人能解释一下这里发生了什么吗?这是如何运作的?我真的很困惑。

array[index]运算符实际上是pointer[index]运算符。它是*(array + index)*(pointer + index)的语法糖。

每当使用具有数组类型的表达式时(除了将sizeof&addressof作为数组),表达式将转换为指针。指针指向数组的第一项...

因此,虽然您的指针声明对sizeof&addressof运算符具有不同的语义,但它对'数组下标'运算符具有相同的语义。

类似的概念适用于函数(因此上面的“函数指针”解释)。从技术上讲,在您的表达式int *result = get_data(num_grades);中,您没有应用function(argument)运算符;您正在应用function_pointer(argument)运算符。表示函数的表达式将转换为函数指针...