摘要:结合我院学生十年来参加全国计算机等级考试(C语言部分)情况,通过分析成绩分布与题型关系,我们发现指针方面的题型失分率最高。在此基础上结合教学实际,本文提出学习指针知识的方法和顺序过程,并将其应用在C程序设计课程教学中,取得了较好的实践效果。

关键词:等级考试;指针;指针类型;指针常量;指针变量;数组与指针;行指针;列指针

据统计,十年来我院有450多名学生先后参加了全国计算机等级考试。我们对C语言笔试和上机成绩分析发现,指针类型方面的题型出错率最高,占平均错误率的60%左右,这说明指针知识的学习是学生学习C语言的难点。指针类型是一种特别的数据类型,与C语言中其他数据类型相比,既抽象又复杂,同时有关C语言的教程类图书对指针论述的差别也给学生带来了困惑。根据笔者的经验,学生只有掌握了与指针类型相关的基础知识,才能较好地理解、掌握和应用指针数据类型。

1计算机内存储器地址的编码方法

欲学好指针类型,首先要知道计算机内存储器地址的编码方法。计算机内存储器里存储的信息都是由1和0构成的二进制数来表示,每一位二进制数位是表示信息的最小单位,计算机技术规定在内存储器里用八位二进制数位来存储信息,这八位二进制数位叫一个字节,即在内存储器里是以字节为单位存储信息的,如大写英文字母A,在内存储器里用01000001表示。把能表示八位二进制数的存储空间叫一个字节存储单元。

在实模式下“为了访问存储器的不同字节存储单元,每个字节存储单元人为给以一个编号,叫存储器的地址,地址从0开始编号,顺序地每次加1。”如PC计算机配置512MB内存条,其存储空间地址编号范围用十六进制数表示为00000000~3FFFFFFF,即十进制数的范围为:0~536870911,有536870912个字节存储单元,相当于可存放536870912个英文字符(半角字符)。配置1G内存条,其存储空间地址编号范围用十六进制数表示为00000000~7FFFFFFF,即十进制数的范围为:0~1073741823,有1073741824个字节存储单元,相当于可存放1073741824个英文字符(半角字符)[1]。

2存储单元的地址

C语言中数据有基本类型(字符型、整型、长整型、实型、枚举型)、构造类型、指针类型等。不同数据类型在内存中存储时,占用的字节数不同,如字符型需要1个字节空间,整型需要2个字节空间,长整型需要4个字节空间等。把不同数据类型存储时需要的N个字节看成一个整体,叫一个存储单元。对字符型N=1,整型N=2,长整型N=4等。对1个字节构成的存储单元,其字节单元地址编号就是该存储单元的地址,对多个(N>=2)字节构成的存储单元,其低字节单元地址为该存储单元的地址,也叫存储单元的首地址[1-2]。

3指针类型

语言中的指针类型有指针常量和指针变量。指针常量简称为指针,即存储单元的地址。可以认为配置不同容量的内存,其指针值的范围是不同的,但都是

作者简介:杨加义(1960-),男,高级讲师,研究方向为嵌入式系统、Matlab仿真技术、Matlab语言与学科教学。

从0起始的。每个存储单元的指针值都是固定不变的。指针变量就是用来存放指针的变量。指针变量是一种较特别的变量,它的值是一些特定的整数值,不是任何整数(如负整数)都可以存放到指针变量,指针变量与整数加减运算也不同于数学中的运算方法。指针变量也有自己的内存空间,空间的大小由编译器决定,在Turbo C 2.0下是2个字节,在Visual VC++下是4个字节[1,3]。

4变量的指针

在编译C语言程序时,要在内存为各种变量分配相应的存储单元,相应的变量名称对应着存储单元的首地址,这首地址就是变量的指针。可以将一变量的指针赋给一指针变量(存到指针变量代表的存储单元中),这时就说指针变量指向了该变量(也可以说指针变量指向了该变量表示的存储单元)。对存储单元的存取操作即可以用变量名,也可以通过指向该变量的指针变量来进行,这要用到指针运算符“*”[3]。

5指针变量类型和它所指向的数据类型

