谭浩强. C程序设计(第三版)
.清华大学出版社. 2005
宗大华、蒋玮. C语言程序设计
.人民邮电出版社. 2003
黄维通,马力妮. C语言程序设计
. 北京:清华大学出版社. 2003
c语言指针范文第4篇
摘 要 指针在C语言学习中起着举足轻重的作用,c语言学的好不好关键在于对指针的掌握。本文介绍了指针学习的现状、引入指针的作用,并对C语言指针中较易混淆的概念进行了详细阐述,最后探讨了指针与数组、函数的关系和使用方法。
关键词 指针 C语言 数组 函数
中图分类号:TP393 文献标识码:A
Study and Summary on Pointer in C Language
LI Xiangqin
(School of Computer Science, Wuhan University, Wuhan, Hubei 430079;
School of Computer Engineering, Jingchu University of Technology, Jingmen, Hubei 448000)
Abstract Pointer in C language learning plays an important role, the key is to master the pointer in C Language. This article describes the learning status of pointer, the role of introduction of the pointer, and C language pointer more confusing concepts were elaborated, and finally explore the relationship between pointers and arrays, functions, and use.
Key words pointer; C Language; array; function
0 引言
指针是C语言的精华,也是大学《C语言程序设计》①课程教学的重点与难点。通过使用指针变量可以较方便地使用字符串、数组,可以表示各种数据结构,从而能够编写出执行效率高、可读性强的程序,它在很大程度上增强了C语言的功能。
对于一个不涉及指针、只有程序设计结构、函数和数组的程序,许多学生在分析它时还觉得得心应手,一旦引入了指针,便不知所措。究其原因,对指针的理解只停留在表层,没有从较深层次去理解。指针的概念本身比较复杂,涉及指针与地址、普通变量与指针变量、指针与函数、指针与数组,使用也比较灵活,需要多思考、多总结、多上机,在实际操作中才能逐渐掌握。因此,如何学好C语言中的指针成了一个值得研究的课题,下面就几年来在实践教学过程中存在的想法进行总结和学习。
1 引用指针的作用
通过定义指针变量可以确定存储单元的地址和类型,如有int i, *p=&i;则变量i与*p是等价的,在程序中可以用变量i和*p两种方式来访问存储单元。因此,指针变量是一种新的访问存储单元的方法,它的作用主要表现在三个方面:
(1)能够突破变量作用域的限制。程序中通常把一部分代码放在一个函数中,基于函数的封闭性,有些操作我们不能在它的外部执行,比如利用函数交换两个实参的值。当使用指针变量作参数时,实参传递的是对应存储单元的地址,若利用形式参数直接访问对应存储单元,将会打破变量作用域的限制,可以在函数中使用外部的存储单元。
(2)可以提高函数的执行效率。形参相关的存储单元较大时起步网校,如结构体,函数执行中用实参赋值给形参将花费较多时间和存储空间。如果把形参的类型换成相应的指针类型,函数的执行效率则会大大提高。
(3)使用未命名的存储单元。内存中的堆存储空间在程序运行中是用户自己申请并指定大小,一般通过调用库函数来完成,没有变量直接参与,只能利用指针变量间接引用的方式实现。
2 指针中较易混淆概念的理解
2.1 指针变量和指针运算符
C语言中通过变量使用计算机中的内存,变量是内存中某块存储单元的标识,它用来存放数据,如整型变量存储整数,浮点型变量存储实数。指针变量也是一种变量,定义一个指针变量就会有一块存储单元与之对应,只是它存储的是地址,是某类型的地址,如实型指针变量只能存储实型变量的地址,短整型指针变量只能存储短整型变量的地址。
指针运算符“*”在指针中一般在两种情况下出现:第一种是定义指针,如int i=13,*q;第二种是在赋值语句或程序执行中出现。第一种中“*”代表该变量的类型是指针型变量,指针变量名是p,而不是*p。第二种中 “*” 运算符表示取它指向的内容,*q表示指针变量q所指向的变量。
比如给指针赋值,可以采用两种方法: ① int i=3,*p; p=&i; ② int i=3,*p=&i;分别是先定义后赋值和边定义边赋值。实际教学中许多学生在先定义后赋值p=&i中常常将p错误写成*p物业经理人,主要是没有弄清楚概念,&i表示变量i的地址,而*p表示p指向的变量,变量的内容是数据,数据和地址是两种不同的值。
2.2 指针变量与自增自减运算符混合
许多学生在编程过程中总是辨不清(*p)++与*p++,其实仔细分析不难发现这两个表达式在程序执行时是有规律可循的。比如有int i=3,*p; p=&i;成立,则(*p)++可以(下转第141页)(上接第114页)先求括号中的内容,再进行自增运算,相当于i++ ;而对于*p++来说,它需要考虑运算符的优先级和结合方向。由于自增运算符++与指针运算法*优先级别相同,结合方向又为自右而左,它相当于*(p++),可以分成两步进行计算,第一步执行*p,即i的值,第二步执行指针移动p=p+1, p值发生改变。
2.3 数组名和函数名
数组名不能代表整个数组。C语言规定数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中首元素的地址,②即序号为0的元素的地址。
假设a是一维数组,如int a
10
; ,数组名a代表数组首地址,则a+i代表从首地址开始,往后偏移i个位置,即相当于是数组元素a
的地址。因此,a和&a
都代表第一个元素的地址,同理a+i和&a
都代表第i+1个元素的地址。
假设b是二维数组,如int b
; ,可以把数组b看成包含4个元素的一维数组(b
、b
、b
、b
),而其中每一个元素又是一个一维数组,包括5个元素。因此,在二维数组中数组名b代表数组的首地址,b+1是序号为1的行的首地址或称第2行的首地址。
跟数组名一样,函数名可以退化成指针。函数名是函数的地址,也就是入口地址。
3 指针与数组、函数的关系
3.1 指针与数组
指针可以指向数组,而数组也可以是指针数组。因此,指针与数组关系中有指向数组元素的指针和和指针数组。两者在形式上很相近,但意义不同。
定义指向数组元素的指针与指针变量的定义相似,如int a
10
; int *p;p=&a
; ,那么指针变量p指向了一维数组的第一个元素,通过指针下移可以指向数组中其它元素。而且,可以使用下标法(如a
形式)和指针法(如*(a+i)或*(p+i))访问一个数组元素。同时,在编程过程中我们经常见到形如int(*p)
10
的表示形式,其中p用来表示指向一维数组,p所指向的对象包括10个整型元素的数组。
指针数组是形如*p
,它是一个数组,每一个元素都相当于一个指针变量。为了更方便、灵活的处理字符串,引入了指针数组。二维字符数组和指针数组都可以用来存放字符串,如果使用二维字符数组存放则会产生一些问题,比如在定义二维字符数组时,需要规定列数,而实际操作中,给定的各个字符串长度往往不相等,若以最长得字符串长度来限定列数,将会浪费许多内存空间。如果以指针数组来存放,只需将指针数组的各个元素指向相应字符串,通过改变指针数组元素的指向就能改变各元素的值。
3.2 指针与函数
指针可以指向字符变量、实型变量、一维数组、字符串,也可以指向一个函数。函数名代表函数的入口地址,即函数的指针,形如c =(*p)(a,b); ,它用指针形式实现了函数的调用。
函数可以返回整型值、实型值,也可以返回一个地址。形如贝语网校,int *a(int x,int y);从形式上看,该式子与普通函数的定义比较相似,这里函数名a前多了一个*运算符,它表示函数是指针型函数,一般在该函数内部会再定义一个指针变量,同时给出相应的return语句。
4 总结
指针不仅在C语言中占据核心地位,还在一些课程如《数据结构》③中起很重要的作用,该课程里几乎所有算法的实现都离不开指针。而且,指针也出现在许多重要考试中,如大学计算机等级考试和计算机软件水平能力考试。因此,指针是学好C语言的关键。但C语言概念复杂,使用灵活,大部分学生难以掌握。在上机实验中,学生更容易出错,而且错误难以发现,这不仅要求教师在教学中能够深刻理解指针的概念,做到灵活应用,还需要不断的进行总结、比较和实践,而且要求教师能够利用各种教学手段与方法让学生更容易接受和理解, 同时也要求学生能够深入理解指针的概念、注重上机,在实践中不断学习、提高和完善。
注释
① 任正云,李素若.C语言程序设计.北京:水利水电出版社,2007.
c语言指针范文第5篇
关键词:指针;C语言;变量
中图分类号:TP312文献标识码:A文章编号:1009-3044(2012)21-5163-03
C Language Pointer in the Teaching of Basic Application
CHEN Jing-yan1,CHEN Yue-bin2
(1.Medical College of Shantou University, Shantou 515041, China; 2.Zengcheng College of South China Normal University, Guangzhou 511363, China)
Abstract:It can be said that the pointer is the soul of the C language, familiar and flexible use of the pointer, you can effectively represent complex data structures; dynamic memory; the use of string; arrays are very effective. Beginners often an error, how to enable students to acquire and in-depth learning pointer is a difficult and often requires some time. The following combination of experience, discuss and summarize the pointer problem.
Key words:pointer;C language;variable
C语言是一种计算机程序设计语言,是目前最广泛使用的计算机语言之一钓鱼网,也是各高校专业与非专业主要的计算机教学语言。指针是C语言中最为复杂的一个部分,使用起来非常灵活,因而学习时常出错,必须小心,多思考,多比较,在实践中把其掌握好。
1指针概念
指针变量简称指针,其实它也是变量,只不过里面存放的内容是一个地址,这个地址指向另外一个变量。指针就是内存的地址,必须弄清楚数据在内存中是如何存储与读取的;内存单元地址与内存单元内容是两个不同的概念。内存单元地址就像宾馆每个房间一样,其房间号就是其地址,单元内容可以理解为房中的宾客;如图1所示:假设程序定义了三个变量a、b、c,编译时系统分配1000和10001两个字节给a,1002和1003给b,1004和1005给c。由此可以知道,地址是用来标识每一个存储单元,是用户对存储单元中的数据的访问,在C语言中形象的将地址叫做指针,它可以用来指向变量、数组、结构体、和多级指针等等。对于表达式、常量或者是寄存器变量则不能用指针来指向。
2指针变量的定义和引用
2.1指针变量的定义
C语言规定指针变量在使用之前必须被定义,遵循先定义后使用的原则,定义指针变量与一般变量定义开式相似,也是用说明语句来实现的,但不同于其他类型变量的就是它是用来专门存放地址的。
指针变量定义的一般开式为
类型标识符*指针变量名;
下面都是合法的定义:
int *g1,*g2,*g3;定义g1、g2、g3指向整型数据的指针变量。
float *k1,*k2,*k3;定义k1、k2、k3指向实型数据的指针变量。
char *m1,*m2,*m3;定义m1、m2、m指向字符型数据的指针变量3。
在定义指针变量值得注意的是:
①“*”是一个指向符号,表示标识符为指针变量,上面的g1、g2、g3等是指针变量名,而不是*g1、*g2、*g3,值得注意的是指针变量是用来存放地址的。
②一个指针变量只能指向同一个类型的变量。由于不同类型的数据在内存中所占的字节数不同,如果忽而指向一个整型变量,忽而指向一个实型变量,会使系统无法管理变量的字节数而发生错误,所以只有同一类型变量的地址才能放到指向该类型变量的指针变量中。
2.2指针变量的引用
例如:
main()
int i=10,j=20;
int *g1,*g2;
g1=&i;
g2=&j;
printf("%d,%dn",i,j);
printf("%d,%dn",*g1一流范文网,*g2);}
运行结果为:10,20
10,20
本程序定义了两个指针变量g1和g2,“g1=&i;和g2=&j;”语句是将i与j的地址分别赋给g1和g2,不能写成“*g1=&i;和*g2=&j;”。
与指针相关的两个运符:
①&:取地址运算符。
②*:指针运算符或称间接访问运算符,取指针所指向的目标值。
“&”与“*”运算符的优先级别相同,按自右而左的方向结合,如“g1=&i;”语句,若&*g1,先进行的是*g1的运算,再执行&运算。如:*&i的含义是什么?当然先进行&i运算,得到i的地址,再进行*运算。
3数组的指针与函数的指针
3.1数组的指针
有两个概念我要必须分清。一个是指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。另一个是数组指针:首先它是一个指针,它指向一个数组。
简单举例说明:
int *p
10
;首先声明了一个数组,数组的元素是int型的指针。
int (*p)
;声明了一个指针,指向了一个有两个int元素的数组。
其实这两种写法主要是因为运算符的优先级,因为
的优先级比*高。所以第一种写法,p先和
结合,所以是一个数组,后与*结合,是指针。后一种写法同理。
应当注意,如果数组为int型,指针变量也应是int型。下面是指针元素的赋值:
p=&a
C语言规定数组名代表数组的首地址,是第一个元素的地址。所以p=&a
与p=a是等价的。注意a不代表整个数组,“p=a;”的作用是把a数组的首地址赋给p,而不是a的所有元素都赋给p。
在定义指针变量时是可以赋给初值的:
int *p=&a
等效于:
int *p;
p=&a
多维数组(以二维数组为例)
二维数组的定义:
static int a
={{1,2,3},{4,5,6}};
a是一个数组的名字,包含二个元素:a
,a
。而每个元素又是一个一维数组,每个一维数组又包含有三个元素。如a
中的三个元素分别为a
,a
,a
。a代表的是二维数组的首地址。
3.2函数的指针
指针是可以指向一个函数的,在编译时被分配给一个入口地址,这个入口地址就叫做函数的指针。在一个程序中,一个指针变量可以先后指向不同的函数。
指向函数的指针变量定义开式为:
数据类型标识符(*指针变量名)(参数1,参数2);
下面通过例子来说明用指针形式实现对函数调用的方法。
int max(int a,int b)
if(a>b)return a;
else return b;}
main()
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
pmax为函数指针变量,并把函数入口地址赋给该函数指针变量,pmax=max。调用函数的形式:(*指针变量名)(参数表)其中的*号不是求值运算,它只是一种表示符号。如本程序中的z=(*pmax)(x,y);值得注意的是:函数指针变量与数组指针变量是不相同的,数组指针变量加减一个整数可使指针移动指向后面或前面的数组,而函数指针是没有移动的意义的
4总结
C语言指针对于初学者来说是一个短时间内很难掌握的问题,指针灵活性较大,对于刚开始学习的学生,要搞清楚指针的各个方面内容,例如:指针类型、指针所指向的类型、指针所指向的内存区,还有指针所占据的内存区等基础方面内容。在多思考、多注重比较和多上机实践,才能真正的掌握好指针课程。 |