我想在想要改变价值观时需要双指针

时间:2014-05-20 02:05:08

标签: c function pointers pointer-to-pointer

在研究双指针时,一般的共识似乎是当想要更改任何变量的值并在从函数返回时保留新值,然后需要传入其指针值。

当已经使用指针时,需要传入双指针。

以下示例处理代码主要部分中的指针,将同一指针传递给函数,更改其值,并在main中显示新值。

根据我读到的内容,应该需要双指针,否则新值在main中不可见。

如果这确实有效,那么如何修改它以显示需要双指针?

void func1(int *z)
{
(*z)++;
printf("z=%d\n", *z);
}   


int _tmain(int argc, _TCHAR* argv[])
{

int x = 100;
int *y = &x;
printf("y=%d\n", *y);
func1(y);
printf("y=%d\n", *y);
return 0;
}

4 个答案:

答案 0 :(得分:2)

如果要更改y指向的内容,则需要指向指针的指针,例如: -

static int blah = 42;
void func1(int **z)
{
(*z) = &blah;
printf("z=%d\n", *(*z));
}   

int _tmain(int argc, _TCHAR* argv[])
{

int x = 100;
int *y = &x;
printf("y=%d\n", *y);
func1(&y);
// y does not point to x anymore;
printf("y=%d\n", *y);
return 0;
}

在您的原始版本中您正在更改x,在此您将单独留下x并更改指针y。

通常你不会那么多地使用它们(你经常使用它们)但更常见的是指向指针的指针是一种更有趣的类型。

所以...

typedef struct 
{
   int *y;
} Z;

void f(Z *z)
{
  z->y = &blah;
}

void main()
{
  int x;
  Z a;
  a->y = &x;
  f(&a);
}

所以这实际上是相同的,但是现在你使用一个结构来保存指针,并且你将结构的指针作为“指向指针的指针”传递,除了它现在指向包含结构的指针一个指向int的指针。

但是你更有趣地说出了一些事情: -

typedef struct 
{
  char *name;    
} Person;

static char* default_name = "blah";
void set_default_name_of_person(Person* person)
{
   person->name = default_name;
}

void main()
{
   Person person;
   set_default_name_of_person(&person);
}

现在您的代码开始看起来像您实际编写的内容。 (除了这是一个人为的例子)

答案 1 :(得分:0)

首先 - 说“指针指针”更清晰,因为“双指针”可能是double *

假设T是某种类型,您有:

T t;
func( &t );

要让func能够更改t,它必须知道t的地址。对象的地址是指向该对象的指针(这是术语指针的定义)。

所以函数签名必须是:

func( T *t_ptr )

在您的示例中Tint。也许你会混淆T已经是指针类型的例子。指针类型没什么“神奇”的。 int *int **以及int ***是类型,就像int一样。同样的规则也适用于所有这些规则。

如果Tint *,则函数签名必须与func( int **t_ptr_ptr )类似,依此类推。

答案 2 :(得分:0)

指针很简单。把它当作一种地址吧。

有一个盒子。这个盒子有一个牌号,上面写着1-101。

框是变量,铭牌是指针,1-101是实际地址(抽象概念)。

我可以给你盒子,你可以用纸填充它,但我也只能给你看号牌,你可以到达盒子并填满它。

假设有一个带有'pp1-100'的号牌,你找到了板架,但它是另一个带有'p1-100'的号牌。您再次找到持有人并找到该框。

这是'指向指针'。


为什么我们需要双/三/四指针?因为我们想要它,出于各种原因(但是谁在乎?)。

答案 3 :(得分:-1)

您已使用该功能更改x的值,也称为*y

您已经看到的代码段并未尝试更改x的值,但实际上正在更改y的值,以便y指向某个内容函数调用后不同。为了使函数更改y的值,它需要一个指向y的指针。由于y已经是指针,因此最终会得到指向指针的指针。

您的代码已重写,以更改y指向的内容,以便在函数调用后,y指向w并且printf显示333

void func1( int **yptr, int *wptr )
{
    *yptr = wptr;
}

int main( void )
{
    int x = 100;
    int w = 333;

    int *y = &x;
    func1( &y, &w );
    printf( "*y=%d\n", *y );

    return 0;
}