指针变量的类型以声明它时其前面的“*”为标志,无论指针变量指向何种数据类型,它所占用的内存空间大小是一定的(如2个字节),这与其他数据类型的变量所占有的内存空间大小一定一样,所以指针变量的类型就是指针类型,与它所指向的数据类型无关。有资料把可指向不同数据类型的指针变量说成有整型指针(int *)变量、实型指针(float *)变量、字符型指针(char *)变量等,笔者觉得没必要。如果非要这样说,理解成指针变量可指向什么数据类型变量就叫什么数据类型指针变量为好,如 int *p;的声明p可以指向整型变量,说p是整型指针变量为好。

声明指针变量时,还要声明允许指针变量指向的数据类型,这由声明指针变量时“*”前面的“基类型”决定。指针类型加减整数运算时移动的位置大小由指向的数据类型来决定。指向同一种数据类型的不同指针变量间可以进行加减或大小比较运算,指向不同数据类型的指针变量不能进行加减运算或大小比较运算。指针变量一旦被“基类型”声明可指向某种数据类型,就不能再指向其他别的数据类型。

指针类型中的指针变量还可进行自增自减运算,而指针不能。指针变量既可以是左值,也可以是右值,指针只能是右值。由指针、指针变量与运算符构成指针类型表达式。下面说的“&”作为单目运算符时与一个变量结合就构成指针表达式,如&a,&p等,而“*”作为单目运算符只可与指针类型结合,构成指针类型指向的数据类型表达式,如有:

int *p,a,b;

p=&a;

b=*p;

*p=10;

*&a=20;

其中“b=*p;”的*p就是整型表达式,也是一个整型变量,&a是指针类型表达式,*&a是一个整形表达式,也是一个整形变量。

对于指向指针变量的指针变量,还要复杂些[3]。

6 “&”和“*”运算符

C语言中有“&:按位与运算符,是双目运算符,结合性是由左到右”和“&:取地址运算符,是单目运算符,结合性是由右到左”,有“*:乘法运算符,是双目运算符,结合性是由左到右”和“*:指针运算符,是单目运算符,结合性是由右到左(“*”在声明指针变量时也用到了)”。

对于取地址运算符&只能与一个变量结合构成指针类型表达式,如有变量name,则&name就得到变量name的指针。

对于指针运算符*,意义是“取其指向的内容”,这里说“取其指向的内容”不是指存储单元里存放的值,而是表示指针变量指向的变量。在有的书中说“例如:&a为变量a的地址,*p为指针变量p所指向的存储单元的内容(即p所指向的变量的值)[1]”,这种说法值得商榷。笔者认为用“*p代表指针变量p所指向的存储单元(即p所指向的变量)”的说法比较合适,更直接说 *p是一个变量,因为*p可以是左值。如下代码:

void main()

{int a,*p;

p=&a;

*p=10;

printf("%d,%d\n",a,*p);

*&a=20;}

输出a和*p的结果都为10,说明*p与a等价。通过 *&a= 20;语句还可以改变a的值,也说明 *&a与a等价,*&a可以是左值[4]。

