【问题标题】:Casting Pointers to int in c在 c 中将指针转换为 int
【发布时间】:2017-04-28 22:27:40
【问题描述】:

为了我的学习,我必须学习它。他们有什么方法可以将指针转换为整数。我必须给 myEulerForward1 一个指针作为参数,我总是收到这个错误消息:

eulerZahl.c: In function ‘main’:
eulerZahl.c:38:35: warning: passing argument 1 of ‘myEulerForward1’ makes pointer from integer without a cast [-Wint-conversion]
  double forward = myEulerForward1(k);
                                   ^
eulerZahl.c:16:8: note: expected ‘int *’ but argument is of type ‘int’
 double myEulerForward1(int *n1){
        ^~~~~~~~~~~~~~~

有人可以帮我吗?

#include <stdio.h>
#include <stdint.h>


double kFactorial(int k){


    if(k <= 1){
        return 1;
    }

    return k * kFactorial(k - 1);
}


double myEulerForward1(int *n1){


    double n = 1;   
    double euler, nFact = 1;
    for(int i = sizeof(&n1); i >= 0; i--){
        nFact*= i;
        euler = euler + (1.0/nFact);
    }

    return euler;

}


int main(){

    int k = 4;
    double factorial = kFactorial(k);

    printf("The factorial of %d is: %lf ", k, factorial); 

    double forward = myEulerForward1(k);

    printf("The Eulers Number: %lf", forward);
}

【问题讨论】:

  • 您正在尝试将一个整数传递给需要指针的位置。尝试双进 = myEulerForward1(&k);或将 double myEulerForward1(int *n1){ 更改为 double myEulerForward1(int n1){
  • for(int i = sizeof(&amp;n1); i &gt;= 0; i--)??询问指针的大小。
  • 在同一函数中double eulereuler = euler + (1.0/nFact); 行中未初始化。请启用并修复所有编译器警告。
  • 谢谢老兄,我错过了&。
  • 好的,现在我修复了所有编译器警告,我得到了 inf 作为我的欧拉数

标签: c pointers recursion int


【解决方案1】:

首先我可以在sizeof(&amp;n1); 看到一个错误 当然 n1 是一个指针。他的值是一个 RAM 地址。但是要查看他的 Deferenced 值,您必须在 n1 之前使用*&amp; 用于获取某物的地址。 * 用于获取指针的内部。

使用:sizeof(*n1);

其次,我看到你在 myEulerForward1

的原型中得到了一个指针

double myEulerForward1(int *n1)

这是你的编译错误。他说你的函数需要一个指针(一个地址),你把除此之外的所有东西都放了。

所以当你调用这个函数时,你必须放一个指针(一个RAM地址)。 为此,在调用函数时,当然必须使用&amp; 来获取n1 的地址而不是他的数值。

使用:double forward = myEulerForward1(&amp;k);

【讨论】:

    【解决方案2】:

    嗯,是的,可以将指针转换为int,反之亦然。

    但是,您在问这个问题时犯了一个严重的错误。在某些情况下,将int 转换为指针(反之亦然)是有意义的。但是,在您的代码中,您会将其用作强制编译器接受错误代码的钝器。

    您的编译器正在抱怨,因为您已将 int 传递给需要 int * 的函数。

    通过将int 转换为指针来解决问题,将停止编译器抱怨,但随后您(可能)会遇到某种形式的运行时错误,因为函数将收到无效指针。

    你的选择是

    • double myEulerForward1(int *n1) 中删除*。这意味着,该函数需要一个 int,因此您传递 int 的代码将是正确的。
    • 将函数调用为myEulerForward1(&amp;k),它将k(不是k转换为指针)的地址作为指针传递。

    查看myEulerForward1() 的正文还有其他问题。您需要阅读并更好地理解sizeof 的作用。无论您的函数接受 int 还是指针 (int *),您的函数的逻辑都是错误的。

    【讨论】:

      猜你喜欢
      • 2017-02-12
      • 2012-03-02
      • 2014-05-02
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多