电脑桌面
添加盘古文库-分享文档发现价值到电脑桌面
安装后可以在桌面快捷访问

C语言中指针运用

来源:火烈鸟作者:开心麻花2025-11-191

C语言中指针运用(精选10篇)

C语言中指针运用 第1篇

在C语言中存在一种指针变量, 这种变量与普通的变量一样在定义了之后都会在计算机中占据一定的位置, 其中储存这一定的数据, 只是这里面储存的数据是一个地址。这个地址指示了另一个数据的位置。通常来说, 对于指针变量的定义:指针类型数据的数据类型是关键字, 指针变量中存放的数据是另一个数据的储存地址, 指针变量的性质就是它储存的位置中的数据的性质。

2 C语言指针在应用过程中的优势分析

C语言指针是C语言中的重要组成部分, 在C语言的使用过程中如果能够熟悉的使用C语言指针, 能够帮我们解决很多实际中的难题, 可以使很多复杂的问题变得简单。用指向性的单变量指针变量作为一个函数的参数, 能够得到多个变化后的值。通常在运用函数调用都是有且只有一个函数值会被得到, 而在应用了指针函数之后, 通过一个变量就能得到很多变化之后的值。在指向性数组之中是有指针函数的话能够短时间内得到很多的结果, 对于数组的处理效率会得到很大的提升, 所以说在熟练的掌握了数组之后可以用数组来处理数组能够极为有效的提高对数组的处理效率。指向性的字符串在应用了指针变量之后能够减少数据储存的空间, 指针变量本身就可以储存数据的位置, 所以在使用了指针变量之后字符串的存储空间能够得到很大的提升, 从而提高程序工作的效率。指向结构体变量的指针作为函数的参数的时候能够在很大程度上节省时间和存储所占的空间, 从而提高程序的执行效率。指向量FILE类型的结构体中应用指示变量能够很快的找到与之相关的文件, 从而更快的实现对文件的访问。

3 C语言指针运用中的问题

C语言指针在与C语言中的数组、函数以及运算符号结合之后, 通常在说明的时候会具有很高的复杂行, 使得人们对于指针的含义理解起来十分的困难, 下面是对人们在使用C语言指针是所犯的错误。

3.1 悬游指针

悬游指针是一种使用的未进行初始化的指针p, 这个指针并不是说没有值, 只是它的指示不确定的, 同时, 因为它的值不确定的原因, 这个指针的指向也是不确定的, 这中不确定性就有可能会破坏整个系统的正常工作, 是一种很危险的指针类型, 在使用过程中这种指针很有可能会对程序造成不可挽回的灾难性后果。

应在for语句前加上语句"p=a;", 使p初始化[3]。

3.2 指针指示类型错误

在这个程序当中将p=a【0】错用为了p=a, 虽然在程序当中a和a【0】的值是相同的, 但是a【0】是一级int型指针, a是二级的, 二者的指针类型不同, 指示的对象也不行同, 所以说这个程序之中p只能接受a【0】不能接受a。

3.3 指针偏移

在上面的这个程序中, 当指针初始化p=s进入循环之后p会进行自加, 这可能会使得p的指针转移到字符的其他位置中去, 甚至可能会使p转到字符串的另一变量或者程序代码之中。这种情况是非常危险的, 对于整个程序的运行来说都是可能会造成不可挽回的后果。

3.4*和[]在定义时只是说明作用, 不是运算符

&、*、[]是C语言中的三种运算符号, 他们的含义分别是地址运算符、指针运算符跟下标运算符。人们对于这三个运算符所代表的意义是很明确的, 并没有什么错误的理解。但是在实际的应用中, 很多人却将他们看作是运算符号。&、*、[]这三个运算符在运算的过程中只是起到说明的作用, 并不能看做是运算符。

3.5 用整数值对指针进行赋值

在C语言之中, 指针的值就是他所指向的地址, 准确的说指针的数值在程序的运算过程过程中就是一个整数数值, 但是却不能够直接讲一个整数的数值赋予给指针。因为指针的整数数值是有方向性的, 但是在程序语言中的整数数值却是没有方向的。将这个没有方向的整数数值赋予到指针的时候, 指针就真的只是一个整数数值而不能指向一个地址。

最后一个语句的目的是使指针指向地址192635 (十进制) , 编译时系统会提示这个语句有错误。

3.6 指针之间值的相互赋予

在C语言之中, 指针的值是可以相互赋予的, 比如说在这个程序之中“m=n”就是讲n的指向赋予给了m中去, 但是原来已经赋予给m的内存空间却没有被释放出去, 使得这个内存空间成为了无效的内存空间, 但是在实际的程序运行中又需要对m进行反复的应用, 这也就使得内存空间变得十分的紧张。所以我们在进行指针之间值的赋予是通常会将被赋予的指针的内存空间进行释放, 将其中的内存空间赋予给一个无用的指针, 然后再将有用的值赋予到该指针中去。使程序在反复运行时不会存在内存不足的情况。指针之间的赋值不当会造成内存紧张, 严重的时候甚至会造成死机现象。

