在 C 中将指针变量作为函数参数而不是变量地址传递有什么问题?
What is wrong in passing pointer variable as an function argument instead of address of variable in C?
我知道如果我将 &a 作为参数传递给 fun ,我将在 [= 之后得到 *p =20 的结果15=]fun 被执行。现在在下面的代码中看到 p 是作为参数传递给函数 fun 的指针变量。但是编译后我得到的结果是 *p =10 而不是 20 .
将指针变量 p 而不是 a 地址,即 &a 传递给函数 fun[= 有什么问题24=]?
#include <stdio.h>
int a = 10, b = 20;
void fun(int *p)
{
p = &b;
}
int main()
{
int *p = &a;
fun(p);
//fun(&a);
printf("%d\n", *p);
return 0;
}
main和fun中的指针标识符p
不相同,即不指向同一个对象。
如果在 fun() 中你分配给 p,你实际上做 nothing。
局部参数 p 的值在 return
.
时简单地丢失了
fun
中的函数参数p
与main
中的变量p
在内存中是不同的对象,更新一个不影响另一个。
如果您通过 &a
,它 似乎 可以工作,因为您在调用 fun
之前将 main:p
初始化为 &a
。 main:p
根本没有更新。
要执行您想要的操作,您必须将 指针 传递给 p
:
void fun( int **p )
{
*p = &b;
}
int main( void )
{
int *p = &a;
fun( &p );
printf( "%d\n", *p );
return 0;
}
函数参数p
void fun(int *p)
{
p = &b;
}
是函数的局部变量。函数处理传递给函数的指针值的副本
fun(p);
因此在函数内部,更改的是其局部变量。
您可以想象函数及其调用方式如下(为了清楚起见,我将函数参数重命名为 ptr
)
fun(p);
//...
void fun( /* int *ptr */ )
{
int *ptr = p;
ptr = &b;
}
如您所见,原始指针 p
未更改。
如果要更改指针,则需要通过引用传递它。在这种情况下,函数看起来像
void fun( int **p)
{
*p = &b;
}
主要是叫
fun( &p );
在这种情况下,指针 p
(而不是其值的副本)确实会在函数中更改。
一般规则是,如果您想更改函数中的对象,您需要通过引用将其传递给函数。在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。在这种情况下取消引用指针,您将可以直接访问原始对象。
我知道如果我将 &a 作为参数传递给 fun ,我将在 [= 之后得到 *p =20 的结果15=]fun 被执行。现在在下面的代码中看到 p 是作为参数传递给函数 fun 的指针变量。但是编译后我得到的结果是 *p =10 而不是 20 .
将指针变量 p 而不是 a 地址,即 &a 传递给函数 fun[= 有什么问题24=]?
#include <stdio.h>
int a = 10, b = 20;
void fun(int *p)
{
p = &b;
}
int main()
{
int *p = &a;
fun(p);
//fun(&a);
printf("%d\n", *p);
return 0;
}
main和fun中的指针标识符p
不相同,即不指向同一个对象。
如果在 fun() 中你分配给 p,你实际上做 nothing。
局部参数 p 的值在 return
.
fun
中的函数参数p
与main
中的变量p
在内存中是不同的对象,更新一个不影响另一个。
如果您通过 &a
,它 似乎 可以工作,因为您在调用 fun
之前将 main:p
初始化为 &a
。 main:p
根本没有更新。
要执行您想要的操作,您必须将 指针 传递给 p
:
void fun( int **p )
{
*p = &b;
}
int main( void )
{
int *p = &a;
fun( &p );
printf( "%d\n", *p );
return 0;
}
函数参数p
void fun(int *p)
{
p = &b;
}
是函数的局部变量。函数处理传递给函数的指针值的副本
fun(p);
因此在函数内部,更改的是其局部变量。
您可以想象函数及其调用方式如下(为了清楚起见,我将函数参数重命名为 ptr
)
fun(p);
//...
void fun( /* int *ptr */ )
{
int *ptr = p;
ptr = &b;
}
如您所见,原始指针 p
未更改。
如果要更改指针,则需要通过引用传递它。在这种情况下,函数看起来像
void fun( int **p)
{
*p = &b;
}
主要是叫
fun( &p );
在这种情况下,指针 p
(而不是其值的副本)确实会在函数中更改。
一般规则是,如果您想更改函数中的对象,您需要通过引用将其传递给函数。在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。在这种情况下取消引用指针,您将可以直接访问原始对象。