1.变量声明与定义:
声明只是告诉编译器有这么一个变量,而定义在声明的同时便进行内存分配。
//------1.cpp--------------
using namespace std;
extern int n;//声明变量n,只告诉有这么一个名字
void function(int a){....};//定义形参a,并分配内存
int main(){
int i; //定义变量i,并分配内存
return 0;
}
其中,对于函数function,形参a的生存期在函数体内,在函数结束工作后,a便被释放,从栈中弹出。(a所占的内存和内存地址现在没有变量使用了),来看下面的代码;
using namespace std;
int *p=NULL;
void fun(int a){ p=&a;}
int main(){
int n=10;
fun(n);
cout<<p;
return 0;
}
代码执行的结果是显示a的内存地址,然而在原来的我理解是a仍然占着这块内存区域,但是其实不是的,a早已被弹出栈,所以这块区域是空着的。之所以会这样,是因为指针p是全局的,p存放了a的地址,p的生存期没有结束,所以仍指向这块地址,所以会显示a的原来的内存地址。
由此,我就理解了传值返回和引用返回,为什么引用返回不能返回局部变量。第一,引用返回返回的是实际地址,即可用的。第二,如果返回局部变量,那么局部变量结束生存期被释放后,那块内存就空着了,没有变量用,所以不能操作........如果用传值返回返回局部变量却是可行的,因为传值返回在执行renturn 语句的时候要进行拷贝,把即将释放的局部变量的值拷贝到临时变量上。。
再来就是对于new和delete:
//-----------------------------2.cpp--------
using namespace std;
int main(){
int *p=new int(4);//p存储在栈中,动态分配得到的内存存在堆中,从而通过指针指向一个无名字的堆来进行相关的操作.......
................
...........
delete p;//释放p,p还是指向原处,因为p没被释放,被释放的是无名字的堆内存区块!!
return 0;
}
所以,我就理解认为,其实在编写代码时用到的变量,只不过是给底层的内存区域提供一个名字,然后间接地操作内存的内容...................