3.7 指针赋值只能存在于相同类型之间

C语言中的指针具有不同的类型, 而在进行指针之间的赋值的时候, 只能在相同类型的指针进行赋值。如果两个指针的类型不相符合的话是不能够进行赋值的。如果一个指针被赋予了其他类型指针的数据, 将会在程序的运行中造成错误。可能会造成程序的运行错误甚至于使得程序崩溃。

4 结语

C语言中的指针使得C语言的应用变得十分灵活, 使得许多问题的解决变得方便了很多。虽然说指针的应用使得对问题的解决变得灵活简单, 但是许多C语言的初学者因为对指针的定义理解的不够透彻, 在使用指针的过程中会犯很多错误, 影响程序的正常运行。

参考文献

[1]张威虎.C语言指针运用探讨[J].延安大学学报:自然科学版, 2000 (3) :25-27.

[2]史娟.C语言指针教学中的常见问题及教法探析[J].电脑知识与技术, 2012 (17) :4168-4169, 4172.

C语言中指针运用 第2篇

C 语言中的结构当然可以包含指向自己的指针;[K&R2, 第6.5 节] 的讨论和例子表明了这点。NODEPTR 例子的问题是在声明next 域的时候typedef 还没有定义。为了解决这个问题,首先赋予这个结构一个标签(“struct node”)。然后,声明“next” 域为“struct node *”, 或者分开typedef 定义和结构定义, 或者两者都采纳。以下是一个修改后的版本:

struct node{

char *item;

struct node *next;

};

typedef struct node *NODEPTR;

至少还有三种同样正确的方法解决这个问题。

C语言中指针运用 第3篇

关键词:C语言KM教学法指针

中图分类号:G420文献标识码:A文章编号:1674-098X(2011)06(a)-0190-01

教学方法是教师为完成教学任务所采用的手段,对教学目的的实现具有重要意义。在确定了教学目的,有了相应的教学内容之后,为了取得预期的教学效果,就必须采用适当的教学方法。教学方法要与学生的认识规律相适应,要与训练指导思想和教学原则相适应。因此,教育工作者在教学方法上作了大量的改革和创新,如问题教学法[1]、任务驱动法[2]、专题式教学、引导发现教学法、互动教学法、问答式教学法以及KM教学法[3][4]等。其中,KM 教学法符合教学赖以存在和发展的认知机理,能够系统而有重点地组织教学内容,符合学习思维的逻辑认知过程,它贯穿于教学的主要环节,具有实用性和通用性。

1 C语言指针

C语言因为其功能强大、使用灵活、可移植性好,几乎成为了高校大学生必修的一门课程,在大学生计算机知识体系中有着重要的基础性作用。

指针是C语言中非常重要的一种数据类型,也是C语言的一个重要特色,灵活掌握指针的用法是C语言使用能力的一个标志。正確而灵活地运用它可以有效地表示复杂的数据结构,能动态地分配内存。能直接处理内存地址等,可以使程序简洁、紧凑、高效。这对软件设计十分必要。但是指针概念比较复杂。应用也比较灵活且容易出错,学习者较难掌握,是C语言教学的难点。

特别对于初学者来说,指针通常比较难理解。而由指针错误引起的调试问题连富有经验的程序员都感到头痛。然而,指针是大多数C语言程序的重要组成部分,在C语言的高级编程中基本都涉及到指针的应用,而且在以后的许多C++程序中仍然受到重用。

2 KM教学法

KM是指在“知识逻辑结构”(Knowledge Logic Structure)的总体架构下融入“思维导图”(Mind Mapping)进行微观演绎[4]。知识逻辑结构(K)是通过知识逻辑结构图的形式给出所论知识系统的总体框架,表示了其中各知识子系统间的内在联系,是从宏观层面而论的,而思维导图(M)则是从微观层面揭示了知识子系统中思维过程的一种自然导向的表达。

在教学实施过程中,先讲逻辑结构或知识框架,使得学生对所要学的知识全貌一目了然,有一个宏观的认识,并且很容易理清知识总体条理;然后再在框架中填充知识,是一个微观学习的过程,而在介绍微观知识的过程中,借助思维导向启发学生对知识进行逐层深入的研究;最后再把填充知识概括起来,重新回到主框架中,使得学生加深对知识的理解和掌握,以便进入下一部分知识。从而形成以知识逻辑结构为主体贯穿、将思维导图融入进去的一种综合集成、多层次递阶的知识认知系统,完全符合学生学习和认知事物的科学规律。

本文从KM教学法入手,介绍C语言程序设计中指针的知识逻辑结构与框架,以及各知识点之间的内在联系,从而达到熟练应用指针的目的。

3 应用KM教学法的C语言指针教学

