簡體   English   中英

使用指針的函數調用

[英]function call using pointers

誰能解釋我為什么會收到錯誤

無法將參數 1 的 int ** 轉換為 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);
}

這是一個基本問題,但我發現很難解決該錯誤。

res=sum(a,&b);

這里 b 已經是一個指針(一個未分配的整數指針,可能會導致未定義的行為)。所以 &b 是 int ** 類型。 所以只通過 b。

res(a,b);

之后,如果您想返回地址,返回也是 int** 類型的 &y 將其更改為 y (類型為 int *)。

return y;

在你的情況下,

 int* sum(int x,int *y)

函數接受一個int ,一個int *並最終返回一個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不是函數。 通常不需要在它的表達式周圍加上括號,特別是當使用變量名作為表達式時。

誰能解釋我為什么會收到錯誤

逐段檢查您的代碼:

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;之間的外觀差異int *b = &c; , 並聲明然后分配b = &c

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

接下來,您創建一個指針變量 'res' 並嘗試將 sum 的返回值分配給 res 的地址:

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

查看函數 'sum',您試圖讓參數int *y指向b的地址,但使用指針的方法只是省略& ,因此只傳遞bsum(a, b);

現在, sum的返回值為:

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

並根據您的代碼,要函數的結果分配sum到的地址res ,因此,你要的地址分配y到的地址res

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 */
}

當 sum 返回時, 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 */

因為y是一個int* y (指向int指針),那么&y是一個int** (指向int*指針或指向指向int指針的指針),但是您的函數( sum )必須返回int* ,而不是int** 您只需將return &y更改為return y即可解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM