复合类型(理解复合类型的声明)

一条定义语句可能定义出不同类型的变量:

  int i = 1024, *p = &i, &r = i;//i是一个int型的数,p是一个int型指针,r是一个int型引用

定义多个变量

经常有一种观点误以为,在定义语句中,类型修饰符(*或&)作用于本次定义的全部变量。造成这种错误看法的原因有很多,其中之一可以把空格写在类型修饰符和变量名中间:

    int* p;//合法但是容易产生误导

这种写法产生误导是因为int*放在一起好像是这条语句中所有的变量共同的类型一样。其实恰恰相反,基本数据类型是int而非int*。*仅仅是修饰了p而已,对该声明语句中的其他变量,它不产生任何作用:

    int* p1, p2;//p1是指向int的指针,p2是int

涉及指针或引用的声音,一般有两种写法。第一种把修饰符和变量标识符写在一起:

    int *p1, *p2;//p1和p2都是指向int的指针

这种形式着重强调变量具有的复合类型。第二种把修饰符和类型名写在一起,并且每条语句只定义一个变量:

    int* p1;//p1是指向int的指针
    int* p2;//p2是指向int的指针

这种形式着重强调本次声明定义一种复合类型

tip:选择并坚持其中的一种写法,不要总是变来变去。

指向指针的指针

指针是内存中的对象,像其他对象一样也有自己的地址,因此允许把指针的地址再存放到另一个指针当中

通过*的个数可以区分指针的级别,**表示指向指针的指针,***表示指向指针的指针的指针,以此类推:

    int ival = 1024;
    int *pi = &ival;//pi指向一个int型的数
    int **ppi = π//ppi指向一个int型的指针

此处pi是指向int型的指针,而ppi是指向int型指针的指针

  •  解引用int型指针会得到一个int型的数
  • 解引用指向指针的指针会得到一个指针,为了访问最原始的对象,需要对指针做两次解引用
    cout << "The value of ival\n"
        << "direct value:" << ival << "\n"
        << "indirect value:" << *pi << "\n"
        << "double indirect value:" << **ppi << "\n"
        << endl;

使用三种不同的方式输出了变量ival:

  1. 直接输出
  2. 通过int型指针输出
  3. 两次解引用ppi,取得ival的值

指向指针的引用

引用本身不是一个对象,因此不能定义指向引用的指针。但是指针是对象,存在对指针的引用:

    int i = 42;
    int *p;            //P是一个int型指针
    int *&r = p;    //r是一个对指针p的引用

    r = &i;            //r引用了一个指针,因此给r赋值&i就是令p指向i
    *r = 0;            //解引用r得到i,也就是p指向的对象,将i的值改为0

要理解r的类型什么,最简单的办法就是从右向左阅读r的定义。离变量名最近的符号(此例是&r的符号&)对变量的类型有直接的影响,因此r是一个引用。声明符的其余部分用以确定r引用的类型是什么,此例中的符号*说明r引用的是一个指针。声明的基本数据类型部分指出r引用的是一个int指针。

猜你喜欢

转载自www.cnblogs.com/suomeimei/p/10472138.html
今日推荐