在研究双指针时,普遍的共识似乎是当想要更改任何变量的值并在从函数返回时保留新值时,需要传入其指针值。
如果已经在使用指针,则需要传入双指针。
以下示例处理代码主要部分中的指针,将同一指针传递给函数,更改其值,新值在 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;
}
如果您要更改 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);
}
现在您的代码开始看起来像您实际编写的代码了。 (除了这是一个人为的例子)
我是一名优秀的程序员,十分优秀!