指针是C语言的重要组成部分,是C语言程序设计的难点之一。本文以清华大学出版社出版的C程序设计[5](第三版)为主,辅以程序设计中涉及到的其他指针部分,对指针涉及到的知识点进行归纳总结,设计了指针的逻辑思维图,以整型(int)为例,假设已经正确定义了整型变量x,y,z,且已经正确初始化。

教学中,首先根据程序中的变量都是要存储的,引入指针的概念:指针就是用来指向变量的,具体地说,指针就是地址,指针保存的就是其所指向的变量的地址。从而引出指针变量的定义形式(以int为例): int x;int *p=&x; 这就定义了一个整型的指针变量p,该指针指向整型变量x。进而一步一步对指针所涉及到的知识点一一展开,详述其定义方式与应用形式,最后介绍指针的运算方式等。

4 结语

指针是C语言最显著的特征,也是C语言中的重点难点内容.熟练使用指针,可以使程序质量提高,且编写程序更方便、灵活。本文根据KM教学法按照知识延伸和发展的内在逻辑性,确立以讲授知识的逻辑结构、理论框架和内在联系为主,对思维活动加以诱导,坚持“先搭架,后填充,再诱导”和少而精的原则,进行指针知识的组织和教学,是一种非常值得大力推广的教学方法。

参考文献

[1] 吕伟.应用问题教学法改革材料力学的课堂教学模式[J].力学与实践,2001.

[2] 胡宁.计算机教学中的任务驱动法[J].辽宁师专学报:自然科学版,2005.

C语言中指针的用法 第4篇

在C语言中, 指针是一种很重要的数据类型。程序运行时, 所有的数据都存放在计算机的内存单元中, 为了能够正确的访问这些内存单元, 在计算机内部, 所有的内存单元都要统一的进行“编号”, 也就是说, 所有的内存单元都要有地址, 并且具有唯一的内存地址。一个变量在内存中对应一个单元地址, 通常把这个地址称为指针。

在C语言中, 指针定义的一般形式为:类型说明符*指针名。

与其他程序设计语言有所不同, C语言允许使用变量的地址来访问变量, 这就意味着C语言中除了有存储数、字符等内容的普通变量外, 还有一种特殊的变量。这种变量存储的是另一个变量的地址, 而不是通常意义下的数和字符, 这种存储地址的变量称为指针变量。例如, 当变量a存储了变量b的地址, 就称变量a指向了变量b。

二、指针的引用

1. 指针的初始化。

数据类型*指针名=初始地址值。例如:int i, *p=&i。在这需要注意几个问题, 首先指针变量在使用前需要先赋值, 其次指针所指的变量已经说明过, 而且指针与所指变量类型应该一致, 最后还需注意不能对指针赋非地址值。

2. 指针变量的引用。

例子如下。

本程序首先定义指针变量p和q, 并在定义的时候对变量p初始化, 使它指向变量m。赋值语句n=*p*2-3表示将p所指向的存储单元中的值28乘以2再减去3, 再将这一表达式的值赋给变量n。q=&c1表示指针变量q指向字符变量c1的存储单元。赋值语句*q=c2+1表示将字符’g’送入q指向的存储单元中。最后程序运行的结果为:

在这里需要注意, 当*p出现在变量定义中的时候, 表示定义了指针变量p;如果出现在表达式中则表示取p所指对象的内容。

三、指针与数组

在C语言中, 指针与数组有着十分密切的联系。可以说程序中凡是用数组处理的算法都可以通过指针实现, 而且速度要比下标法快得多。

1. 指针与一维数组。

假设有定义语句:int a[100], *p=a;将数组a的首地址赋予了指针变量p, 这就使指针变量p指向了数组a的第一个分量a[0]。由于数组的存储结构是连续的, 即数组元素在内存中是连续存放的, 因此a+i就是a[i]的存储地址&a[i], * (a+i) 表示取a+i地址中的内容。当指针变量p指向数组的首元素a[0]时, p+i就代表a[i]的地址, * (p+i) 就代表a[i]。当指针p指向一维数组中的某个分量时, 执行p++或p--就表示使指针p后移或前移一个存储单元, 其位移的字节数取决于基类型。

2. 指针与二维数组。

当指向数组的指针处理二维数组时, 有以下使用规则:

p是行指针, p+i、p++或p--均表示指针移动的单位是行;p只能指向二维数组中的行, 而不能指向一行中的某个元素, 但是可以通过p引用二维数组中的元素, 例如引用a[i][j]可以用表达式* (* (p+i) +j) 或* (p[i]+j) 来表示。引用a[i][j]的地址可以用* (p+i) +j或p[i]+j表示;指针名p与二维数组名a虽然都代表“行指针”, 但指针名p为变量, 所以它可以被赋值, 而二维数组名a不能被赋值。

四、指针与函数

在C语言中, 指针与函数之间存在着广泛的联系, 其中最基本的联系就是指针变量作为函数的参数。将函数的参数设置为指针变量可以实现通过参数将函数值带出函数体的目的。

