我发现如果你将一个指针地址分配给一个FUNCTION中的另一个指针的地址,它就不会改变main中的in值, 然而,通过在main中做同样的事情,它会改变。那是什么原因呢?
void func(int *a, int *b){
b = a;
}
int main(){
int i= 5, k =6, *a=&i, *b=&k;
printf("%d %d\n",*a,*b); //output 5 6
b = a;
printf("%d %d\n",*a,*b); //output 5 5
a=&i;
b=&k;
func(a,b);
printf("%d %d\n",*a,*b); //output 5 6
printf("%d %d\n",*a,*b); //output 5 6
}
答案 0 :(得分:1)
在此功能中
void func(int *a, int *b){
b = a;
}
参数a和b是函数的局部变量。退出该功能后,它们将被销毁。该函数处理参数的副本。如果您希望函数本身更改原始参数,则必须将指针传递给它们。例如
void swap(int **a, int **b){
int *tmp = *a;
*a = *b;
*b = tmp;
}
答案 1 :(得分:0)
你的职能:
void func(int *a, int *b){
b = a;
}
没有做任何事情,它只需要两个代表内存地址的值作为参数,并将一个值分配给另一个,而不会产生任何外部影响。它只是将一个值写入另一个(可能甚至不是这样,因为编译器可能会检测到这是毫无意义并完全消除它),它不会对存储在这些地址的信息做任何事情。您需要将指针读取或写入其保存值的内存地址,但在当前形式中,函数不会将指针指定给另一个,而是将i
的值赋给{{ 1}}。
如果你想要一个函数来改变它之外的参数,你应该通过引用传递,它在C中只是通过指针传递,所以你需要传递一个指向指针的指针,而不是指针 - 这将传递一个指针该指针的副本 - 相同的值,当作为指针指针传递时,将传递指针在内存中的地址,而不是它所持有的值。
所以它应该是:
k
和void func(int **a, int **b){
*b = *a;
}
,您将通过func(&a,&b)
重现您在main
中所做的工作。