C 为什么可以';我们不能将解引用指针传递给指针吗?

C 为什么可以';我们不能将解引用指针传递给指针吗?,c,C,我只是在尝试不同的传球方式,我遇到了这个疑问 我们可以使用解引用将指针值存储到指针,即(*p=*q)为什么不可以通过函数传递呢 void swap(int *p,int *q) { int temp=*p; *p=*q; /** when this is possible**/ *q=temp; } int main() { int a=5,b=10; int *x,*y; x=&a; y=&b; swap(&a,&b); swap(x,y);

我只是在尝试不同的传球方式,我遇到了这个疑问

我们可以使用解引用将指针值存储到指针,即(*p=*q)为什么不可以通过函数传递呢

void swap(int *p,int *q)
{
int temp=*p;
*p=*q; /** when this is possible**/
*q=temp;
}



int main()
{
 int a=5,b=10;
 int *x,*y;
 x=&a;
 y=&b;
 swap(&a,&b);
 swap(x,y);
 swap(*x,*y);/*why this is not possibel*/

}

   *p=*q when this is possible.
一,<代码>交换(&a和&b)这是可能的 2. <代码>交换(*x,*y)这是不可能的。为什么?


任何人都可以在指针上深入发布好的材料。

请参见,
&a
在您的情况下相当于
x

为什么要
*x
?传递
x
与传递
&a
相似吗

*x
的数据类型为
int
x
的数据类型为
int*
。函数期望传递的参数类型为
int*

也许值得一提[在代码的上下文中]

void func(int p,int q)
应称为
func(a,b)

这并不意味着,
void func(int*p,int*q)
应称为
func(*a,*b)
,而应称为
func(&a,&b)

只需使用
交换(x,y)

作为旁注:
C
使用传递值方法。如果将值作为函数参数传递,则在函数内部,它将在函数的局部范围内的变量中接收,对它们所做的任何更改都不会反映在实际参数中


这就是为什么,您需要传递变量的地址,而不是值本身。

请参见,
&a
在您的情况下相当于
x

为什么要
*x
?传递
x
与传递
&a
相似吗

*x
的数据类型为
int
x
的数据类型为
int*
。函数期望传递的参数类型为
int*

也许值得一提[在代码的上下文中]

void func(int p,int q)
应称为
func(a,b)

这并不意味着,
void func(int*p,int*q)
应称为
func(*a,*b)
,而应称为
func(&a,&b)

只需使用
交换(x,y)

作为旁注:
C
使用传递值方法。如果将值作为函数参数传递,则在函数内部,它将在函数的局部范围内的变量中接收,对它们所做的任何更改都不会反映在实际参数中


这就是为什么,您需要传递变量的地址,而不是值本身。

第二个是不可能的,因为在这种情况下,您将使用按值传递而不是指针,因此,调用函数中的值将被更改,但是,没有反映在main方法中,因为它们是该方法的本地对象,并且您没有使用指针

实现该解决方案的另一个可能的解决方案是,为此,您需要更改main中的函数调用。 函数调用将更改为

swap(x,y);  //don't use dereferenced pointers here as it will result in call by value.

void swap(int *p,int *q)
{
int temp=*p;
*p=*q;  (** when this is possible**)
*q=temp;
}

这就完成了。

第二个是不可能的,因为在这种情况下,您将使用传递值而不是指针,因此,被调用函数中的值将被更改,但不会反映在主方法中,因为它们是该方法的本地值,并且您没有使用指针

实现该解决方案的另一个可能的解决方案是,为此,您需要更改main中的函数调用。 函数调用将更改为

swap(x,y);  //don't use dereferenced pointers here as it will result in call by value.

void swap(int *p,int *q)
{
int temp=*p;
*p=*q;  (** when this is possible**)
*q=temp;
}

这就完成了。

int*x、*y之后
类型
*x
*y
int
swap
函数需要两个
int*
作为参数,而不是两个
int

int*x,*y之后
类型
*x
*y
int
。您的
swap
函数需要两个
int*
作为参数,而不是两个
int

您的第二个示例应该是

swap(x,y);
已经是
x=&a
y=&b

如果您想交换指针(而不是其内容),则需要以下内容:

void swapptr(int **p,int **q)
{
    int temp=*p;
    *p=*q;
    *q=temp;
}
请注意函数参数的不同定义

如果要进行常规交换,则需要传递类型的宏,如下所示:

#define SWAP(a, b, type) do { type _temp = a; a = b; b = _temp; } while (0)
#define SWAP(a, b) do { typeof(a) _temp = a; a = b; b = _temp; } while (0)
或者使用gcc扩展,如下所示:

#define SWAP(a, b, type) do { type _temp = a; a = b; b = _temp; } while (0)
#define SWAP(a, b) do { typeof(a) _temp = a; a = b; b = _temp; } while (0)

你的第二个例子应该是

swap(x,y);
已经是
x=&a
y=&b

如果您想交换指针(而不是其内容),则需要以下内容:

void swapptr(int **p,int **q)
{
    int temp=*p;
    *p=*q;
    *q=temp;
}
请注意函数参数的不同定义

如果要进行常规交换,则需要传递类型的宏,如下所示:

#define SWAP(a, b, type) do { type _temp = a; a = b; b = _temp; } while (0)
#define SWAP(a, b) do { typeof(a) _temp = a; a = b; b = _temp; } while (0)
或者使用gcc扩展,如下所示:

#define SWAP(a, b, type) do { type _temp = a; a = b; b = _temp; } while (0)
#define SWAP(a, b) do { typeof(a) _temp = a; a = b; b = _temp; } while (0)

*x
*y
的类型是什么?您的函数需要什么类型?函数需要地址??为什么它不能复制x和y的值。
*x
*y
的值是
int
。函数需要
int*
,它是
x
&a
。请查看下面的答案以获得澄清。
*x
*y
的类型是什么?您的函数需要什么类型?函数需要地址??为什么它不能复制x和y的值。
*x
*y
的值是
int
。函数需要
int*
,它是
x
&a
。检查下面的ansers以获得澄清。这不会交换任何东西,因为交换的变量在退出函数时丢失。这不会交换任何东西,因为交换的变量在退出函数时丢失。我不期望输出…当我们调用带有参数的函数时,它会复制变量,为什么第二个函数期望输出地址???@goutham请检查这种情况下的数据类型<代码>&a
int*
,而
*x