除此之外, 我们还能够在程序中使用函数指针。指向函数的指针, 称为“函数指针”。借助于该指针能够使函数如同普通变量一样的被传递和调用, 用函数指针作为函数的参数能够提高函数的通用性。

五、结束语

C语言函数指针变量 第5篇

在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为函数指针变量。

函数指针变量定义的一般形式为:

类型说明符(*指针变量名)();其中类型说明符表示现金网96y.org被指函数的返回值的类型。(* 指针变量名)表示*后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。例如:

int(*pf)();

表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。

本例用来说明用指针形式实现对函数调用的方法。

int max(int a,int b){

if(ab)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);

}

从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:

先定义函数指针变量,如后一程序中第9行 int(*pmax)();定义 pmax为函数指针变量。

把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行 pmax=max;

用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y);

调用函数的一般形式为:(*指针变量名)(实参表)

使用函数指针变量还应注意以下两点:

函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而博彩娱乐棋牌q07i5.org函数指针的移动是毫无意义的。

C语言中的指针 第6篇

1 概念

C语言中处理变量、数组、函数、文件时,需要由操作系统把这些量调入内存的不同存储单元中,每个内存单元都对应着一个地址,计算机就是通过访问这个地址来存取对应单元的内容。因此,地址又称为指针。C语言中的每种数据类型在内存中存放所占用的存储单元数是固定的。从而根据数据的第一个存储单元地址(首地址)及数据类型,计算机就可以访问这个数据。变量对应的首地址称作变量的指针。指针变量是用于存放某一类型变量地址的变量。指针变量的定义形式:类型说明符*变量名;其中*表示一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量的数据类型。例如:int*p,t;p=&&t;*p=2008;p为指向整数型的指针变量,t为整数型变量,现将t的地址放到p中即使p指向t的首地址,并对t赋值为2008。

2 运算

2.1 赋值运算

p=&i//将变量i的地址赋给p

p=a//将数组a的首地址赋给p

p=a[i]//将数组a中下标为i的元素地址赋给p

pl=p2//将指针变量p2的值赋给指针变量p1

p=NULL//将指针p赋空值,即不指向任何对象

2.2 指针变量加/减一个整数

p++//p指向下一个对象

p--//p指向前一个对象

p+i//当前对象后第i个对象

p-i//当前对象前第i个对象

p+=i//p指向当前对象后第i个对象

p-=i//p指向当前对象前第i个对象

2.3 两个指针变量相减

若两个指针变量指向同一个数组的元素,则两指针变量值之差是两个指针之间的元素个数再加上1。

2.4 两指针变量比较

若两指针指向同一个数组的元素,则可以进行比较。指向前面的元素的指针变量值小于指向后面元素的指针变量值。

2.5 其它运算

*p//取出p所指的内容

*p++//先*p,再使p+1

*++p//先p+l,再*p

(*p)++p//所指向的内容加1

3 误用

3.1 指针的初始化

没有赋值的指针内容是一个随机的地址值,如果把一个数据写入该地址中,容易造成无法估计的错误,这种错误可能会导致一些最隐匿、最难以跟踪的bug。该错误甚至会破坏计算机操作系统,导致系统崩溃。因此,一定要在对指针应用取内容操作符(*)之前,将指针初始化为一个确定的、适当的地址。例如:下列程序用于将键入的两个整数按大小顺序输出。

这里swap函数的功能是实现指针p1,p2所指单元内容互换,其中以*p为中间变量,这就犯了未定向就使用的错误,根据C编译系统的规则,当swap函数发生调用时,系统仅给指针p分配一个内存单元。而这一内存里存放的地址未定。它可能是操作系统或其它用户区的某一内存地址,当运行程序时,很可能使不属于本程序的某个内存内容被修改,从而造成整个系统的崩溃。对swap函数可修改为如下形式:

3.2 指针类型错误

这里将p=a[0]错用为p=a,虽然a[0]和a的值相同,但a是二级int型指针,而a[0]是一级int型指针,二者指向的对象不同,类型不同,p只能接受a[0]。如果写成:“p=*a;或p=*(a+0);或p=&a[0][0]”也是可以的。

这里将p=a错用为p=a[0],因为类型不匹配,p是指向行的指针,应赋行地址。

3.3 指针偏移

这里,指针初始化p=s,进入循环后p自加,使得p的指针移到字符串的其它部分,甚至移出字符串指向另一变量或程序代码,这很危险。要把“p=s;”放在do循环之中,使p自加操作后复位。

4 指针与数组

4.1 指针数组与数组指针

指针数组,其本质是一个数组,即由指针构成的数组,数据类型是指针类型,说明数组的每个元素都是一个指针变量。如:int p[n];根据优先级关系[]高于*,所以p先与[n]组合,说明p是一个一维数组,长度为n,p前面的*是标记符号的作用,表示p数组不是一般的数组,而是指针数组,数组元素的值是用来存放其他变量的地址,n表示指针变量的个数为n。

