我将显示整个代码,但在指针上方查找引号,因为我将在那里讨论我的问题。我会在报价评论中告诉你我的想法。代码编译并运行,我只需要帮助理解部分代码。
#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;
^上面,整个功能^
}
答案 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)
运算符。表示函数的表达式将转换为函数指针...