使用指针调用函数

时间:2015-06-29 07:20:58

标签: c function pointers compiler-errors

任何人都可以解释我为什么会收到错误

  

无法将int **转换为argument1的int *

我已经看到了所有堆栈溢出的答案,但没有找到解决问题的方法。我的代码

#include<stdio.h>

int* sum(int,int*);

int main()
{
    int a=5;
    int *b;

    *b=6;
    int *res;

    res=sum(a,&b);
    printf("\n%d\n%d\n",a,*b);
    printf("%d",*res);
}

int* sum(int x,int *y)
{
    x=x+1;
    *y=*y+3;
    return (&y);
}

这是一个基本问题,但我发现很难解决错误。

4 个答案:

答案 0 :(得分:5)

  

解析度=总和(A,和b);

这里b已经是一个指针(一个未分配的整数指针,可能导致未定义的行为)。所以&amp; b的类型为int **。所以只通过b。

res(a,b);

之后返回&amp; y也是int **类型,如果要返回地址,则将其更改为y(类型为int *)。

return y;

答案 1 :(得分:3)

在你的情况下,

 int* sum(int x,int *y)

函数接受intint *,最后返回int *。现在,在函数定义中,您正在编写

return (&y);

这里。 yint *,因此&y生成int **,这是错误的,根据定义的返回类型[函数的e。

变化

 return (&y);

return y;

当您返回int *时,y已经是一个。

接下来,函数调用也会出现同样的概念问题。您需要仅传递res=sum(a,&b);,而不是b,因为它已经是指针。

另外,请注意,

  1. main()的推荐签名为int main(void)
  2. return不是函数。您通常不需要围绕它的表达式,特别是当使用变量名 作为表达式时。

答案 2 :(得分:2)

  

任何人都可以解释我为什么会收到错误

查看你的代码片段:

int a=5;       /* initializes a to value 5        */
int *b;        /* declares pointer b              */

*b=6;          /* OPS, segfault here              */
int *res;      /* declares pointer res            */

res=sum(a,&b); /* assigning to the address of res */

声明*b = 6;是错误的,你不应该这样做。您正尝试将值6分配给未动态分配的指针,并且您尚未将其设置为指向任何地址。

您应该做的是,首先使指针指向变量的地址,例如:

int c = 3;
int *b = &c; /* create a pointer 'b' and make that
                pointer point to the address of c */
*b = 6; /* OK */

注意初始化int *b = &c;,声明然后分配b = &c之间的外观差异:

int *b; /* declaring a pointer 'b'                 */
b = &c; /* make that pointer point to address of c */

接下来,您创建一个指针变量&#39; res&#39;并尝试将sum的返回值赋给res的地址:

int *res;         /* declaring pointer 'res' */
res = sum(a, &b); /* OPS, 'b' is a pointer   */

查看函数&#39; sum&#39;,您尝试将参数int *y指向b的地址,但使用指针执行此操作的方法只是省略&,因此只传递bsum(a, b);

现在,sum的返回值为:

int* sum(int x,int *y) /*
   ^ sum returns a pointer to int */

根据您的代码,您希望将函数sum的结果分配给res地址,因此您要分配地址< / {{>} yres地址

res=sum(a,b); /* calling function sum */

int* sum(int x,int *y) /* 'y' points to address of b */
{
    x=x+1;
    *y=*y+3;
    return y; /* returning the address */
}

当总和返回时,res指向与yb相同的地址

使用指针将地址分配给另一个指针的地址,例如:

/* a and c are int's */
int *x = &a;
int *y = &c;
x = &y; /* wrong */

虽然这是正确的:

int *x = &a;
int *y = &c;
x = y;  /* ok */

答案 3 :(得分:1)

由于yint* y(指向int的指针),因此&yint**(指向int*的指针或指针指向int)的指针,但您的函数(sum)必须返回int*,而不是int**。您只需将return &y更改为return y即可解决此问题。