c语言有关作用域的问题
假设voidmain(){structStudent*p//调用这个函数会return回一个指针p=create();//这个时候如果再把p传进某个函数insert(p)...
假设
void main()
{
struct Student *p
//调用这个函数会return回一个指针
p = create();
//这个时候如果再把p传进某个函数
insert(p);
//调用这个函数把p的内容输出
list(p);
这个时候出问题了,我在insert这个函数里面把传进去的p的指向改了,然后在主函数里输出的时候,好像我在insert里改变的p的指向,并没有影响的主函数里原来的那个p.
} 展开
void main()
{
struct Student *p
//调用这个函数会return回一个指针
p = create();
//这个时候如果再把p传进某个函数
insert(p);
//调用这个函数把p的内容输出
list(p);
这个时候出问题了,我在insert这个函数里面把传进去的p的指向改了,然后在主函数里输出的时候,好像我在insert里改变的p的指向,并没有影响的主函数里原来的那个p.
} 展开
2个回答
展开全部
按你的说法,你在「insert(p);」这一句传入了指针p,实际上只是把main()中的指针p传递给了insert()函数的形式参数。
而一旦进入insert()函数之后,就算在insert()函数中,传入参数的名字也是p,它也只不过是main()中的指针p的地址的一个拷贝而已。你把insert()中的这个叫p的指针的指向改变了,实际上只是改变了从main()传来的指针p的一个拷贝的指向而已,最后如果你不把改变指向后的指针返回并赋值给main()中的p的话,main()中的p肯定是不会变的。
或者,在main()函数中,把指针p的本身的地址传递作为形式参数传递给insert()函数,这样的话,在insert()函数中改变了位于内存中那个地址的指针的指向的话,那么即使不使用return语句,在回到main()函数之后,原来的指针p的指向也变了,毕竟指针所在的内存地址就一个嘛,它同一时间也只能指向一个位置,所以在insert()里把位于这个地址的指针的指向改变了的话,在main()里读取到位于这个地址的指针的时候,这个指针的指向也是被改变之后了的,因为它不能既指向这个位置又指向那个位置。
(如有帮助,烦请采纳,谢谢!)
而一旦进入insert()函数之后,就算在insert()函数中,传入参数的名字也是p,它也只不过是main()中的指针p的地址的一个拷贝而已。你把insert()中的这个叫p的指针的指向改变了,实际上只是改变了从main()传来的指针p的一个拷贝的指向而已,最后如果你不把改变指向后的指针返回并赋值给main()中的p的话,main()中的p肯定是不会变的。
或者,在main()函数中,把指针p的本身的地址传递作为形式参数传递给insert()函数,这样的话,在insert()函数中改变了位于内存中那个地址的指针的指向的话,那么即使不使用return语句,在回到main()函数之后,原来的指针p的指向也变了,毕竟指针所在的内存地址就一个嘛,它同一时间也只能指向一个位置,所以在insert()里把位于这个地址的指针的指向改变了的话,在main()里读取到位于这个地址的指针的时候,这个指针的指向也是被改变之后了的,因为它不能既指向这个位置又指向那个位置。
(如有帮助,烦请采纳,谢谢!)
更多追问追答
追问
就是说要看这个变量本身是什么类型的,和普通变量一样,普通变量的话要传址要取他的地址传进去,但他本身就是一个指针变量了,要传这个指针变量的地址的话要再取一次地址,就需要一个指针的指针 是这样吗
追答
是的。
电脑上写了半天,被百度吞了!
贴一段代码,你看看吧。
#include <stdio.h>
void a_change(int **h) // change the direction of pointer's self address
{
int k=20;
*h=&k;
}
int* b_change(int *m) // change the value of pointer's box
{
int n=10;
*m=n;
//or
// m=&n;
return(m);
}
void main()
{
int a,b,*p,*q;
a=2,b=4;
printf("change the direction of pointer's self address.\n");
a_change(&p);
printf("*p is %d.\n",*p);
printf("change the value of pointer's box.\n");
q=&b;
q=b_change(q);
printf("*q is %d.\n",*q);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询