——————学习使人进步
1、指针和const限定符
主要从两个方向来说明const指针和const对象,一是const修饰的指针和非const修饰的指针。二是const修饰的对象和非const修饰的对象。
代码:
const int *ptr;
//或
int const * ptr;
这里只说明被const限定的指针,
特点:a,指针所指向的对象必须为常量,不能被改变的(不能通过解引用的方式修改值);
b,指针本身不是常量,也就是所,可以指向这个,可以指向那个。并不是固定的。
const int *p;//定义一个const指针
int a = 10;//非限定对像
const int b = 10;//const对象
const int c = 20;//const对象
p = &a; //ok,const指针可以指向非const对象
p = &b; //ok
p = &c; //ok,可以指向a,b,c所以说是变化的。
*p = 10;//error,const指针一但初始化后, 不能被修改, 即使是赋回同样的值.
const限定的对象
const int b = 10;//const对象
b=20;//error,不能改变
2、动态数组
为什么要动态数组,在数组类型的变量中,有几个非常重要的限制。第一个,数组长度固定不变(当然可以用前面提到的vector容器解决),其次是在程序编译时必须知道其长度,还有就是只在定义它的语句块内存在。在Java中数组是可以动态设置的。也就是在编译时不需要知道其长度,换句话说,可以用变量来定义数组(int arr[n]的形式)。
定义动态数组需要使用两个关键字(new delete),new和Java里面的用法差不多,都是向堆内存申请空间的关键字,动态申请的空间必须使用delete显示释放,因为如果不释放他便一直存在直到内存溢出。
语法:类型 指针变量 = new 类型名;
使用new申请空间:
特点:
1、没有名字,只能通过指针访问地址。
2、申请的是堆空间。
举例:string *p = new string[10]();//括号可有可无,类似于Java构造函数做初始化,但是如果有const限定就必须进行初始化
int n =10;
int *p = new int[n];//ok,可以在运行时,获取n长度,程序是先编译(检查缺少标点等),在运行阶段
int arr[n];//error,在编译时检查n是否为常量,否则编译不通过
参考文献:
const限定符参考自:http://blog.youkuaiyun.com/njnu_mjn/article/details/6892383
动态数组参考自:http://blog.youkuaiyun.com/niubidexiebiao/article/details/50879004