c语言中指针的类型,学习C语言中的指针类型相关推荐

  1. 单片机c语言执行从什么开始,学习C语言从什么开始学起

    我来说说我的学习经验,说句实在话我真正学会C语言是从开始学习单片机开始的,以前在上学时也学过C语言,由于只是应付考试,没有深入去学习,当时只是学习了C语言的一些皮毛没有领会C语言的精髓.后来由于工作的 ...

  2. c语言需要哪些英语基础,学习C语言的必备基础知识(国外英语资料).doc

    学习C语言的必备基础知识(国外英语资料) 满卧裹瑟莉筑部获搪肪棱惺杀摄械圭旬敷豹休登悬邱雀报台盼拈毒鹰进怀却恩登雄旁二宇谊婆叔陌嘎扇体歌嫉蹿久题篡憨琵夹涌芦鸣褐颂诅讳拴狸果液梦绸亥氯确杯牌憨耗终贼况榔 ...

  3. python语言中、复数类型中实数部分_python学习03.02:Python数值类型(整形、浮点型和复数)及其用法...

    实际开发中,我们经常需要使用数字记录游戏中用户的得分.游戏中角色的生命值.伤害值等信息,Python 语言提供了数值类型用于保存这些数值. 需要注意的是,Python 中这些数值类型都是不可改变的,也 ...

  4. c语言不定长数组_学习C语言这三块“硬骨头”不搞定学了也是白学

    C语: C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块"难啃的硬骨头"几乎是公认级别的. 01指针 C语言 指针公认最难理解的概念,也是让很多初学 ...

  5. c++ 指针_C/C++学习笔记——C提高:指针强化

    指针是一种数据类型 指针变量 指针是一种数据类型,占用内存空间,用来保存内存地址. void test01(){ int* p1 = 0x1234; int*** p2 = 0x1111; print ...

  6. e会学c语言作业答案,E起学习 | C语言期末交流会圆满结束

    原标题:E起学习 | C语言期末交流会圆满结束 12月20日晚7:00,电气与电子工程学院期末C语言交流会在主B516成功举行. 期末临近,尽管冬日寒冷,但依旧挡不住大家学习C语言的热情和提高成绩的梦 ...

  7. 机器人c语言教程pdf,机器人卡雷尔学习C语言.pdf

    机器人卡雷尔学习 C 语言 新疆农业大学计算机与信息工程学院 张太红.陈燕红编著,2013 年 9 月 斯坦福大学计算机科学系 埃里克·罗伯茨著 (Java版),2005年9月 目 录 第一章 机器人 ...

  8. 如何快速学好python语言_如何快速的学习Python语言

    本文主要向大家介绍了如何快速的学习Python语言,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 基于自己的学习方法来分享,请客观的看待我提到的几点意见,谢谢. 文末有我自己在g ...

  9. python是一种汇编类型的语言_python全栈开发学习_day2_语言种类及变量

    一.编程语言的分类及python相对其他语言的优势 1)三大语言种类及细分 1.机器语言(低级语言):直接用计算能够理解的二进制进行编写,直接控制计算机硬件. 优点:执行效率高. 缺点:开发效率低,跨 ...

最新文章

  1. 资源 | 8张思维导图帮你梳理深度学习机器学习多个知识点
  2. ecplise 下的.class .project .setting 文件介绍
  3. Java面试题库,mysql远程访问权限设置
  4. oracle Fusion Applications 的架构
  5. ORA-12154:TNS:无法解析指定的连接标识符
  6. atoi函数_吊打面试官 | 腾讯经典考点写代码实现atoi函数
  7. Axure在SVN共享项目如何获取历史文件
  8. 一般线性规划问题的2阶段单纯形算法
  9. python爬虫之---------------cookie和session
  10. 在Docker上删除Solr的core
  11. 关于在IE浏览器下按钮或者链接点击时出现outline的解决方法
  12. 通过注册表快速清理残留的软件
  13. 2.2析取范式与合取范式
  14. SCVMM 2012 R2---安装Hyper-V Server 2012 R2主机服务器
  15. VirtualBox安装增强工具时:Unable to install guest additions: unknown filesystem type 'iso9660'
  16. matlab计算二重指数积分,MATLAB计算二重数值积分(dblquad),来学习吧
  17. 操作系统实验指导书(完整版)
  18. 计算机无法用630打印机,爱普生LQ-630型针式打印机突然打印几行乱码,就不工作了...
  19. 快速把PDF文档里的表格粘贴到excel的方法
  20. android 7图标大小,Android快捷方式位图启动器图标大小

热门文章

  1. 安装中文版man手册,同时保留原英文版手册
  2. [Python] sys.argv[] 用法
  3. DFT实训教程笔记4(bibili版本)- ATPG
  4. android之broadcast发送广播
  5. C语言常用宏定义(#define)使用方法
  6. 二 DeepinV20版本安装
  7. 基于MATLAB的Okumura-Hata模型的仿真
  8. 基于MATLAB的RSSI定位算法仿真
  9. echarts图表第一个案例
  10. RF设计天线 PI型匹配layout注意事项–物联网设计小技巧