设为首页 加入收藏

TOP

2.3.3 理解复合类型的声明
2013-10-07 16:26:39 来源: 作者: 【 】 浏览:81
Tags:2.3.3 理解 复合 类型 声明

2.3.3  理解复合类型的声明

如前所述,变量的定义包括一个基本数据类型(base type)和一组声明符。在同一条定义语句中,虽然基本数据类型只有一个,但是声明符的形式却可以不同。也就是说,一条定义语句可能定义出不同类型的变量:

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

很多程序员容易迷惑于基本数据类型和类型修饰符的关系,其实后者不过是声明符的一部分罢了。

定义多个变量

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

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

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

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

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

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

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

  1. int* p1;        // p1是指向int的指针  
  2. int* p2;        // p2是指向int的指针 

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

上述两种定义指针或引用的不同方法没有孰对孰错之分,关键是选择并坚持其中的一种写法,不要总是变来变去。

本书采用第一种写法,将*(或是&)与变量名连在一起。

指向指针的指针

一般来说,声明符中修饰符的个数并没有限制。当有多个修饰符连写在一起时,按照其逻辑关系详加解释即可。以指针为例,指针是内存中的对象,像其他对象一样也有自己的地址,因此允许把指针的地址再存放到另一个指针当中。

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

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

此处pi是指向int型数的指针,而ppi是指向int型指针的指针,下图描述了它们之间的关系。

解引用int型指针会得到一个int型的数,同样,解引用指向指针的指针会得到一个指针。此时为了访问最原始的那个对象,需要对指针的指针做两次解引用:
 

  1. cout << "The value of ival\n"  
  2.      << "direct value: " << ival << "\n"  
  3.      << "indirect value: " << *pi << "\n"  
  4.      << "doubly indirect value: " << **ppi  
  5.      << endl;  

该程序使用三种不同的方式输出了变量ival的值:第一种直接输出;第二种通过int型指针pi输出;第三种两次解引用ppi,取得ival的值。

指向指针的引用

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

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

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

面对一条比较复杂的指针或引用的声明语句时,从右向左阅读有助于弄清楚它的真实含义。

2.3.3节练习

练习2.25:说明下列变量的类型和值。

(a) int* ip,i, &r = i; (b) int i, *ip = 0; (c) int* ip, ip2;

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.3.2 指针(3) 下一篇2.4.1 const的引用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)
·MongoDB 索引 - 菜鸟 (2025-12-25 17:19:45)
·What Is Linux (2025-12-25 16:57:17)
·Linux小白必备:超全 (2025-12-25 16:57:14)