免费论文查重: 大雅 万方 维普 turnitin paperpass

浅析C语言中指针教学之我见

最后更新时间:2024-01-31 作者:用户投稿原创标记本站原创 点赞:25641 浏览:118448
论文导读:
摘 要:C语言程序设计是大中专院校理工科的基础课程,其中指针的运用是教学中的难点和重点。正是指针让C语言威力无穷,要想成为一名优秀的C程序员,对指针有一个深入而完整的理解是先决条件。本文通过对指针8个方面的应用,阐述了指针的本质、基本概念和用法。
关键词:指针;地址;数组;字符串;函数
中图分类号:TP312.1
指针是C语言学习中的难点和重点,正是指针让C语言威力无穷,要想成为一名优秀的C程序员,对指针有一个深入而完整的理解是先决条件。在教学中这一部分内容经常让学生觉得疑惑。我在教学中总结了自己的经验,现在把自己对C语言中指针的理解跟大家分享一下。
对于一个内存单元来说,内存单元的地址即为指针,其中存放的数据是该单元的内容,我们可以把内存想象成一个一个的房间,每个房间都有一个房间编号,每个房间可以住不同的房客。其中房间编号就是该存储单元的地址即指针,房间中住的房客即该存储单元的内容。我们用一个变量来保存房号,这个变量就是指针变量。指针变量也是一个变量,只不过里面存放的是地址即指针。指针变量的定义格式如下:
基类型 *指针变量名
其中基类型是指针变量指向的数据的类型,大家可以理解为房间里所住房客的类型。“*”只是一个符号,表示后面的变量是一个指针变量,不是指针运算符。大家可以用sizeof()函数对指针变量进行测试,得到结果是在相同的系统中不论何种数据类型的指针,即不管房间里住什么类型的房客,指针变量的长度是相同的,它都表示的是地址。在C语言中,有两种指针运算符:“&”和“*”。“&”是取地址运算符,结合性为自右向左,功能是取变量的地址。“*”是取内容运算符,结合性为自右向左,用来表示指针变量所指向的变量。即一个为取地址,一个为取内容。大家注意在指针定义中的“*”不是运算符,不代表任何运算,只是表示后面的变量是一个指针变量,与运算符“*”是不同的。下面从8个方面讲述一下指针的应用。
1 指针指向普通变量
这个是指针最基本的用法。举例如下:int *px;定义了一个指向整型数据的指针变量,可以对它进行赋值,如px=&a;把变量a的地址赋给指针变量px,即指针变量px指向变量a。
2 指针指向数组
在C语言中,指针与数组之间的关系十分密切,都可以处理内存中连续存放的一系列数据。举例如下:int a[10];int *px;px=a;px++;指针变量的基类型是数组的类型,即数组元素的类型。C语言中规定数组名是指针类型的符号常量,该符号常量是指向数组首元素的地址,即数组名就是数组首地址。所以可以直接把数组名赋值给指针变量。指针与数组在访问内存时,采用统一的地址计算策略。在进行数据处理时,指针和数组的表示形式具有相同的作用。指针变量也可以带下标。a[i]、*(a+i)、px[i]和*(px+i)这4种表示法全部等价,都是取数组元素的含义。但有一点区别,就是数组名是符号常量,是不能给数组名赋值的。即a=px;是错误的。指针变量px是可以对它赋值的。引用数组元素可以用下标法:a[i]、px[i],和指针法*(px+i)、*(a+i)。在指针指向数组的应用中经常用“++”、“——”和“*”一起使用,这时大家在分析时,注意自增和自减运算符与指针运算符是在同一个优先级,结合性为自右向左,如果有括号,优先计算括号内容,而且要注意自增和自减运算符在变量的前面和后面的区别,一个是先加减后使用,一个是先使用后加减。指针变量的算术运算,加减某一个整数n,不是地址值加减这个整数,而是地址值加减n个单元,每个单元的长度是由数据类型决定的,即px±n表示的实际位置的地址值是px±n*sizeof(type)。如上举例,px++的含义不是地址加1,而是由int数据类型决定的,假设本系统int数据类型为2个字节,则px++的结果为地址px+2。
3 指针指向多维数组
以二维数组为例,int a[3][4];int *p;p=a[0];把二维数组a看作由3个一维数组组成,每个一维数组有4个元素。这时可以把指针看为在行指针列指针换。行指针中保存的是列指针。a代表整个二维数组的首地址,是行指针,可以看作指向一维数组的指针的指针,a指向的是列指针。a[0]代表第0行的首地址,是a指向的列指针,即a中的内容是列指针。a+1指向第1行的首地址,指向的也是指针。*a=a[0],*(a+1)=a[1]。用“*”把行指针转换为列指针。如果二维数组的首地址为3000,则a+1为3008(假设一个int数据为2个字节),a+1的含义是aC语言中指针教学之我见相关范文由写论文的好帮手www.7ctime.com提供,转载请保留.[1]的首地址。用a[0]+1表示第0行第1列元素的地址,其值为3002。a[i]和*(a+i)等价,可以理解为二维数组中的行指针取出的内容为一维数组的地址,即为指向一维数组的列指针。在其后再加上某个数,就转为了一维数组中的某一列的列指针。a[i]+j和*(a+i)+j等价,是第i行第j列的地址,即为指向第i行第j列的指针。所以要取第i行第j列的内容,即为*(a[i]+j)和*(*(a+i)+j)都可以,这两种方式是等价的。二维数组的指针运算可看为行指针列指针的转换,如果数组维数大于2,则可以一层一层的进行指针分析。大家有兴趣可以试着分析一下。
4 指针指向字符串
用字符指针指向字符串,然后通过字符指针来访问字符串存储区域。例如:char *str=“Good morning!”C语言对字符串常量是按字符数组处理的,实际上在内存开辟了一个字符数组用来存放字符串常量。定义了一个字符指针变量str,并把字符串首地址赋给它。注意只是把字符串首地址赋给指针变量,不是把字符串赋给str。可以把字符串看为一个整体来处理,可以对一个字符串进行整体的输入输出。对字符串中字符的存取,可以用下标策略,也可以用指针策略,与数组类似,这是因为对字符串常量是按字符数组处理的。getchar是输入字符,gets和scanf可以输入字论文导读:“\0”作为字符串的结束。字符数组由若干个数组元素组成,可以用来存放整个字符串,字符数组名是字符串的首地址,是常量,不能修改其值。其次在使用上,两者也有区别。对于字符串指针方式:char*px=“Goodmorning”;可以写为char*px;px=“Goodmorning”;而对于数组方式:charstr;str=“Goodmorning”;可以看出使用指针变量更
符串,但gets可以输入带空格的字符串,scanf则不带空格。putchar是输出字符,puts和printf可以输出字符串。字符数组与字符串指针变量都可以实现对字符串的存储和操作,但两者是有区别的。首先字符串指针变量本身是一个变量,用于存放字符串的首地址,可以指向字符串的任何字符。字符串本身存放在以该首地址为首的一块连续的内存空间中,并以“\0”作为字符串的结束。字符数组由若干个数组元素组成,可以用来存放整个字符串,字符数组名是字符串的首地址,是常量,不能修改其值。其次在使用上,两者也有区别。对于字符串指针方式:char *px=“Good morning”;可以写为 char *px;px=“Good morning”;而对于数组方式:char str[]={“Good morning”};不能写为char str[20];str=“Good morning”;可以看出使用指针变量更加方便。5 指针数组
指针变量本身也是变量,当指针变量集合成数组时,就形成了指针变量数组,简称指针数组。定义举例如下:int *px[5];该数组的每一个元素都是整型指针。[ ]比*优先级高,因此px先与[5]结合,形成px[5]形式,这是一个数组形式,它有5个元素。再与px前面的“*”结合,表明每个数组元素是指针,指向一个整型变量。不要写成int (*px)[5],这是指向一维数组的指针变量。这种用法常用来指向若干个字符串,是字符串处理更加方便。例如:char *name[]={“数据结构”,“操作系统”,“计算机网络”};图例如下图2:
6 指向指针数据的指针变量,即指向指针的指针
当一个指针变量指向普通变量时,这样的指针变量称为一级指针变量。指向一级指针变量的指针变量称为二级指针变量。指向二级指针变量的指针变量称为指针变量,以此类推。在引入多级指针变量的概念后,当访问一个指针变量的内容时,只有一级指针变量的内容才是要处理的数据,而多级指针变量的内容仍是一个指针变量。如上面例子,要一个指针指向数组name,就是一个二级指针变量。char **px=name;因为name是一个指针数组,所以用指针指向它,就必须定义一个二级指针变量。在分析多级指针变量时,注意区分哪个是地址,哪个是要处理的数据。
7 指针型函数
一个函数可以带回一个整型值,字符值,实型值等,也可以带回指针型的数据。函数返回值的数据类型决定了该函数的数据类型。有数值型函数,字符型函数等等。当函数的返回值是地址时,称为指针型函数。定义例子如下:int *fun(int a,int b);fun先与运算符“()”结合,表明fun( )是一个函数,前面一个“*”,表明该函数返回一个指针,最前面一个int,表明该指针指向一个整型变量。在指针型函数中,用return语句返回一个地址。
8 函数指针
可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。可以用一个指针变量指向函数,然后通过该指针变量调用此函数,这种指针变量为指向函数的指针变量,简称函数指针。函数的存储首地址又称为函数的执行入口地址。函数名代表函数的入口地址。使用时,直接把函数名赋值给函数指针,再通过函数指针调用函数即可。定义举例如下:int (*p)(形参表);int fun(形参表);p=fun;p即定义为一个函数指针,该函数的返回值为整型数据。函数指针与普通指针变量本质相同,都是保存地址。区别在于普通指针变量指向内存的数据存储C语言中指针教学之我见相关范文由写论文的好帮手www.7ctime.com提供,转载请保留.区,而函数指针指向内存的程序代码区。普通指针变量的“*”运算是访问内存的数据,而对函数指针执行“*”运算时,其结果是使程序转移至该函数指针指向的函数入口地址,从而开始执行该函数,即调用其所指向的函数。在一个程序中,一个指针变量可以先后指向不同的函数。
以上是我在C语言教学中总结归纳的指针的8大用法,C语言是计算机程序设计的一门基础课,其中指针是C语言的特色和精华。C语言中的指针经常让学生不知所云,但其实只要掌握指针的本质就是地址,理解指针的基本概念和用法,指针其实是不难学的。希望我的文章能对大家学习C语言有所帮助。
参考文献:
[1]谭浩强.C程序设计[M].清华大学出版社.
[2]Kenneth A.Reek.C和指针[M].人民邮电出版社.
作者简介:李咏琪(1975-),女,湖北武汉人,讲师,硕士,研究方向:计算机应用。
作者单位:湖北科技职业学院,武汉 430074