【问题标题】:Passing by reference with pointers使用指针通过引用传递
【发布时间】:2018-03-24 20:58:01
【问题描述】:

我正在编写一个简单的程序来计算圆柱体的表面积和体积。我没有在 main() 中编写所有代码,而是使用了 3 个函数。

第一个函数读取高度和半径的输入数据,将值传回主程序。

第二个函数使用参数高度和半径来计算面积和体积的值,并将每一个值传递回主程序。

第三个函数在打印语句中使用参数 area 和 volume。

#include<stdio.h>
#define PI 3.14159 

static void inputData(double *ph, double *pr);
static void computeResults(double h, double r, double *pa, double *pv);
static void displayAnswer(double a, double v);

main()
{
    double h,r,a,v;

    inputData(&h, &r);
    computeResults(h, r, &a, &v);
    displayAnswer(a, v);

    return;
}

static void inputData(double *ph, double *pr)
{
    printf("Height: ");
    scanf("%g", ph);
    printf("Radius: ");
    scanf("%g", pr); 
}

static void computeResults(double h, double r, double *pa, double *pv)
{
    *pa = (2 * PI * h * r);
    *pv = (PI * h * r * r);
}

static void displayAnswer(double a, double v)
{
    printf("The Area is: %f", a);   
    printf("The Volume is: %f", v);
}

我在 inputData 函数中的 scanf 行有问题。

错误信息:

surfaceAreaCylinder.c:22:8: 警告:格式“%g”需要“float *”类型的参数,但参数 2 的类型为“double *”[-Wformat=] scanf("%g", ph); ^

surfaceAreaCylinder.c:24:8:警告:格式“%g”需要“float *”类型的参数,但参数 2 的类型为“double *”[-Wformat=] scanf("%g", pr);

我对指针有基本的了解,知道scanf必须将信息返回给调用者,因此控制字符串后面的参数必须使用引用调用。请帮我理解!

【问题讨论】:

  • C 仅 pass by value 不是引用
  • math.h 中有一个 PI 值
  • *pa = (2 * PI * h * r); --> *pa = 2 * PI * r *(h + r); ?

标签: c scanf pass-by-reference


【解决方案1】:

inputData(double*, double*) 函数的scanf 行中,您已将格式字符串指定为"%g"。此格式字符串用于单精度浮点数,这意味着您对scanf 的调用需要指向float 的指针作为第二个参数。

你有两个选择。

  1. 在调用scanf 时使用"%lf" 作为格式字符串,即scanf("%lf", ph);
  2. double 更改为float

维基百科对可用的格式字符串进行了很好的细分: https://en.wikipedia.org/wiki/Scanf_format_string#Format_string_specifications

【讨论】:

    【解决方案2】:

    "%g" 用于数据类型float,但您提供了double 类型的参数。请改用"%lg"。有关更多详细信息,请在 cppreference.com 上提供 scanf 参考。

    【讨论】:

      猜你喜欢
      • 2014-05-06
      • 2014-07-27
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多