为什么我们不能将指针指向指针?

时间:2014-12-20 12:12:51

标签: 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);
 swap(*x,*y);/*why this is not possibel*/

}

   *p=*q when this is possible.

1。 swap(&a,&b);这是可能的  2. swap(*x,*y);这是不可能的。为什么呢?

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

4 个答案:

答案 0 :(得分:3)

你的第二个例子应该是

swap(x,y);

x=&ay=&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的数据类型为intx的数据类型为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