在C中跟踪指针

在C中跟踪指针,c,pointers,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(

我将展示整个代码,但在这里讨论我的问题时,请查找指针上方的引号。我会告诉你我认为在报价评论中发生了什么。代码编译并运行,我只需要帮助理解部分代码

#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;
^以上^


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

int *result = get_data(num_grades);
在这一行中,您没有为
result
指定函数指针,而是将
num\u grades
作为参数调用函数的结果。也就是说,对于在
get_data
主体中计算的
a
。在那之后:

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
param并返回一个
int
。它后面不能有函数体。

get\u data
是一个返回整数指针的函数。首先:

int *result = get_data(num_grades);
在这一行中,您没有为
result
指定函数指针,而是将
num\u grades
作为参数调用函数的结果。也就是说,对于在
get_data
主体中计算的
a
。在那之后:

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
param并返回一个
int
。在它之后不可能有一个功能体

。。。然而,我似乎不知道当你给指针分配一个函数时会发生什么

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

这是指向以下位置的指针:
int*result=get\u data(num\u grades)

否。
int*
表示“指向
int
”的指针

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

否。该函数返回一个
int*
(指向
int
)的指针。代码中有一个函数指针,尽管它不是函数(因为它是函数指针),也不返回任何内容(因为它不是函数;它是函数指针)

请记住,
int*
表示“指向
int
”的指针

然后我不确定为什么[I]=grade会起作用,这些索引是从哪里来的,我不明白如果没有声明数组为什么会起作用。有人能解释一下这里发生了什么吗?这是怎么回事?我真的很困惑

array[index]
操作符实际上是一个
指针[index]
操作符。它是
*(数组+索引)
*(指针+索引)
的语法糖

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

因此,尽管指针声明对
sizeof
&addressof
运算符具有不同的语义,但对“array subscript”运算符具有相同的语义

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

。。。然而,我似乎不知道当你给指针分配一个函数时会发生什么

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

这是指向以下位置的指针:
int*result=get\u data(num\u grades)

否。
int*
表示“指向
int
”的指针

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

否。该函数返回一个
int*
(指向
int
)的指针。代码中有一个函数指针,尽管它不是函数(因为它是函数指针),也不返回任何内容(因为它不是函数;它是函数指针)

请记住,
int*
表示“指向
int
”的指针

然后我不确定为什么[I]=grade会起作用,这些索引是从哪里来的,我不明白如果没有声明数组为什么会起作用。有人能解释一下这里发生了什么吗?这是怎么回事?我真的很困惑

array[index]
操作符实际上是一个
指针[index]
操作符。它是
*(数组+索引)
*(指针+索引)
的语法糖

每当使用具有数组类型的表达式时(采用数组的
sizeof
&addressof
除外),该表达式将转换为