首页 > 范文大全 > 正文

C++语言中指针的级别

开篇:润墨网以专业的文秘视角,为您筛选了一篇C++语言中指针的级别范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:指针是c++语言学习中的重点,也是C++语言学习中的一个难点。透彻的理解和灵活运用指针是每个C++编程者的终级目标。为了让C++编程者透彻的理解和灵活运用指针,该文从指针的级别的角度出发,结合实例剖析指针。在实际的教学中证明,这种方法不仅让学生能深刻理解指针,而且能对指针相关知识融会贯通,学以致用。

关键词:指针;级别;赋值

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)21-5122-02

1 概述

指针是C++语言中的一个重要的概念,也是学习C++语言的一个难点和重点。正确而灵活地运用指针,可以动态的申请和释放内存;方便地访问数组;在函数调用时使主调函数能得到多个改变了的返回值;在设计系统软件时能通过指针直接处理内存地址[1]。编程时应用指针,可以使程序简洁、紧凑、高效。

指针是有级别的,指针的级别在定义标识符时就确定的。为了后面的讲述方便,现将C++中的所有标识符(不包括关键字和函数名)分类为普通变量(0级指针),一级指针,二级指针,多级指针(三级以上的指针)。

例1

#include "iostream.h"

void main()

{

int iNum_1=3; //普通变量(0级指针)iNum_1

int iNum_2; //普通变量(0级指针)iNum_2

int *ip; //一级指针变量ip

int array1[5]={9,8,7,6,5}; //一级指针常量array1

int **ipp; //二级指针变量ipp

int array2[3][4]={1,2,3,4}; //二级指针常量array2

int *ip_ar1[3]; //二级指针变量ip_ar1

int (*ip_ar2)[4]; //二级指针变量ip_ar2

}

多级指针在教材上和实际的应用中基本没有涉及到,大家只需要有这个概念就行了。其实只要真正理解了普通变量(0级指针)、一级指针、二级指针,多级指针就不难理解和应用;在这里也就不讨论多级指针。

2 指针的级别增加

我们知道,C++中指针间能赋值的一个重要条件是两个指针的级别必须相同[2]。

2.1 定义标识符时增加指针级别

我们用一种数据类型定义一个标识符时,前面没有加星号“*”并且后面没有加中括号“[]”,这个标识符就是一个普通变量;它没有指针级别。如果我们定义一个标识符时,标识符的前面每加一个号“*”或者后面每加一个括号“[]”,这个标识符的指针级别就增加一级[2]。

程序中的定义iNum时前面没有加星号“*”并且后面没有加中括号“[]”,iNum就是一个普通变量,是一个0级指针,没有指针级别;定义ip时前面加了一个星号“*” ,后面没有加中括号“[]”,ip就是一级指针;定义array1时前面没有加星号“*”,后面加了一个中括号“[]”,array1是一级指针;同理,ipp、array2、ip_ar1和ip_ar2是二级指针。

例2

void main()

{

int iNum; //普通变量(0级指针)iNum

int *ip;

int **ipp; //一级指针变量ip

int array1[5]={9,8,7,6,5}; //一级指针常量array1

ip=array1; //正确,级别相同

ip=iNum; //错误,级别不相同

ipp=ip; //错误,级别不相同

}

2.2 使用&增加指针级别

当一个标识符定义后,使用时我们也能增加它的级别,其方法就是使用时在该标识符前加一个取地址运算符“&”。在上面的程序中最后一行的程序的错误是因为赋值符号两边的级别不一样,ip是一级指针,iNum是普通变量(0级指针);可以在iNum前面加取地址运算符“&”再赋值给一级指针ip即可;即语句ip=&iNum;没有语法错误。同理语句ipp=&ip;也是正确的。正确的代码如例3:

例3

void main()

{

int iNum; //普通变量(0级指针)iNum

int *ip;

int **ipp; //一级指针变量ip

int array1[5]={9,8,7,6,5}; //一级指针常量array1

ip=array1; //正确,级别相同

ip=&iNum; //正确,级别相同

ipp=&ip; //正确,级别相同

}

3 指针级别的降低

当使用标识符时,标识符的前面每加一个号“*”或者后面每加一个括号“[]”,这个标识符的指针级别就降低一级。根据前面所讲的知识,在例1中要完成一级指针ip与二级指针array2的赋值,如果写成ip=array2;就是错误的;正确的方法之一就是降低array2的指针级别;ip=*array2;或ip=array2[];都是正确的。同理语句iNum_2=*ip;也是正确的。

例4

#include "iostream.h"

void main()

{

int iNum_1=3; //普通变量(0级指针)iNum_1

int iNum_2; //普通变量(0级指针)iNum_2

int *ip; //一级指针变量ip

int array2[3][4]={1,2,3,4}; //二级指针常量array2

ip=&iNum_1; //正确,级别相同

iNum_2=*ip; //正确,级别相同

ip=array2[0]; //正确,级别相同

ip=*array2; //正确,级别相同

}

4 结束语

综上所述,增加标识符的指针级别有两种方法:第一种是在标识符前面加星号“*”或者后面加中括号“[]”;第二种方法是在使用标识符时在标识符的前面加取地址运算符“&”。降低标识符的指针级别只有一种:在标识符的前面每加一个号“*”或者后面每加一个括号“[]”。本文仅仅对指针的级别进行讲述,其实指针之间赋值不仅要考虑级别,还要考虑到赋值符号的左边标识符。当必须是变量、赋值符号两侧的标识符的数据类型必须相同、赋值符号左边的标识符必须有确定的值等等条件。特别是将二维数组名的值赋给二级指针变量,不仅要求二级指针变量能确定它所指向二维数组的列宽,而且要求二级指针变量所指的一维数组的元素个数与二维数组的列宽是否相等,两者缺一不可。

参考文献:

[1] 丛书委员会.C++语言程序设计与案例分析[M].北京:电子工业出版社,2010.

[2] 黄国军.C++语言中指针变量与数组的关系剖析[J].黄冈职业技术学院学报,2010(3).