C++中的指针的解析|C中指针

  摘 要: 指针是C++语言中最难掌握的概念之一,错误地使用指针所带来的后果往往是很严重的,有时甚至会导致系统崩溃。因此,正确使用指针是C++语言学习的重点和难点。   关键字: C++指针 地址 解析
  
  计算机内存是由二进制位组成的,为了便于访问和管理,每8位组成一个字节,一个字节称为一个存储单元。通常,系统对每个存储单元按期顺序进行编号,编号能惟一确定任何一个字节的位置,就像根据房间号能惟一确定任何一个房间一样,于是编号被形象地称为地址。程序所处理的每一个数据必须存放于计算机内存中才能运行,这些数据按其所属的数据类型,需要占据一定数量的连续的存储单元,而这些存储单元都位于内存的某个特定位置,都有一个惟一的起始地址。
  因为地址指示了字节在存储器中的位置,所以地址也被形象地称为指针。指针是一个存储单元的地址值,用来存放地址(即指针)的变量称为指针变量,常常将指针变量简称为指针。C++中的指针按照它所指向的对象可以划分为变量指针、数组指针、函数指针、对象指针、类的数据成员指针和类的成员函数指针。
  一、变量的指针
  1.设type代表任意一种基本说明符,则:
  type x;//声明了一个type型变量x。
  type*p;//声明了一个type型指针变量p,“*”表示声明的p是一个指针变量,p所指向的变量的类型是type型。
  p=&x;//指针变量p指向了变量x,&是地址符号,&x表示变量x的地址。只有变量x的数据类型和指针变量p所指向的变量的数据类型相同才可作此操作。
  2.可声明多级指针变量,如:
  type**p;//声明了一个指向type类型的二级指针变量p。
  二、数组与指针
  1.数组的指针
  type a[3];//声明了一个具有三个type类型数据的数组。
  在这里a有两个涵义:
  ①作为数组名,表示数组这个整体。
  ②表示这个数组在内存所占的一段连续的存储单元的起始地址,也就是这个数组中第一个元素的地址,即&a[0]。
  type*p;//声明了一个type型指针变量p。
  p=a;//将数组的起始地址赋给指针变量,使指针变量p指向数组,相当于p=&a[0]。
  2.数组指针
  type(*p)[3];//声明了一个指针p,这个指针指向具有3个的type类型元素的数组。
  3.指针数组
  type*p[3];//声明了一个具有三个指针元素的数组,每个元素都是可以指向type类型数据的指针变量
  三、函数与指针
  1.返回指针值的函数
  函数的返回值可以是整型、浮点型、字符型等基本类型,也可以是指针类型。如:int*f(),则函数的返回值是一个指向整型数据的指针,称这个函数为返回指针值的函数。
  type*(形参表)
  {
  ……
  }//定义了一个返回指针值的函数
  void main()
  {
  type*p;
  p=f(实参表);//函数调用,p接收的是函数f返回的指向type类型数据的指针
  ……
  }
  2.函数指针
  函数名就是函数的入口地址,函数指针就是指向函数入口地址的指针变量,即存放函数入口地址的变量。
  type(*p)(type x);//定义了一个名为p的函数指针
  type f(type x)
  {
  ……
  }//定义名为f的type函数。
  p=f;//将函数f()的入口地址赋给函数指针变量p,即使指针变量p指向函数f(),只能将与函数指针变量具有同类型、同参数的函数名赋给函数指针变量。
  四、对象指针
  设有一个类A,a和f()分别是类A公有数据成员和公有成员函数,则:
  A t;//声明了一个类A的对象t,则&t是对象t的地址。
  A*p;//声明了一个指向类A的指针变量p。
  p=&t;//将指针变量p指向了类A的对象t。
  用指针p调用对象t的数据成员和成员函数的格式为:p→a;和p→f()。
  五、类的成员数据指针
  设t是A类的一个对象,a是A的一个非静态type型成员数据,s是A的一个静态type1型数据成员,则:
  1.①A∷a的相对指针常量为&A∷a;
  ②A∷s的物理指针常量为&A∷s。
  2.①可以指向A类的type型非静态成员的指针p1的声明格式为:type A∷*p1;
  ②可以指向A类type型静态成员的指针p2的声明格式为:type1*p2。
  3.①使p1指向A∷a的方式为:用& A∷a初始化p1或在声明了p1后向p1赋值;
  ②使p2指向A∷s的方式为:用& A∷s初始化p2或在声明了p2后向p2赋值。
  4.①用p1而不用a来访问t.a的格式为:t.*p1;
  ②用p2而不用s来访问t.s的表达式为*p2。
  六、类的成员函数指针
  设t是A类的一个对象,f(FL1)是A类的一个type型非静态的函数成员,g(FL2)是A类的一个type1型静态函数成员,则:
  1.①A∷f()的相对指针常量为A∷f;
  ②A∷g()的物理指针常量为A∷g。
  2.①可以指向A的非静态type型形参表为FL1的函数成员的指针P1的声明格式为type(A∷*p1)(FL1);
  ②可以指向A的静态type1型形参表为FL2的函数成员的指针p2的声明格式为:type1(*p2)(FL2)。
  3.①使p1指向A∷f()的方式是:用A∷f初始化p1或在声明了p1后向p1赋值;
  ②使p2指向A∷g()的方式是:用A∷g初始化p2或者在声明了p2之后向p2赋值。
  4.①用p1而不用f来访问t.f()的格式为:(t.*p1)(实参表);这里的“*”为指针说明符而不是指针运算符;
  ②用p2而不用g()来访问t.g()的格式为:p2(实参表)。
  指针是C++语言中最难掌握的概念之一,错误地使用指针所带来的后果往往是很严重的,有时甚至会导致系统崩溃。因此,正确使用指针是C++语言学习的重点和难点。
  
  参考文献:
  [1]谭浩强.C++语言程序设计.清华大学出版社.
  [2]周正德,侯正昌.C++程序设计(第2版).电子工业出版社.
  [3]邓振杰.C++程序设计.人民邮电出版社.
  [4]余建军,张铁头.C++程序设计.中国计划出版社.
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

推荐访问:指针 解析