数组指针,其本质是一个指针变量,而且这个指针变量是专门用来指向数组的,即指向数组的指针。如:int(*p)[n];()与[]的优先级相同,从左至右结合,(*p)先组合说明只有一个指针变量p,后面的[n]表示指针变量p用来指向一个带有n个元素的一维数组,指针变量的个数为1。

4.2 用指针访问数组

C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。例如有以下定义:int dates[4],*p:则dates+2=&dates[2];*(dates+2)=dates[2]进一步推广,若有p=&dates[n];那p+i就指向dates[n+i];*(p+i)与dates[n+i]等价;p-i则指向dates[n-i];*(p-i)与dates[n-i]等价;在程序设计中,数组既可以用下标访问,也可以用指针来访问。以下两个函数均为计算整型数组中各元素值的总和。

(1)函数1

(2)函数2

表面看来,函数2似乎比函数1简单。但是C语言的编译程序通常会将其中array[i]处理为*(array+i),每次都要增加一次加法运算,这与函数1中*p比较,效率自然低一些。这正是为什么在C语言中经常使用指针访问数组元素的主要原因。

5 指针与函数

在C语言的函数调用中,所有的参数传递都是使用“值传递”,如果在被调用函数中改变了形参的值,对调用函数中的实参没有影响。一般变量作函数参数时,主要通过函数中的return语句,将一个函数值带回到调用函数,如果想要得到几个返回值,必须通过全局变量。使用指针作为函数参数,就可以通过函数调用改变调用函数中指针所指向的地址的值。如:

这个程序要求的是给ptr动态分配内存,所以当分配了一块的内存,并且这个内存的首地址赋给p,这时候p指向的东西改变了,但没有影响到ptr指针,ptr指针指向的还是它原来的数据,只是p指针的数据改变了。引入一个指针的指针,让p指针指向ptr这个指针,这时候动态的分配的数据块传给*p,这个*p就是ptr,所以给ptr分配内存成功。

6 结语

指针是C语言中最为难学的一部分,也是C语言的精华部分。只有很好地理解并活用指针,才能真正领悟C语言的精髓所在,并且编写出精练而高效的程序。本文阐述了如何去理解好C语言中的指针,当然在理解的同时,需要结合个人实际,多编程、多上机调试摸索,只要做到这些,也许指针也并非那么难掌握。

参考文献

[1]谭浩强.C程序设计.[M].北京:清华大学出版社,2001.

C语言中数组和指针剖析 第7篇

但是如果是用静态数组, 比如是一维数组的话, 那不管你定义多大, 还是不能满足需要的, 如果定义char A, 当如果存储空间超过范围A数组就不能再存放了, 除非事先增大了空间。比如下面这个表格的模拟情况就反映了这个特点。

这个表格反映了使用A[5]数组来存放当增大就会溢出出错情况如下:

数组要事先就确定空间大小也就是下标大小, 而指针是可以变化的, 并且数组有下标就很方便来调用中间的一个具体位置的值。

C语言中对于指针可以指向相应类型的变量, 比如整型指针是不能指字符串的, 因为它的每次移动的大小跨度为两个字节, 而不同的记录型指针也是不能互相指向的, 也就是加入struct hhp*pl;这个pl结构体指针它的pl++的每次加一得跨度可能变化不一样, 也就是它的步长大小与其他的指针不同, 所以就不能乱指向。再比如一维数组a[5], 我们在使用它的时候, a+3则表示此时是a[3]的值了;而二维数组a[5][5]中的a+3, 则此时表示值为a[3][0]了, 所以就是地址跨度的不一样。指针一维数组char*a[5], 它相当于是一个二维非指针字符数组结构;指针二维数组char*a[5][5], 它相当于是一个三维非指针字符数组的结构;他们指向下一个的变化的跨度或者步长是不一样的, 要小心使用。

程序中使用指针和数组在本程序中发生地都是同一个错误, 此表如下示:

浅析C语言中指针的应用 第8篇

1 理解指针概念

在C语言中定义的任意变量, 在内存中都占用一定的存储单元。存储单元的每个字节都对应一个编号 (就好比酒店中设有很多间客房, 每间客房都有对应的房牌号) , 此编号就是变量在内存中的存储地址。指针就是用来表示这些地址的变量。简单地说, 指针就是地址。例如:int x;int*point;point=&x;表示point为指针变量, 存放变量x的地址;x就是指针变量point所指向的变量。假设x的地址为2016, 则point所存储的地址即为2016。很多学生最初都存在这样的疑问:若2016是变量x的地址, 那么要表示指针point存放变量x的地址是否可以这样赋值:point=2016。这是错误的, 这个赋值语句中的2016表示是一个整型数据, 不能表示地址。对于指针变量的赋值只能用取地址运算符"&"进行赋值, 即:point=&x;&x表示变量x的地址。初学者还需注意:指针必须先赋值后使用, 指针指向的变量类型必须和指针类型一致。

2 区分定义指针变量的*和指针运算符*

定义指针变量语句中的*是对指针变量的说明, 如int*point表示定义point是一个指向int类型的指针变量。

