所以我随便做了我通常的理论证明代码(用代码测试东西)这些代码差异真的让我思考
#include <stdio.h>
int mutate(int a){
a+=1;
printf("%dn", a);
}
void main(){
int b = 1;
mutate(b);
printf("%d", b);
}
和
#include <stdio.h>
int mutate(int *a){
*a+=1;
printf("%dn", *a);
}
void main(){
int b = 1;
mutate(&b);
printf("%d", b);
}
为什么在第一个代码中有一个没有指针的改变?为什么会有暂时的变化?带有指针的代码我已经理解了。有人能解释一下吗?
您使用两种不同的方式传递参数。
mutate
函数的第一个实现使用按值调用其中输入参数的副本是在堆栈上创建的,它在本地被修改,正如您在打印结果中看到的那样。原始输入变量的值保持不变。
第二个使用通过引用调用其中给出了对输入变量的引用,因此修改了输入变量的值。
一个很好的解释见https://en.wikipedia.org/wiki/Evaluation_strategy,它还包含以下的例子,这是非常接近你正在做的:
void modify(int p, int* q, int* r) {
p = 27; // passed by value: only the local parameter is modified
*q = 27; // passed by value or reference, check call site to determine which
*r = 27; // passed by value or reference, check call site to determine which
}
int main() {
int a = 1;
int b = 1;
int x = 1;
int* c = &x;
modify(a, &b, c); // a is passed by value, b is passed by reference by creating a pointer (call by value),
// c is a pointer passed by value
// b and x are changed
return 0;
}
现在是输出的示例:
#include <stdio.h>
void mutate1(int a) {
a+=1;
printf("value of a inside mutate1: %dn", a);
}
void mutate2(int *a){
*a+=1;
printf("value of *a inside mutate2: %dn", *a);
}
int main(){
int b = 1;
printf("value of b before mutate1: %dn", b);
mutate1(b);
printf("value of b after mutate1: %dnn", b);
b = 1;
printf("value of b before mutate2: %dn", b);
mutate2(&b);
printf("value of b after mutate2: %dn", b);
return 0;
}
$ gcc -Wall mutate.c
$ ./a.out
value of b before mutate1: 1
value of a inside mutate1: 2
value of b after mutate1: 1
value of b before mutate2: 1
value of *a inside mutate2: 2
value of b after mutate2: 2
$
可以观察到,当使用调用值时,b
不会被修改。但是当使用时,它会通过引用调用.