我只是尝试不同的是传递指针,我遇到了这个疑问。
我们可以使用解除引用将指针值存储到指针,即(* 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.
1。 swap(&a,&b);
这是可能的
2. swap(*x,*y);
这是不可能的。为什么呢?
任何人都可以在指针上发布好的材料。
答案 0 :(得分:3)
你的第二个例子应该是
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)
或使用gcc扩展名,如下所示:
#define SWAP(a, b) do { typeof(a) _temp = a; a = b; b = _temp; } while (0)
答案 1 :(得分:2)
请注意,在您的情况下,&a
相当于x
。
为什么要*x
?我没有通过x
simmilar 来传递&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);
只需使用swap (x, y)
。
作为旁注: C
使用pass by value方法。如果您在函数内部将值作为函数参数传递,则它将在函数的本地范围内的变量中接收,并且对它们所做的任何更改都不会反映在实际参数中。
这就是为什么,你需要传递变量的地址,而不是值本身。
答案 2 :(得分:1)
第二个是不可能的,因为在这种情况下你将使用pass by value而不是指针,因此,被调用函数中的值将被更改,但是,不会反映在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;
}
已完成。
答案 3 :(得分:1)
在int *x,*y;
后,*x
和*y
的类型为int
。您的swap
函数需要两个int*
作为参数,而不是两个int
。