我正在编写一个编程任务,并且在使用指针时遇到了一些麻烦.下面的代码示例不是来自我的作业,而是说明了我遇到的问题.我正在尝试将指针传递给另一个函数(从更改到真正)并让该函数创建一个新对象然后返回它.但是,我发现原始对象并没有真正改变.我无法弄清楚为什么不这样做,因为我正在使用malloc在堆上分配它,因此该对象应该在创建它的函数之外继续存在.
在下面的代码示例中,我正在寻找输出:
a = 3
a = 5
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了
a = 3
a = 3
Run Code Online (Sandbox Code Playgroud)
即使是正确方向的一些指针也会有用!谢谢!
山姆
笔记
示例代码
#include <stdio.h>
#include <stdlib.h>
void really(int *a) {
/* Allocate pointer to new int, set it to 5, and
then set the pointer passed in equal to the new pointer */
int *b = malloc(sizeof(int));
*b = 5;
a = b;
}
void change(int *a) {
/* We don't actually change the object in this function;
we are instead passing it to a different function to change */
really(a);
}
int main() {
int a = 3;
printf("a = %d\n", a);
change(&a);
printf("a = %d\n", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C只支持pass by value.当您将指针传递给函数时,指针的值(即它指向的地址)将被复制到function-parameter,一个新变量.
在您的函数中really(),您已通过指向a的地址覆盖新指针存储的地址b.所以,这不会反映出来main().但如果您已取消引用a并为其分配了新值5,则ain 的值main()也会发生变化.