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。
不知道你这个问题是否已经解决, 如果还没有解决的话: