对C++中指针的深入研究

发布时间:2016-11-18 15:12

摘 要:本文对C++各种类型的指针进行了深刻全面地讨论,把各种指针的常量,变量的声明、赋值和访问都一一列出,这对利用指针开发大型软件的程序员来说无疑是一个非常有力的工具。本文还揭示了指针变量与数组名的内在关系,以及类的静态数据指针与非静态数据指针的根本区别。

关键词:指针类型、指针常量、指针变量、数组名

Abstract:All kinds of pointers in C++ are thoroughly and deeply discussed.The constant quantity,variables,the form of endowing with value and access to data are listed like a table.This is undoubtedly a useful tool to a programmer who develops big softwares.The author bring to light the relationship between the pointer variables and the name of number groups.He also reveals the essential distinction between a static pointer and non-static pointer.

Keywords:pointer type data,pointer constant quantity,pointer variable,a number group’s name

C++中的“指针”实质上是指针类型的数据,所以指针既有常量,也有变量。但是人们往往只是简单的说“指针”,没有带“常量”或“变量”二字。那么,该“指针”到底是指常量呢还是指变量呢?这个问题要根据它所属的那个整句才能回答。C++中的指针按照它所指向的对象可以划分为变量指针、数组指针、函数指针、对象指针、类的成员数据指针和类的成员函数指针。

一、变量指针

设type代表任意一种基本类型说明符,X是该类型的变量,则:

1、X的指针常量为&X。

2、一个type型指针变量P的声明格式为:type *P;

3、使P指向X,也就是说用&X向P赋值的格式为:①用&X初始化;②在声明了P后向P赋值。

二、数组指针

设A是一个有3行4列个type型变量元素的一个二维数组,则:

1、A有两个意义:①表示这12个type型变量构成的整体。②表示A<0>的地址,即A=&A<0>。

A<0>也有两个意义:①表示A的第一行的4个type型变量构成的整体(A中左下标为0的一行元素);②表示A<0><0>的地址。

2、①声明一个指向type型的有3行4列个元素的二维数组的指针P的格式为: type(*P)<3><4>;②声明一个指向type型的有4个元素的一维数组指针P1的格式为: type(*P1)<4>;③声明一个指向type型变量的指针P2的格式为:type *P2。

3、①使P指向A的方式为:用&A初始化P或在声明了P后向 P赋值;②使P1指向A<1>的方式为:用“A+1”初始化P1或在声明了P1后向P1赋值;③使P2指向 A<2><1>的方式为:用&A<2><1>初始化P2或在声明了P2后向P2赋值。

4、用 A和*来表示A<2><1>的表达式为*(*(A+2)+1),表示A<0><0>的表达式为**A。

5、按3,①用P和*来表示A<2><1>的表达式为*(*(*P+2)+1);②用P1和*来表示 A<2><1> 的表达式为*(*(P1+1)+1);③用P2和*来表示A<0><0>的表达式为:*(P-6);

用P、P1和P2来访问A的元素有很多优越性,如它们及其表达式可以进行++运算和- -运算而指针常量却办不到。

三、函数指针

设一个函数的原型为:type fun (),则:

1、 fun()的指针常量为fun

2、声明一个数据类型为type,形参表为FL的函数指针P的格式为:type (P)(FL);

3、用一个数据类型为type形参表为FL的函数指针只能指向数据类型为type形参表为FL的函数。按(1)和(2),用P指向fun()的方式为:用fun初始化P或在声明P后向P赋值。

4、用P而不用fun来调用fun()的格式为:P(和FL对应的实参表);

四、对象指针

设t是A类的一个对象,a和f( )分别是A的一个公有变量成员和公有函数成员,则:

1、t的指针常量为&t;

2、声明一个指向A类的对象的指针P的格式为:A*P;

3、使P指向t的方式为:用&t初始化P或者在声明了P后再向P赋值。

4、①用P而不用t来表示t. a的格式为:P->a;②用P而不用t来访问f( )的格式为: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的声明格式为:type 1*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(实参表);

七、指针的特点

1、数据指针+n=数据指针+(n×这个数据的字节数)(n=整数,n为小数不合法)。如:①设P为一个int型指针,则P+2=P的值+8(2×4);②设P1为一个有3行2列个int型变量元素的数组的指针,则P1+2=P1的值+2×24;③设A类有16个字节,P2是一个A类的指针,则P2+2=P2的值+2×16。

2、下面的表达式不合法:函数指针+n。

参考文献

<1> 谭浩强,《C++程序设计教程》,中国科学技术出版社,1995

<2> Microsoft、何晓刚译,《Visual C++4.0教程》,科学出版社,1997。

<3> 刘卫东、沈官林译,《数据结构C++语言描述》,北京,清华大学出版社,2000

<4>邱龙、张巍,《C++语言入门》,北京,清华大学出版社,1999

对C++中指针的深入研究的评论条评论