指针运算符*是一个单目运算符, 必须和指针变量结合表示间接访问该指针指向的对象。如int x=50, *point=&x;*point=60;第1个*表示定义point是一个指向x的指针变量, 第2个*和指针共同组成表达式*point表示间接访问x, 相当于给x重新赋值为60。

3 指针与数组

一个数组由若干个元素组成, 每个元素都对应一个地址, C语言中定义数组的指针, 是指向整个数组的起始地址, 和数组名表示的地址相同。数组元素的指针是数组元素的地址。例如:char s[10];char*p;这里的数组名s就是数组的首地址, 若赋值p=s, 则p为指向数组s的指针, 表示整个数组的首地址, s+3表示距离s后3个位置所在单元的地址。s[3]表示数组中第4个元素的值, 即距离s后3个位置所在单元中的值, 因此s[3]与* (s+3) 等价。由于p也表示数组的首地址, p+3与s+3等价, 因此p[3]与* (p+3) 、s[3]、* (s+3) 等价。需要注意的是, p是允许移动的, 如p=p+2, 表示p发生改变, 变为指向元素s[2]的地址, 此时p[3]、* (p+3) 不再表示s[3]的值, 而是与s[5]等价。而此例中的s只能表示数组的首地址, 不能出现这样的赋值:s=s+2。

4 指针与函数

在指针与函数的关系中, 有函数指针、指针函数、指针作为函数参数的三种常用形式。

(1) 函数指针

函数指针是指向函数起始地址的指针, 定义格式是:类型名 (*指针变量名) () ;由于函数是一个整体, 函数指针不能做自增、自减运算。

(2) 指针函数

指针函数是表示指针的函数, 其本质是一个函数, 返回值是某一类型的指针, 定义格式是:类型名*函数名 (参数列表) ;由于返回值是地址, 因此类型一般都定义为int。

(3) 指针作为函数的参数

函数的参数可以为字符型、整型、浮点型等数据, 也可以是指针类型, 它的作用是将变量的地址传递到另一个函数中。

例如, 有两个整型变量, m的值为55, n的值为66, 若要交换m、n的值, 使得m的值为66, n的值为55。首先我们以传值的方式构建函数:

在调用函数func_val (m, n) 后, 发现m、n的值并没有被交换。因为函数调用时, 将实参的值传递给形参, 函数最终交换的值是形参x、y的值, 并不是实参m、n的值。

要想使函数对两个实参进行交换, 必须使实参与赋值后的形参变量所处的地址是相同的。可以以指针的形式作为形参重新构建函数:

在调用函数时, 必须将m、n地址传递给以指针形式表示的形参p、q, 调用表达式应为func_addr (&m, &n) , 调用之后实参m、n的值被交换了。通过此例可以看出, 指针作为形参可以改变实参的值, 使函数构建的功能更加模块化。在C语言程序设计过程中, 指针可能是实现某些算法的唯一方法。

5 结束语

C语言程序设计是国内外大学计算机课程中重要的课程之一, 指针是该课程中非常重要的部分, 也是难点之一。在理论

学习了指针的各知识点后, 还应鼓励学生在课后要多思考、多编程、多实践。

参考文献

C语言中指针教学方法探究 第9篇

1 抓住一个关键

一个关键是帮助学生建立内存模型。使用指针就是动态使用内存, 只看几行代码是远远不够的, 一定要了解内存的布局和变化, 才能理解指针概念的本质[2]。建立内存模型最直观的方法就是图解法, 下面通过指针的基本概念具体介绍一下内存图解法的使用。

首先看以下语句:

在内存中创建两个int型变量a和b, 初始值分别为1和2, 可以在黑板上或者使用电子教鞭在幻灯片上画出内存图来帮助学生理解, 如图1左所示。

该图有以下两个特点:

(1) 不必画出变量的地址编号, 变量的地址是编译系统分配的, 无需知道具体的值;

(2) 直观反应内存变量内容的变化, 可以根据每条语句的执行情况来修改图中变量的内容。

该图虽简易, 但对帮助学生把抽象的内存形象化的作用是很明显的, 接下来添加如下语句:

int*p, *q;

该语句含义是定义两个int型的指针变量p和q, 这就涉及了指针的概念。指针就是地址, 变量的指针就是变量的地址, 指针变量就是存放变量地址的变量, 这些描述对于学生理解起来太抽象、太困难了, 通过画图就会使之容易理解, 如图1中所示。

系统为变量p和q分配空间, 因为变量没有初始化, 里面的值不确定, 只要明确一点, 即指针变量迟早会“指向”另一个变量, 即存放另一个变量的地址, 使用指针变量的最终目的就是为了能间接访问它所“指向”的变量。如何让指针“指向”需要访问的变量呢?使用以下语句来实现:

其含义是指针变量p存放int型变量a的地址, 指针变量q存放int型变量b的地址, 可以形象的理解为p指向a, q指向b, 如图1右所示。

