复合类型(指针、引用、数组)

当一条声明语句中包含多个指针,或者混用数组的时候,每每傻傻分不清。

变量定义

在《C++ Primer》P38 页,2.2 节中描述到

变量定义的基本形式是:首先是类型说明符(type specifier),随后紧跟由一个或多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。

列表中每个变量名的类型都由类型说明符指定,定义时还可以为一个或多个变量赋初值:int a=0, b, c=3;

ps:稍后再对变量的定义和声明做区分,对于初始化和赋值做区分。

复合类型

P45 页,2.3 节描述如下

一个简单的声明语句由……。更通用的描述是,一条声明语句由一个基本数据类型(base-type)和紧随其后的一个声明符(declarator)列表组成。每个声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型。

P51 页

在同一条定义语句中个,虽然基本数据类型只有一个,但是声明符的形式却可以不同。也就是说,一条定义语句可能定义出不同类型的变量。

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

P53 页

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

1
int *p, *&r = p;  // r是一个对指针p的引用

数组是一种复合类型 (P101页)

数组中元素的个数也属于数组类型的一部分。

P102 页

默认情况下,类型修饰符从右向左依次绑定。理解复杂的数组声明,由内向外,从右向左。

1
2
3
int *ptrs[10];  		// ptrs是含有10个元素的数组,数组元素是int型指针
int *(&array)[10] = ptr; // array是数组的引用,该数组含有10个指针
int (*Parray)[10]; // Parray是一个指针,指向一个含有10个整数的数组

const 限定符

reference to const,对常量的引用;不存在 const reference,因为引用不是对象。

1
2
const int ci = 1.24;
const int &r1 = ci;

pointer to const,指向常量的指针;const pointer,指针本身是常量。

* 放在 const 关键字之前用以说明指针是一个常量。

1
2
const double pi = 3.1415;
const double *const pip = π

要想弄清楚这些生命的含义最行之有效的方法是从右向左阅读。