指针--引用--const

本文详细解析了 C++ 中引用与指针的基本概念及其使用方式,包括引用的初始化、指针的指向与解引用等核心知识点,并探讨了 const 对引用及指针的影响。

声明语句=基本数据类型+声明符。 声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型。

一.  引用

1.   定义引用时,程序把引用和它的初始值对象绑定在一起,而不是把初始值拷贝给引用。无法令引用重新绑定到另外一个对象。

int  ival = 2;

int  &refval = ival;

2.引用必须初始化,初始值必须是一个对象而不能是字面值。

3.引用不是对象,它只是为一个已经存在的对象所起的另外一个名字。不能定义引用的引用。引用不是对象,没有实际的地址,所以不能定义指向引用的指针。

4.为引用赋值实际上是把值赋给了与之绑定的对象。获取引用的值实际上是获取了与之绑定的对象的值。以引用作为初始值实际上是与之绑定的对象最为初始值。

5.引用的类型必须要和与之绑定对象的类型严格匹配。

 

二.指针

int *p = &ival;

1.指针是对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。指针无须在定义时赋初值。

2.指针存放某个对象的地址,要想获取该地址,需要使用取地址符(操作符&)。

3.声明语句中指针的类型实际上被用于指定它所指向对象的类型,二者必须严格匹配。

4.如果指针指向了一个对象,允许使用解引用符(操作符*)来访问该对象。

5.给解引用的结果赋值实际上是给指针所指的对象赋值。

6.空指针:int *p1 =nullptr;   int *p2 = 0;    int *p3 = NULL;

7.不能把int变量直接赋给指针。

8.如果指针的值为0,条件则为false,否则为true。

 

三 . void*指针

1.    void*是个特殊的指针,用于存放任意对象的地址。

2.    不能直接操作void*指针所指的对象。

 

四.指向指针的指针

1.指针是在内存中的对象,有自己的地址,因此允许把指针的地址再放到另一个指针上。

 

五. 指向指针的引用

  int  *p;

  int  *&r = p; //r是一个对指针p的引用。(离r最近的是&)

离变量名最近的符号对变量的类型有最直接的影响。

面对一条复杂的指针或者引用的声明语句时,从右往左阅读。

 

六.Const

1.const对象一旦创建后其值不能改变,所以const对象必须初始化。

2.默认情况下const对象只在文件内有效,要想在多个文件之间共享const对象,必须在变量的定义前面添加extern关键字。   extern  const  int bufsize = 252;

 

七. Const的引用

1.对常量的引用不能被用作修改它所绑定的对象。

 const  int  a =1024;

const  int  &r  = a; //要让常量引用指向常量对象

2.对const的引用可能引用一个非const对象

 int  a =21;

  const int  &b = a; //允许将constint&绑定到一个普通int对象上。不允许通过b修改a的值。

 

八.指针与const

1.指向常量的指针不能用于改变其所指对象的值,要想存放

常量对象的地址,只能使用指向常量的指针

2.和常量引用一样,指向常量的指针没有规定所指对象必须

是一个常量。指向常量的指针仅仅要求不能通过该指针改变对象的值。

     const   double  pi  =3.14;

     const   double *cptr = π

     double   a = 2.1;

     cptr = &a; //不能通过cptr改变a的值。

 

九.Const指针

1.指针是对象,允许把指针本身定为常量。常量指针必须初始化,一旦初始化,它的值(存放指针中的那个地址)不能被修改。不变的是指针本身的值而非指向的那个值。

int  a = 98;

int  *const  b = &a;//可以用b去修改a的值。

const  double pi = 3.14;

const  double *const  pip = π//pip是指向常量对象的常量指针。

十.顶层const

1.顶层const:指针本身是个常量。顶层const可以表示任意的对象是常量。

 底层const:指针所指的对象是个常量。用于声明引用的const都是底层const。

      int  a=0;

      int  *const p1 = &a; //不能改变p1的值,顶层const

      const  int  c = 42; //不能改变c的值,顶层const

      const  int  *p2 = &c; //允许改变p2的值,底层const

     const  int  *const p3 = p2;//靠右的const是顶层const,靠左的是底层const。

     const  int&r = c;//用于声明引用的const都是底层const

2.当执行对象拷贝操作时,顶层const不受影响,执行拷贝

操作并不会改变被拷贝对象的值。当执行拷贝操作时。拷

入和拷出的对象必须具有相同的底层const资格。

 P2 = p3; //正确:p2和p3都是底层const,p3顶层const部分不受影响。

 Int  *p = p3;//错误:p3包含底层const,而P没有。


十二.关键字

1.   typedef关键字:类型别名。

  typedef  double  wages; //wages是double的同义词。

     typedef  wages base, *p ;//base是double同义词,p是double*同义词。

2.   using关键字:别名声明。

  using   SI = Sales_item; //SI是Sales_item的同义词。

3.   auto关键字:类型说明符,让编译器替我们去分析表达式所属的类型。

  auto  a = 0 ; *p =&a; //i是整数,p是整型指针。

4.   decltype关键字:类型指示符,选择并返回操作数的数据类型。

 const  int  c = 0, &cj = c;

 decltype(c)  x = 0; //x的类型是const int

decltype(cj) y = x; //y的类型是const int&,y绑定x


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值