这样, p和q就分别和a和b建立了关联, 可以通过如下语句实现间接访问:

以p为例, p代表变量a的地址, *p代表p指向的变量a, 即:

*p=5;等价于:a=5;

同理, *q=b+1;等价于:b=b+1;

因此, 上述语句执行之后, a和b的值分别被修改为5和3。这样, 指针的基本概念也就一目了然, 只要建立了内存模型, 指针的各类知识点和应用都可以让学生非常轻松地掌握。

2 掌握两个重点

在理解了指针的基本概念之后, 有两个指针的重点内容一定要掌握, 一个是指针作函数参数, 一个是指针与数组的关系, 下面分别加以介绍。

2.1 指针作函数参数

下面通过一个程序介绍指针作函数参数的执行过程, 并结合内存图帮助学生加深理解。

通过以前对函数知识的讲解, 可以很很明确该程序的执行流程, 语句执行顺序标志在每条语句之后, 下面结合内存图来分析。

首先, 程序从main函数开始执行, 先定义int型变量a和b, 初值分别为3和5 (图2左) , 然后以a和b的地址作为实参来调用swap函数, 这时, 形参指针变量p和q分配内存, 并分别获得a和b的地址 (图2中) , 程序转向swap内部执行, 定义int型变量t, 接下来的三条语句是通过t完成对*p和*q内容的交换, 注意, p和q是指针变量, 分别“指向”a和b, 因此, *p等价于a, *q等价于b, 相当于在swap中远程交换了main中a和b的内容, 当swap调用结束之后, 形参p和q以及t变量被释放, 此时程序返回main中继续执行, a和b的值已经被交换, 分别为5和3 (图2右) 。在此程序中, 参数传递不再是值传递, 而是地址传递, 即通过形参的修改使实参也发生了变化。通过内存图解法分析程序, 可以培养学生的形象思维能力, 更加透彻地理解指针作函数参数的内涵。

2.2 指针与数组

指针和数组的关系是C语言中非常重要的知识点, 通过指针访问数组可以使程序的设计更为灵活, 提高程序的执行效率。C语言常用的数组有一维数组和二维数组, 其中指针访问一维数组是最基础和重要的, 讲解要点可以概括为下面的“一个图+两个公式”。

(1) 一个图

如有以下的语句:

首先定义长度为5的int型的数组a, 然后定义i n t型指针变量p, 接下来的语句“p=a;”十分关键, 由于数组名代表数组首元素的内存地址, 因此p=a表示把a数组首元素a[0]的地址赋值给p, 即p指向a[0], 这样, p就和数组a建立了关联, 可以通过p来访问数组a, 需要注意的是, p和a的值相同, 都是数组a[0]的地址, 因此a也指向a[0], 那么p+1和a+1都指向下一个元素, 如图3所示。

(2) 两个公式

如前例, p指向数组a之后, 可以通过p来访问数组a, 在实际应用中, 使用数组包括两个方面, 一个是数组元素的内容, 另一个是数组元素的地址。指针的引入使元素内容和元素地址的表示形式多样化。以元素a[2]为例, a[2]表示内容, &a[2]表示地址, 因为p指向a[0], 由图3所示, p+2和a+2都指向a[2], 根据指针的概念, a[2]可以由* (p+2) 和* (a+2) 来表示。还要注意一点, 由于p和a的值相同, C语言中允许使用指向数组的指针变量p来代替数组名a来表示数组元素, 即:a[2]等价于p[2]。推广到任意的数组元素总结出如下两个公式[3]:

假设指针变量p指向数组a, i代表合法的下标, 则:

数组元素表示:a[i]⇔p[i]⇔* (a+i) ⇔* (p+i)

数组元素地址表示:&a[i⇔]&p[i]⇔a+i⇔p+i

结合一个内存图, 记住两个公式, 无论指针的形式如何复杂, “万变不离其宗”, 都能灵活的使用指针访问数组, 无论对应试还是编程都有莫大的益处。

3 结语

综上所述, 作为C语言教学重点内容的指针, 虽然概念复杂, 使用灵活, 学生难于理解, 但只要把握建立内存模型这一关键点, 就能通过图解法将指针的概念以及指针相关知识点“化繁为简”, 这种教学方法不仅适用于指针, 对讲解函数、数组等内容很有效。笔者已将该方法用于课堂教学, 取得了很好的教学效果。

参考文献

[1]吴琼.C语言指针教学方法研究[J].鄂州大学学报.2009 (16) :6 8

[2]罗坚, 王声决.C语言程序设计 (第三版) [M].中国铁道出版社.2009:180~181

C语言中指针应用的常见问题 第10篇

能否正确理解和使用指针是我们是否掌握C语言的一个标志。但是由于指针太过灵活, 一旦使用不当, 不仅错误难查, 而且会出现意想不到的错误。因此, 要编出正确而高效的程序, 必须正确地理解和使用指针。本文着重分析了指针应用中的若干常见问题, 以帮助初学者更好地掌握指针。

