在C编程中指针是如何与函数一起工作的?

在C编程中指针是如何与函数一起工作的?,c,pointers,C,Pointers,我已经在我的C编程中启动了函数单元。我把指针和函数搞混了。我理解没有任何指针的普通函数,但我真的对指针函数感到困惑。假设我有以下功能: #include <stdio.h> int functions_1(double num1, double num2); int main(void) { double mark1; double mark2; double total; printf("Enter marks for subject one:

我已经在我的C编程中启动了函数单元。我把指针和函数搞混了。我理解没有任何指针的普通函数,但我真的对指针函数感到困惑。假设我有以下功能:

#include <stdio.h>
int functions_1(double num1, double num2);

int main(void) {

    double mark1;
    double mark2;
    double total;

    printf("Enter marks for subject one: ");
    scanf("%lf", &mark1);

    printf("Enter marks for subject two: ");
    scanf("%lf", &mark2);

    total = functions_1(mark1, mark2);

    printf("Your average is: %.2f \n", total);

/*      if (total > 50) {
                printf("You have passed. \n");
        }
        else {
                printf("You have failed \n");
        }*/
    return 0;
}

int fucntions_1(double num1, double num2) {

    double average;
    double averageTwo;

    average = num1 + num2;
    averageTwo = average / 200;

    return averageTwo;
}
#包括
int函数_1(双num1,双num2);
内部主(空){
双标记1;
双标记2;
双倍总数;
printf(“输入主题一的标记:”);
scanf(“%lf”和标记1);
printf(“为主题二输入标记:”);
scanf(“%lf”、&mark2);
总计=功能1(标记1,标记2);
printf(“您的平均值为:%.2f\n”,总计);
/*如果(总数>50){
printf(“您已通过。\n”);
}
否则{
printf(“您失败了\n”);
}*/
返回0;
}
整数功能_1(双数m1,双数m2){
双倍平均;
双平均2;
平均值=num1+num2;
平均值2=平均值/200;
返回平均值2;
}
在C编程中如何使用指针做同样的事情? 我不是要求你做编码,但我想了解的概念!
谢谢

在这种情况下使用指针的想法是允许您将变量传递到函数中。所以您需要3个参数,而不是2个-类似于
void function2(double num1,double num2,double*result)

既然您说您更愿意自己编写代码,我就不会给出实现答案-但是您需要在函数外部声明一个
double
变量(在
main
中),将其地址传递给最后一个参数(地址是指针),然后在函数中,使用取消引用运算符(
*
)更改指针指向结果的值。你不需要(或不想)归还任何东西

指针很难理解。必须在真正需要它们的概念之前引入它们是没有帮助的,因此使用的示例通常看起来有点做作——如果您在生产程序中编写函数,您可能只会使用返回值的版本

这个想法实际上是跟踪单个内存块,以便您可以在程序中的多个位置使用它。在本例中,您正在使函数外部的变量在函数内部可访问,以便可以对其进行写入

您可能知道,当参数被传递到C函数中时,它们会被复制到函数中的新内存中。这就是为什么更改传递到函数内部的参数变量的值对外部变量的值没有影响。您可以更改它们,但不会产生任何效果,因为它们不是占用相同内存的对象。指针是解决这个问题的一种方法。它只是一段内存的地址,只是一个数字。当它被传递到函数中时,它是否被复制并不重要,因为我们不是将它作为一块内存使用,而是使用它包含的值作为从函数外部查找原始变量内存的一种方式。因此,当您取消引用指针的值(使用*)并将其赋值时,您将更改函数外部变量的值,因为该变量位于函数外部

这样做的一个优点是它释放了函数的返回值来执行另一项工作。很多常见的C库函数都是这样使用它的,例如,
sprintf
fwrite
scanf
——通常用于返回写入的字符数或字节数,或指示失败


然而,指针最重要的一个用途是处理堆中的内存,即程序员使用
malloc
和类似函数显式分配的内存。一旦您开始使用
malloc
,并了解堆是如何工作的,指针和使用它们的原因就更有意义了,尽管这并不总是那么容易。

您的意思是不返回值而是写入参数提供的指针?顺便说一句,返回类型不应该是
double
而不是
int
?使用
double functions\u 1(double*num1,double*num2)
total=functions\u 1(&mark1,&mark2)
平均值=*num1+*num2
@agaw001就是我需要做的所有事情吗?我知道&意味着地址,但我不需要将我的函数类型更改为void吗?你的函数返回
double
而不是
int
,void用于未确定的类型