一个指针与地址的有关问题
一个指针与地址的问题?
#include <stdio.h>
void change_it(int []);
int main()
{
int a[5], *p;
p = a;
printf("p has the value %p\n", p);
change_it(a);
p = a;
printf("p has the value %p\n", p);
getch();
return 0;
}
void change_it(int a[]){
int i = 777, *q = &i;
a = q;
printf("p has the value %p\n",a);
}
//为什么change_it没有起到作用?
------解决方案--------------------
void change_it(int a[]){
int i = 777, *q = &i;
a = q;
printf("p has the value %p\n",a);
}
中int i 是局部变量生命周期只是这个函数,是传不出去的
------解决方案--------------------
这个问题前段时间遇到过,这个是因为实参只是把它的值赋给形参,形参(你这的指针地址指向改变)中途如果地址改变,则与实参无关,实参不会跟着把指向改变。所以指向的值也自然不会改变,记住的是,实参只是把值copy一份给形参。形参(指针)在内存中重新占有个一个stack地址,指向的heap地方相同。
------解决方案--------------------
void change_it(int []);
int main()
{
int a[5], *p;
p = a;
printf("p has the value %p\n", p);
change_it(a);
p = a;
printf("p has the value %p\n", p);
getch();
return 0;
}
void change_it(int a[]){
int i = 777, *q = &i;
a = q;
printf("p has the value %p\n",a);
应该在定义函数的时候,把它写在主函数里面吧?
------解决方案--------------------
#include <stdio.h>
void change_it(int []);
int main()
{
int a[5], *p;
p = a;
printf("p has the value %p\n", p);
change_it(a);
p = a;
printf("p has the value %p\n", p);
getch();
return 0;
}
void change_it(int a[]){
int i = 777, *q = &i;
a = q;
printf("p has the value %p\n",a);
}
//为什么change_it没有起到作用?
------解决方案--------------------
void change_it(int a[]){
int i = 777, *q = &i;
a = q;
printf("p has the value %p\n",a);
}
中int i 是局部变量生命周期只是这个函数,是传不出去的
------解决方案--------------------
这个问题前段时间遇到过,这个是因为实参只是把它的值赋给形参,形参(你这的指针地址指向改变)中途如果地址改变,则与实参无关,实参不会跟着把指向改变。所以指向的值也自然不会改变,记住的是,实参只是把值copy一份给形参。形参(指针)在内存中重新占有个一个stack地址,指向的heap地方相同。
------解决方案--------------------
void change_it(int []);
int main()
{
int a[5], *p;
p = a;
printf("p has the value %p\n", p);
change_it(a);
p = a;
printf("p has the value %p\n", p);
getch();
return 0;
}
void change_it(int a[]){
int i = 777, *q = &i;
a = q;
printf("p has the value %p\n",a);
应该在定义函数的时候,把它写在主函数里面吧?
------解决方案--------------------
- C/C++ code
#include <stdio.h> int* change_it(int []); int main(){ int a[5], *p; p = a; printf("p has the value %p\n", p); p = change_it(a); printf("p has the value %p\n", p); getch(); return 0; } int* change_it(int a[]){ int i = 777, *q = &i; a = q; return a; }
------解决方案--------------------
void change_it(int a[]){
int i = 777, *q = &i;
a = q;
printf("p has the value %p\n",a);
}
=================
这个函数的形参a是一个指针变量,不是数组。
main函数的调用
change_it(a);
是把main函数中定义的数组首元素地址&a[0](简写为a)作为实参传给了change_it函数的形参a
一般地常说成形参指针a指向了main函数的数组a
在change_it函数中用a指针可以对数组a的各个元素进行读写操作(代码中没有任何这样的操作)
当在change_it函数中用
a=q;
则指针a指向了函数中局部变量q,与数组a就没有关系了----
代码又没有返回值操作,指针a(形参也是一种局部变量)自生自灭了。
综上所述,change_it函数的调用过程没有对实参数组a进行任何操作。(允许的操作也只是读写数组a 的各个元素,不能改变数组a的存储位置----似乎LZ想让数组a变换到别处去)
------解决方案--------------------
void change_it(int a[]){
int i = 777, *q = &i;
a = q;
printf("p has the value %p\n",a);
}
一 、执行这句printf("p has the value %p\n",a);应该打印出的是i的地址;
二、但是这个函数执行完之后,a的值是不会改变的,其实a还是作为形参传进去,只不过这里的形参是指诊而已
三、函数中i是函数内的,是在栈中的数据,当退出这个函数之后,i处的值是不可预知的。
所以,即使改了第二条,结果还是不能预知的。
------解决方案--------------------
并没有对数组中的值进行操作,返回的时候呢也没有返回其值。
传引用其实是值通过操作指针指向的单元数据,而更改了单元数据的内容,达到了调用函数的目的。
传值只是把实参的那个值传给形参,并不是把实参本身传递给形参(也就是说不是用实参替换了形参),
所以你调用了某个函数,也不会改变实参本身的值。