关于参数传递的一些疑问。
大家都知道,我们形参为非引用类型的时候,传递过去的只是实参的一个副本,但是我有一个疑问,
既然是副本为什么地址还是一样的,
例如程序 :
[解决办法]
你传递过去的是一个类型为int*的指针变量
void func(int* a)
{
}
int* b;
func(b);
在调用func函数的时候,将b复制为a,b和a是两个不同的变量,它们处于内存中不同的位置,拥有不同的地址,但它们的值是相同的,因为a是b的复制结果,所以两个指针指向同一个位置
[解决办法]
你传进去的p和函数里面拿到的p,地址是不一样的!
但是p的类型是指针,所谓指针,就是一种特殊的变量,这个变量的内容是一个地址!
你把p作为参数传递给函数的时候,它才不管你指针不指针,都跟普通的变量一样处理,普通的变量怎么处理?就是创建一个副本,把p的内容拷贝过来!
也就是说,函数拿到的是p的副本!跟原来的p不是一个东西,当然地址也就不一样!但是它们的内容是一样的!内容是什么,内容就是它们所指向的那个东西的地址!
注意区分指针自己的地址和指针包含的那个地址!
[解决办法]
函数中的变量都是在栈上,作用域为该函数,函数结束变量消失;
传值与传地址本质上都是传的值;只不过传地址这个值可以用它来改变放在该地址上的变量;
楼主可以试下下面的测试
int a =1;
int *p=&a;
testpointer(p,a);
void testpointer(int *p,int q)
{
*p = 1; // 可以改变实参指向的值
if(p==&q)//q是重新在栈上申请的,故p!=&q
{
printf("yes!!!\n");
}
p = 0; // 把指针置为空,属于p的副本。
}
[解决办法]
形参指针p,他和实参的指向是一样,你理解成他们的地址一样是错的,这个指针的地址&p和实参的地址是不一样的。如:int fun(int *p),你调用时传入实参*q,即fun(q),是指针q指向的地址传给形参*p的,即*q==*p,而储存这2个指针的地址是不一样的,实参q的地址可能局部变量在堆栈区,也可能是全局变量在静态数据区,而调用的fun(q)的时候,CPU在内存堆栈区分配一个局部指针变量p,仅仅使*p==*q,而&p!=&q的,理解了没有?
[解决办法]
楼主,不是传了指针就是传地址了,你上面程序中指针本身也是一个变量,是传值,当然不能改变p的值了。
你最上面的这个程序改为这样看看:
void testpointer(int **p)
{
**p = 0; // 可以改变实参指向的值
*p = 0; // 把指针置为空
}
int main()
{
int a=1;
int *p=&a;
testpointer(&p);
printf("%d",a);a=0,在上面通过指向指针的指针改变了它的值
printf("%d",*p);//报错,因为p=0了
return 0;
}