在研究按值传递机制时,发现一些模糊的概念。就是在对一个原本的(指针)变量重新给定另外一个值时,会不会改变这个变量原本所在的内存位置(即地址)。因此,决定深入研究一下。而且这也是必要的。
-
- 给一个变量重新赋值时,地址的变化
1 //验证变量在被赋值(以及被重赋值)时原本分配的内存地址是否会改变。 2 3 #include <stdio.h> 4 5 int main(void) 6 { 7 int a;//声明a,即已经给a分配一个内存地址 8 printf("声明a时的地址:%p\n", &a); 9 10 a = 1; //初始化a 11 printf("The address of origin: %p\n", &a);//输出a=1时的地址 12 13 //int a = 2; ----> 不能以这种方式对a重新赋值. 否则会产生错误:‘a’重定义 14 scanf("%d", &a);//对a重新赋值。 15 printf("The address of later: %p\n", &a);//被重新赋值后的地址 16 17 return 0; 18 }
运行结果:声明a时的地址:0x7ffc3cabc31c
The address of origin: 0x7ffc3cabc31c
2 ->这个2是我输入的。
The address of later: 0x7ffc3cabc31c
结论:在声明时给变量a划分的地址,会在变量作用域内一直保持不变。原本a=1时,地址是xxx,在第a重新赋值时,会先将a内的数删除,然后再将新的数放进去,这个新的数的地址还是xxx。即地址一直不变,变得是这个地址里的数。(就像租房,有效期内房子一直不变,变的是住的人) - 在对指针指向的地址重新赋值时,指针所指向的地址是否会改变?
1 //验证对指针所指向的值重新赋值时,指针是否会改变。 2 #include <stdio.h> 3 4 int main(void) 5 { 6 int *p = NULL; 7 int a = 1; 8 printf("p指针存储的地址:%p\n", p); 9 printf("p指针的地址:%p\n", &p); 10 11 p = &a; 12 printf("p指针存储的a地址:%p\n", p)
- 给一个变量重新赋值时,地址的变化