函数结束后,里面的局部变量还可以用吗
2012-04-02 16:59
239 查看
int *fun1()
{
int a = 1;
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
*p = 100;
cout<<"*p="<<*p<<endl;
return 0;
}
结果:
*p=1
*p=100
以上可以看出a在fun1中是个局部变量,按理说该函数结束后,a变量应该不能访问了,
但是上面的例子中,通过返回a的地址,在fun1()调用后,打印了a(也就是*p)的值发现
还是fun1()中a的初始值1,然后又对a进行赋值,发现也可以,没出错。从这里看出其
实一个函数中的局部变量在该函数结束后,很多情况下还是可以对它访问的,只要有它
的地址。上面的例子中,fun1()调用后打印a的值是1,这貌似是理所当然的,因为
fun1()中初始化a=1,而且后面也没明显有改变a值的操作。当然还是a为1咯!但是真是
这样吗?看下面代码:
int *fun1()
{
int a = 1;
cout<<a<<endl;
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
return 0;
}
上面代码执行后结果:
a=1
*p=4199929
(上面结果中*p就是a,p指向的就是变量a的地址,所以*p就是a)
发现调用fun1()后的a值竟然变了(1变成4199929),也没明显改变a值的操作啊,这是为什么呢?这个例子和第一个的区别只在于fun1()中只多了"cout<<a<<endl;"这句而已;难道是因为这句?对的,
就是因为这句代码,该句代码其实是这样的:cout.operator<<(a).operator<<(endl);
也就是说a作为实参传个了cout.operator<<();那是不是其他函数用a为实参时a也会变
化呢?
void power(int a)
{
int b;
b = a;
}
int *fun1()
{
int a = 1;
power(a);
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
return 0;
}
结果为:
*p=4199915
发现结果也变了。我们猜想是不是因为对a所在的内存进行了操作导致的呢?
int *fun1()
{
int a = 1;
int b = a;
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
return 0;
}
结果:
*p=1
把a的值赋给新建的变量b(对a的地址操作了),发现这样子的话,结果为1,没有改变。
void power(int a)
{
}
int *fun1()
{
int a = 1;
power(a);
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
return 0;
}
结果:
*p=4199915
其中power函数体内没对a有任何操作,a的值也发生了变化。可以证明是函数调用的准
备工作或者收尾工作导致了a的值变化,具体是什么原因小菜我目前也还不知道。^_^
指针是很强大的,但不要滥用指针。
---------本人菜鸟一只,文章如有错误,大牛们多多指出。
{
int a = 1;
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
*p = 100;
cout<<"*p="<<*p<<endl;
return 0;
}
结果:
*p=1
*p=100
以上可以看出a在fun1中是个局部变量,按理说该函数结束后,a变量应该不能访问了,
但是上面的例子中,通过返回a的地址,在fun1()调用后,打印了a(也就是*p)的值发现
还是fun1()中a的初始值1,然后又对a进行赋值,发现也可以,没出错。从这里看出其
实一个函数中的局部变量在该函数结束后,很多情况下还是可以对它访问的,只要有它
的地址。上面的例子中,fun1()调用后打印a的值是1,这貌似是理所当然的,因为
fun1()中初始化a=1,而且后面也没明显有改变a值的操作。当然还是a为1咯!但是真是
这样吗?看下面代码:
int *fun1()
{
int a = 1;
cout<<a<<endl;
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
return 0;
}
上面代码执行后结果:
a=1
*p=4199929
(上面结果中*p就是a,p指向的就是变量a的地址,所以*p就是a)
发现调用fun1()后的a值竟然变了(1变成4199929),也没明显改变a值的操作啊,这是为什么呢?这个例子和第一个的区别只在于fun1()中只多了"cout<<a<<endl;"这句而已;难道是因为这句?对的,
就是因为这句代码,该句代码其实是这样的:cout.operator<<(a).operator<<(endl);
也就是说a作为实参传个了cout.operator<<();那是不是其他函数用a为实参时a也会变
化呢?
void power(int a)
{
int b;
b = a;
}
int *fun1()
{
int a = 1;
power(a);
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
return 0;
}
结果为:
*p=4199915
发现结果也变了。我们猜想是不是因为对a所在的内存进行了操作导致的呢?
int *fun1()
{
int a = 1;
int b = a;
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
return 0;
}
结果:
*p=1
把a的值赋给新建的变量b(对a的地址操作了),发现这样子的话,结果为1,没有改变。
void power(int a)
{
}
int *fun1()
{
int a = 1;
power(a);
return &a;
}
int main()
{
int *p =fun1();
cout<<"*p="<<*p<<endl;
return 0;
}
结果:
*p=4199915
其中power函数体内没对a有任何操作,a的值也发生了变化。可以证明是函数调用的准
备工作或者收尾工作导致了a的值变化,具体是什么原因小菜我目前也还不知道。^_^
指针是很强大的,但不要滥用指针。
---------本人菜鸟一只,文章如有错误,大牛们多多指出。
相关文章推荐
- static(c中定义的关键字1、被其修饰者 外部无法使用(相反的都可以使用extern在外部使用) 2、函数局部变量使用成为静态的放入静态池-生存期改变。c++进行了扩充,使它在类中有了特殊作用)
- 函数里面有函数叫函数的闭包:子函数可以调用父函数变量,如果子函数找不到变量,那么整条作用域链的变量都会被保存
- static 全局变量与普通的全局变量的区别/static局部变量和普通局部变量的区别/static函数与普通函数的区别[转]
- 同一作用域下函数名(变量名)可以覆盖类、结构体名
- 局部栈变量不要传引用给可能切换线程的函数
- 设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值
- static全局变量与普通全局变量的区别?static局部变量与普通局部变量的区别?static全局函数与普通全局函数的区别?
- C语言的那些秘密之--函数返回局部变量
- php 函数里面可以有两个以上的返回值
- C语言之函数返回局部变量
- [Javascript]闭包是可以访问上一层函数作用域里变量的函数,即便上一层函数已经关闭
- 同一个类的不同对象,对象的成员函数可以互相访问各自对象的私有变量和私有成员函数
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- static作用(修饰函数、局部变量、…
- day18 函数定义、参数;名称空间;全局变量及局部变量。
- 关于指向空的对象指针可以访问类的不包含成员变量的成员函数的原因
- const定义的变量,可以作为数组[ ]里面的值吗?
- static--修饰(局部变量、全局变量、函数)
- windows 下征程结束程序后可以调用的函数
- gdb:不退出程序的情况下打印函数中的局部变量