指针值传递与址传递问题

img


指针p不是通过函数调用,执行k的地址了吗,怎么没有改变*p的值呢,这里不是地址传递吗

f 函数中改变的只是主函数中 指针p的副本所指向的地址,原主函数的指针p的指向没有变【你可以打印一下两个指针各自的地址看看,就知道指针作为入参是值传递】

// 你需要这样才会修改
* s = k;

在您的代码中,虽然指针p是通过函数调用,执行k的地址,但是*p的值没有改变,这是因为在函数内部对指针p进行的操作只是改变了它所指向的地址的值,而并没有改变p本身的值。因此,这里实现的不是地址传递,而是指针值传递。

在地址传递中,函数参数是一个指针类型,函数内部对参数的任何操作都会直接影响到原来的变量,因为它们在内存中指向同一个地址。而指针值传递则是将指针本身作为参数进行传递,函数内部对指针的任何操作都不会影响到原来的变量,因为它们在内存中指向不同的地址。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在这段代码中,虽然指针 p 的值传递给了函数 func,但是函数 func 中对指针所指向的变量 *p 的修改并没有被保留下来。这是因为 p 本身是一个指针变量,在函数 func 中修改 *p 的值只会影响 p 指向的变量,而不会改变 p 指向的地址本身。因此,即使在 func 中修改了 *p 的值,这个修改不会影响到原来的变量 k。

要想在函数中修改指针所指向的变量,并且保留修改后的值,可以将指针的地址传递给函数,也就是使用指针的指针。例如:

void func(int **pp)
{
    **pp = 20;
}

int main()
{
    int k = 10;
    int *p = &k;
    func(&p);
    printf("%d\n", k); // 输出 20
    return 0;
}

在这个例子中,函数 func 的参数是一个指向指针的指针 pp,它可以修改 p 指向的地址,从而改变 k 的值。在调用 func 函数时,使用 &p 传递 p 的地址。在 func 中,使用 **pp 访问 p 指向的变量 k,并将其值修改为 20。由于 pp 指向 p 的地址,所以这个修改会被保留下来,最终输出 20。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^