一、指针变量在初始化时应注意的问题

1.“*”在使用时有不同的含义:在声明变量时用在变量的前面, 其作用是说明该变量为指针变量, 其它情况用在指针变量前面作为指针运算符。

如:int*P, i=5; (用在P前面, 说明P为指针变量)

(用在P前面。作为指针运算符) 又如:int*p=null;等价于int*p;p=null;两条语句的组合。

2.不能给未初始化的指针赋值。

指针在未初始化的时候, 它的指向是不确定的, 因此对它的运算是不正确的。也有可能会带来“灾难性”的后果, 在使用指针前要使它有个确切的指向, 在语句i=5和*P=8之间加一条语句P=&i即可, 这样就让指针变量P有了明确的指向。

二、指针变量在赋值时应注意的问题

1.给指针变量赋值必须是地址值[1], 不能赋予任何其它数据。C语言中提供了地址运算符“&”来表示变量的地址。其一般形式为:&变量名;如&a表示变量名a的地址。

例如:int b;int*p;p=&b;此为正确的赋值方法。但有时会有如下错误书写:int*p;p=156;这样就使指针p指向了地址156 (十进制) , 编译时系统会提示出错。

2.不同类型的指针不能相互赋值

指针是具有具体类型的, 在给指针赋值时, 不但要求是地址, 而且应该是一个与该指针类型相符的变量或者常量的地址。

例如:“int*p;float a=3.4, *q=&a;p=q;”以上语句中在“p=q;”这条语句上存在错误, 因为p是一个整型指针, 只能存放in型数据的地址, 而q指向的是一个实数型变量, 里面存放的是float型数据。二者不相匹配, 因此在编译时会发生错误。

三、指针变量用于数组时应注意的问题

1.数组名与指针变量的区别。指针常用于数组中, 数组名代表数组的起始地址[2]。可将数组名赋给一个指针变量, 即该指针变量指向了该数组, 从而使得访问数组可以采用地址法 (访问数组元素还可用下标法) 。指向数组的指针变量可以作加减法的运算, 且只有指向同一数组, 两个指针变量可作减法 (结果为相隔的元素个数) 及关系运算。

如:int a[5], *p;若有这样的语句:p

2.使用指针法访问数组元素时, 要注意“下标是否越界”的问题。p+5表示a+4下面的一个整型单元。这样会破坏有用的数据, 产生不应有的后果, 严重地造成死机, c编译系统并不指出“下标越界”这样的错误。

3.使用指向数组元素的指针变量时, 应注意指针变量的当前值。如p=a;for (i=0;i<5;i++) scanf (“%d”, p++) 。若缺少“p=a;”这一语句, 则p的值是一个不确定的值, 它的指向不确定。有可能将输入的5个数据输入到难以预料的存储单元中去, 可能造成“灾难性”的后果。

4.两个指针相加产生错误。两个指针是不能相加的。如果你的C程序试图将两个指针相加, 译程序就会发出警告。当你试图将一个指针和另外两个指针的差值相加的时候, 你很可能会误将其中的两个指针相加。例如, 你很可能会使用语句:p=p+p2-p1。这个语句是不正确的, 因为它和语句p= (p1+p2) -pl完全相同, 正确语句应该是:。

四、指针变量用于函数时应注意的问题

函数的返回值不仅可以是一般的数据类型, 还可以为指针类型, 这种带回的类型为指针的函数称为指针函数[3]。对于函数带回的指针, 这个指针所指示的存储单元必须是存在的, 不可以不存在。例如:

max是指针函数。编写该函数的本意是由指针P带回x、y中较大数的地址, 但函数max执行完毕, 返回主函数main时x、y所占用的存储单元已被释放, 而P带回的将是一个不存在的存储单元, 这样做显然是不正确的。因此, 程序应该改为:

这样修改后, max函数中的指针P带回的则是主函数main中a, b两者中较大数的地址, 就可以正确输出了。可见指针函数中带回的指针应该是主调函数中变量的地址, 不能是已释放空间的地址。

熟练掌握指针可以编写灵活的程序, 但是误用指针可能会造成严重的破坏, 要透彻地理解, 谨慎地使用指针, 我们还需要在上机实践中不断地摸索、总结。

摘要:指针的应用在C语言中既是重点又是难点, 本文作者对指针使用中出现的常见问题作了简要的归纳、分析、总结, 希望能对C语言初学者起到一定的帮助作用。

关键词:C语言,指针,应用,常见问题

参考文献

[1]王声决, 罗坚.C语言程序设计[M].北京:中国铁道出版社, 2002.

[2]谭浩强, 周海燕, 冯玉山, 崔武子等.C语言程序设计[M].北京:华夏出版社, 2005.6.

C语言中指针运用

C语言中指针运用(精选10篇)C语言中指针运用 第1篇在C语言中存在一种指针变量, 这种变量与普通的变量一样在定义了之后都会在计算机中占...
点击下载文档文档内容为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部