C++ Primer 第二章 引用 指针 const限定符

1.引用:

  为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名)。

  PS:1.通过图片中编译所提示的报错信息也可知,引用必须被初始化;

    2.引用并非对象,相反的,它只是为一个已经存在的对象所起的另一个名字而已;

2.指针:

  与引用类似,指针也实现了对其他对象的间接访问,不过,指针本身就是一个对象,允许对指针赋值与拷贝,而且在其生命周期内可以先后指向几个不同的对象(引用只能指向一个初始化的)。

  指针无须再定义时赋初值,与其他内置类型一样,在块作用域内定义的指针如果没有被初始化,它也将拥有一个不确定的值。

PS:指针存放某个对象的地址,指针的值就是地址;

1     int *p1,*p2;//p1和p2都是指向int型对象的指针;
2     double p3,*p4;//p4是指向double型对象的指针,p3是double型对象;
3     int i = 12;
4     int *p1 = &i;//p1存放变量i的地址,或p1指向i;
5     *p1 = 2;//正确,由*得到指针所指的对象,即可经由p为变量i赋值;
6     p2 = &i;//正确,同是int*类型 ;
7     *p2 = &i;//错误,类型之间不能转换,&i是int*类型,*p2是int类型;
8     p4 = 0;//正确,因为0没有数据类型;

3.const限定符:

  const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

其主要作用有:

  (1)可以定义const常量,具有不可变性。 
  例如:const int Max=100; Max++会产生错误; 
  (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
  例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改; 
  (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!
  如(1)中,如果想修改Max的内容,只需要:const int Max=you want;即可! 
  (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错; 
  例如: void f(const int i) { i=10;//error! } 
  (5) 可以节省空间,避免不必要的内存分配。 例如: 
  #define PI 3.14159 //常量宏 
  const double Pi=3.14159; //此时并未将Pi放入RAM中 ...... 
  double i=Pi; //此时为Pi分配内存,以后不再分配! 
  double I=PI; //编译期间进行宏替换,分配内存 
  double j=Pi; //没有内存分配 
  double J=PI; //再进行宏替换,又一次分配内存! 
  const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干份拷贝。 
  (6) 提高了效率。 
  编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

 PS:const限定的对象规则(左数右指:const和*的位置),也可叫顶层const和底层const。

  下面分别用const限定不可变的内容是什么?
  1)const在前面
  const int nValue; //nValue是const
  const char *pContent; //*pContent是const, pContent可变
  const char* const pContent; //pContent和*pContent都是const

原文地址:https://www.cnblogs.com/ggYYa/p/5703729.html