全局变量问题

#include<iostream>
using namespace std;
char *p;
void fun(char *p)
{
char *q=new char;
*q='5';
p=q;

}
int main()
{
char b='6';
p=&b;
fun(p);
cout<<*p;
return 0;
}

输出为6;

#include<iostream>
using namespace std;
char *p;
void fun(char *p)
{
char *q=new char;
*q='5';
*p='5';

}
int main()
{
char b='6';
p=&b;
fun(p);
cout<<*p;
return 0;
}
输出就为5了?
我觉得这两个程序意思一样啊,请详细点解释给我,谢谢,fun函数里的p指针不是局部变量吗,为什么第2个程序就能改变全局变量p的值啊?

好吧,给你稍微讲解下地址和地址的值的。
在计算机内存中内存的地址是唯一的,值是不唯一的。
定义了char *p时,只是申明一个指针,还没有内存中还没有分配空间。当定义变量 char b='6';
时,系统就在内存中开辟一个空间存在这个变量,并有唯一地址,这是P=&b,那么指针P就指向了这个地址。
好,现在调用子函数fun();
在调用子函数的过程中都是传递实参的副本,也就是一个复制版本。在子函数中改变实参的副本对实参是没有影响的。
但是,当参数是指针的时候,子函数通过访问地址就可以改变改地址里面的值,而地址是唯一的,所以子函数中修改该唯一地址的值当然修改了主函数中实参所指地址的值了。
void fun(char *p)
{
char *q=new char;
*q='5';
p=q;

}
在这个子函数中,形参*P只是主函数中*P的一个副本,所以子函数中P的指向的改变对主函数中的没有影响。也就是说这个子函数并没有改变主函数中*P指向的地址中的值。
void fun(char *p)
{
char *q=new char;
*q='5';
*p='5';

}
这个子函数中就改变了主函数中P指向的地址的值。
希望楼主仔细品味下,子函数到底是改变指针的指向,还是改变指针指向的地址的值。而最后输入的指针的值时,弄清楚是输出哪个地址里面的值。
另外记住一点,指针可以改变指向,但是地址是固定不变的。追问

是不是说fun函数中的指针p和main()函数中的指针P不是同一个指针,但是这两个指针指向的地址都是b的地址?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-21
char b='6';
p=&b; // p指向b的地址, b的值为'6';

第一个函数(注意有内存泄露哦):
void fun(char *p)
{
char *q=new char; // 创建一个新的char对象,q指向其地址
*q='5'; // q指向的地址中赋值为'5'
p=q; // 修改p的值,p是函数fun(p)传递进来的拷贝的值,函数调用完成后p仍然
// 指向b的地址,b的值没有变过,所以cout<<*p;输出6
}

第二个函数:
void fun(char *p)
{
char *q=new char;
*q='5';
*p='5'; // p同样是传递进来的b的地址,*p='5'指的是b地址的值被赋值为'5'了
// 注意这里改变的是p所指向的b中值,b的地址是确定的。
}

总结下啊,第一个函数改的是指针p的值,第二个函数改的是p指向的地址中的值,地址是唯一的
第2个回答  2012-07-21
#include<iostream>
using namespace std;
char *p;
void fun(char *p)
{
char *q=new char;
*q='5';
p=q;//这里赋值 当函数调用结束时 没有作用 因为函数是void类型


#include<iostream>
using namespace std;
char *p;
void fun(char *p)
{
char *q=new char;
*q='5';
*p='5';//这里已经修改了值 函数返回的地址不变 里面的值就是修改过后的 所以上面是6下面是5

}
int main()
{
char b='6';
p=&b;
fun(p);
cout<<*p;
return 0;
}

}
int main()
{
char b='6';
p=&b;
fun(p);
cout<<*p;
return 0;
}本回答被网友采纳
第3个回答  2012-07-21
#include<iostream>
using namespace std;
char *p;
void fun(char *x)
{
char *q=new char;
*q='5';
x=q;

}
int main()
{
char b='6';
p=&b;
fun(p);
cout<<*p;
return 0;
}
//这样你就能理解了,p仍然指向b,而b的值仍然是6
同样下面那个,p仍然指向b,但b的值变成了5
相似回答