动态分配内存
int num=1;
int arrays[10];
in *ptr_int = nwe int;//定义一个未命名变量
int *ptr_arrays = new int[10];//定义一个未命名数组
该段代码第3,4行分别动态定义了一个未命名变量和一个未命名数组。在运行阶段运行到该代码,计算机将为一个int值(变量或数组等需要定义的量)分配内存空间,是没有名字的,只是用ptr_int(ptr_arrays)指针指向该空间地址。所以,需要注意的是,定义时,该空间唯一标示就是它的指针,若此后对指针进行了算术运算,让指针指向了别处,本处的空间变量任然存在,但没有可以调用该空间的途径了,此时被称为内存泄露。故,应该特别注意,分配了动态内存并且使用完之后,记得用delete关键字进行释放内存。即以下代码:
delete ptr_int;//释放ptr_int指向的未命名变量。
delete [] ptr_arrays;//释放ptr_arrays指向的未命名数组。注意释放方式多了个中括号
动态分配的未命名内存只在运行时有效,编译时是不存在的。
int num[5];
int *nums =new int[5];
cout << sizeof(num) << "\t\t" << sizeof(nums);
上段代码运行结果为:20 4
注:
1.用new分配内存
指针的真正用武之地:在运行阶段分配未命名的内存用以存储值。
在此情况下,只能通过指针来访问内存。
2.使用delete释放内存
与new配对
不要释放已经释放的内存
不能释放声明变量分配的内存。
栈区(stack)
有编译器自动分配释放,一般存放函数的参数值、局部变量的值等
操作方式类似数据结构中的栈,先进后出
堆区(heap)
一般由程序员分配和释放,若程序不释放,程序结束时可能被操作系统回收
注意,与数据结构中的堆时两回事,分配方式类似链表
全局区(静态区-static)
全局变量和静态变量时存放在一起的
程序结束后由系统释放
文字常量区
常量字符船串就存放在这里,程序结束由系统释放
程序代码区
存放函数体的二进制代码
引用
先看如下代码片段
int num =3;//定义一个整型变量并赋值
int &a=num;//定义一个该整型变量的引用a
cout << a << "\t" << num << endl;//打印a和变量num的值
cout << &a <<"\t" << &num << endl;//取a和变量num的值并打印
以上代码运行结果为:
现在来对引用进行说明
引用并不是一种独立的数据类型,它必须与某一种数据类型相联系,即它在定义时就要给定它引用来哪一个变量,如上述代码引用的定义模式是必须的。引用,顾名思义,是使a称为变量num的引用,可以说a是变量num的别名。我们也可以看到它们的值一样,内存地址都是一样(共享)的。如果用sizeof测量两者长度,也会发现是一致的。引用定义时用到&符号,这也是取地址符号,两者并不同,注意区分。事实上:
int a;
int &b=a;//定义a的引用b
int &c=b;//定义引用b的引用c
如上面的代码 也是合法的。。。这特么是在给变量变着花的取小名啊!!
为什么要有引用这一说法?
引用是c++比c多处来的东西,据说是为了减少指针的使用。它能通过把引用作为函数的形参,使得函数运行过程中传递变量的值。。如定义函数式用
int x,y;
int &a=x;
int &b=y;
void hanshu__(int &a,int &b)
函数hanshu运行过程中,引用a,b的值改变,它们引用的对象x,y值也改变。
引用的进一步说明
1.不能建立viod类型引用
2.不能建立引用数组
3.可以将变量的引用的地址赋值给指针,此时指针指向的仍然是原来的边来跟
4.他喵的竟然可以建立指针变量的引用。。。
5.可以用const对引用加以限定,不允许改变该引用的值
int i=3;
const int &a=i;
a=5;//企图通过引用改变i值,编译报错,“read only”