指针的指针&指针的引用&复杂数组声明

1..  概述

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

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


2.. 指向指针的指针

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

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

	int iVal = 100;
	int *pi=&iVal;			//pi指向一个int型数
	int **ppi = &pi	;	//ppi指向一个int型的指针
    以上三者(iVal pi ppi)的关系如图所示:

    

   解引用int型指针会得到一个int型的数,同样,解引用指向指针的指针会得到一个指针。为访问最原始的iVal,需要对指针进行两次解引用。如下

	cout<<"iVal is "<<iVal<<endl;
	cout<<" *pi is "<<*pi<<endl;
	cout<<" **ppi is "<<**ppi<<endl;
3...  指向指针的引用

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

	int i=10;
	int *p;		//声明一个int型指针
	int *&r =p;	//r是一个对指针p的引用

	r = &i;	// r引用了一个指针(r是指针p的别名),
			//因此给r赋值&i就是令p指向i
	*r =0;	//通过指针p的别名(引用r)改变了 i值
	cout<<" i =" <<i<<endl;

  要理解r的类型到底是什么,应从右到左阅读r的定义,离变量名最近的符号对变量的类型有最直接的影响,因此r是个引用。声明符的其余部分用以确定引用r的类型是什么(*:表示引用r是一个指针,int :表示引用r是一个int型指针)

4..  复杂数组声明

   和vector一样,数组能存放大多数类型的对象;例如,可以定义一个存放指针的数组。又因为数组本身是对象,所以允许定义数组的指针和数组的引用。例如下列语句:

	//复杂数组声明
	int arr[10];			//声明一个含10个整数的数组arr

	 int *ptrs[10];			//ptrs 是含有10个整型指针的数组
	 int &refs[10];			//错误:不存在引用的数组(引用不是对象)
	 int (*Parrray)[10] = &arr;    //Parray指向一个含有10个整数的数组
	 int (&parrRef)[10] = arr;		//parrRef 是一个含有10个整数的数组的引用
   默认情况下,类型修饰符从右到左依次绑定,所以ptrs是含有10个指向int数的数组。对于Parray ,应 由内向外阅读:首先是圆括号括起来的部分,*Parray 意味着Parray是个指针,接下来观察右边,可知道Parray是个指向大小为10的数组的指针,最后观察左边,知道数组中的元素是int。所以:Parray 是一个指针,它指向一个int数组,数组中包括10个元素。同理:parrRef是个引用,它引用的对象是一个大小为10的数组,数组中的元素的类型是int。

5..  测试结果

#include <iostream>
using namespace std;

int main()
{
	int iVal = 100;
	int *pi=&iVal;			//pi指向一个int型数
	int **ppi = π		//ppi指向一个int型的指针

	cout<<"iVal is "<<iVal<<endl;
	cout<<" *pi is "<<*pi<<endl;
	cout<<" **ppi is "<<**ppi<<endl;
	
	int i=10;
	int *p;		//声明一个int型指针
	int *&r =p;	//r是一个对指针p的引用

	r = &i;	// r引用了一个指针(r是指针p的别名),
			//因此给r赋值&i就是令p指向i
	*r =0;	//通过指针p的别名(引用r)改变了 i值
	cout<<" i =" <<i<<endl;
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值