[英]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);
這里。 y
是int *
,所以&y
產生int **
,這是錯誤的,根據函數定義的返回類型[e。
改變
return (&y);
到
return y;
當你返回一個int *
,而y
已經是一個。
接下來,函數調用也存在同樣的概念問題。 而不是res=sum(a,&b);
, 你只需要傳遞b
,因為它已經是一個指針。
另外請注意,
main()
簽名是int main(void)
。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
的地址,但使用指針的方法只是省略&
,因此只傳遞b
: sum(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
指向與y
和b
相同的地址。
使用指針將地址分配給另一個指針的地址,例如:
/* 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.