在 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中的函数参数pmain中的变量p在内存中是不同的对象,更新一个不影响另一个。

如果您通过 &a,它 似乎 可以工作,因为您在调用 fun 之前将 main:p 初始化为 &amain: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 中,按引用传递意味着通过指向对象的指针间接传递对象。在这种情况下取​​消引用指针,您将可以直接访问原始对象。