C++primer 4.2 指针(上)

来源:互联网 发布:mac显示无电池 编辑:程序博客网 时间:2024/09/21 09:23

      • 简介
      • 建议
    • 一指针的定义和初始化
      • 1指针变量的定义
      • 2 避免使用未初始化的指针
      • 3 指针初始化和赋值操作的约束
        • 注意
      • 4 void 指针
    • 二指针的操作
      • 1指针赋值
      • 2 指针和引用的比较
      • 3 指向指针的指针

简介

  • 指针保存的是另一个对象的地址

  • 指针和数组容易产生不可预料的错误,所以少用,多采用vector类型和迭代器代替一般的数组

建议

  • 把int型变量赋给指针是非法的,尽管此int 型变量的值可能为0

  • 使用任何变量之前先初始化所有变量尤其是指针,如果不知道初始化为那个对象的地址,那么都先初始化为0

  • c++语言无法检测指针是否被初始化,也无法区分有效地址还是由指针分配到的存储空间中存放的二进制位形成的地

  • void 指针可以保存任何类型的对象的地址

int * pi=0;

=====================================================================================

一、指针的定义和初始化

1、指针变量的定义、

一个有效的指针必然是以下三种状态之一:

 1. 保存一个特点对象的地址; 2. 指向某个对象后面的另一个对象; 3. 保存0值,表明不指向任何对象;

注意:未初始化的指针无效,知道给指针赋值后才能使用。

int ival=1024;ine *p1=0;//没有指向任何对象的指针int *p2=&ival;//p2指向ivalint *p3;//p3没有初始化,指针无效p1=p2;//p1和p2指向同一个对象ivalp2=0;//p2现在不指向任何元素

2、 避免使用未初始化的指针

  1. 就像使用其他没有初始化的变量一样,使用未初始化的指针时的行为c++标准中并没有定义,使用未出世的指针,会导致运行时崩溃。
  2. 对大多数编译器来说,使用为初始化的指针,会将指针中存放的不确定值为地址然后操纵该内存地址中存放的位内容。
  3. c++语言无法检测指针是否被初始化也无法区分有效地址还是由指针分配到的存储空间中存放的二进制位形成的地址
  4. 如果可能的话,除非所指的对象已经存在,否则不要先定义指针,这样可以避免定义一个未初始化的指针;
  5. 如果必须分开定义指针和所指的对象,则先将指针初始化为0,编译器可以检测出0值的指针,程序可判断该指针并未指向一个对象。

3、 指针初始化和赋值操作的约束

  1. 0值常量表达式;
  2. 类型匹配的对象的地址;
  3. 另一个对象之后的下一个地址;
  4. 同类型的另一个有效指针(除了4.2.5和15.3节两种例外情况之外);

注意:

  • 把int型变量赋给指针是非法的,尽管此int 型变量的值可能为0.
  • 但允许把数值0 或在编译时可获得0值的const 量赋给指针
  • 允许把NULL 赋值给指针(int和string都行)
int ival;int zero=0;const int c_ival=0;int *pi=ival; // 不可以,指针不能用int型变量赋值pi=zero;//不可以,zero是int型变量pi=c_ival; //可以,允许把编译时值为0的量赋给指针pi=0;//可以,数值0可以直接赋值。int p2=0;  //可以string *s1=0;//可以 int p1=NULL;//赋值为NULLstring *s2=NULL;//可以

4、 void *指针

  1. void 指针可以保存任何类型的对象的地址;
  2. 它只支持几种有限的操作:
    1. 与指针进行比较;
    2. 向函数传递void 指针或从函数返回void 指针;
    3. 给另一个void * 指针赋值
    4. 不允许使用void*指针操纵它所指向的对象。
double obj=3.14;double *pd=&obj;void *pv=&obj;pv=pd;//可以!!!

二、指针的操作

1、指针赋值

  1. 给指针赋值和通过指针进行赋值
string s1("some value"); string *sp1=&s1;string s2("another"); string *sp2=&s2;*sp1="a new value";sp1=sp2;

这里写图片描述

2、 指针和引用的比较

  1. 引用总是指向某个对象;
  2. 定义引用时没有初始化是错误的;
  3. 给引用赋值修改的是该引用所关联的对象的值,而不是使引用于另一个对象关联;
  4. 引用一经初始化就始终指向同一个特定对象,不能再变,所以定义时就要初始化。
int ival =1024,ival2=2048int *pi=&ival,*pi2=&ival2;pi=pi2;//指针pi指向指针pi2所指的对象,没有修改ival的值int &ri=ival,&ri2=ival2;ri=ri2;//修改了ival的值,此时ival的值和ival2的值相等,为2048

3、 指向指针的指针

  1. 指针本身也是可用指针指向的内存对象。
  2. 指针占用内存空间存放其值,因此指针的存放地址可存放在指针中。
    这里写图片描述
int ival =1024int *pi=&ival;int **ppi=&pi;//指向指针的指针ppiint *pi2=*ppi;//对ppi指针进行解引用得到的是pi指针cout<<ivall<<endl;    <<*pi<<endl;    <<**ppi<<endl;    //输出的都是ival的值
0 0
原创粉丝点击