前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇c语言指针范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。
中图分类号:TP312文献标识码:A文章编号:16727800(2012)008004302
作者简介:卫五波(1981-),男,硕士,四川邮电职业技术学院助理讲师,研究方向为Web应用和网络通信;陈冬(1981-),男,硕士,四川邮电职业技术学院助理讲师,研究方向为移动游戏平台和中间件系统。
1指针与指针变量
1.1指针
C语言中,任何数据都会占用内存单元的。计算机内存的每个存储位置都对应唯一的存储地址,而变量名作为变量数据存储区域所取的名字,代表的是一个内存编号,而这个内存编号对于用户来说是未知的。如定义:int a=12。
变量名a代表某个内存单元,而变量值12则是这块内存单元里面的内容。在整个程序运行过程中,通过变量名来访问变量,变量名a所代表的这块内存单元不变,所改变的只是这块内存单元里面的值。
C语言也支持使用变量存储地址来对变量进行存取操作,要取得变量的存储地址,可使用取地址运算符&,如&a表示变量a的存储地址;而变量的存储地址就是指针。
1.2指针变量
指针类型就是C语言中用于表示存储地址的数据类型,而专门用来存放变量存储地址的变量则称为指针变量。
格式:数据类型 *指针变量名。跟普通变量不同的是,所有指针变量占用的内存单元大小是一样的,前面的数据类型代表的是指针变量所指向变量的数据类型。如以下代码:
int a,*b;//a是一个int型变量,b是一个指向int型数据的指针变量
b=&a;//代表b指向a
下面代码是错误的:
float a;
int *b=&a//此条语句有误,b只能指向int型变量
为了访问指针变量所指向变量的值,可以通过间接访问运算符*,如:
int a=12,*b=&a;
*b就代表取出b所指向变量a的值,也就是*b=*(&a)=a。
1.3二级指针变量
在C语言中,任何值都有所对应的内存地址,上述介绍的指针变量是指向普通变量的,也就是普通的指针,称为一级指针变量。
还有一种指针变量所指向的变量不是普通变量反而还是一个指针变量,这种变量称为二级指针变量。如:
int a=12;//普通变量a
int *b=&a;//一级指针变量b,指向普通变量a
int *c=&b;//二级指针变量c,指向指针变量b
而这时,*c只是代表取c所指向的变量b里面的值:&a,而a的地址又是未知的。所以,对于二级指针变量c,要想取出a的值,必须需要两个间接访问运算符**,如**c=**(&b)=*b=*(&a)=a。
2指针与数组的关系
2.1指针与一维数组
数组元素在内存中是顺序存放的,并且数组名代表的是这一块内存单元的首地址,数组其他元素的地址可以根据每个元素所占用的内存单元依次推知。因此,一维数组的数组名实际上就是该数组的指针。如以下定义:
int a\[10\]={1,2,3,4,5};int *p=a;
此时,p指向数组中的第1个元素(a\[0\]),p+1指向第2个元素(a\[1\]),依次类推。当然,p最开始也可以指向其他元素,如指向第4个元素:p=&a\[3\];
在指针的运算中,经常会跟自增或自减运算符结合起来使用,如以下代码:
int a\[\]={20,21,22,23,24,25,26,27,28,29};
int *p,i;
p=&a\[4\]; //p初始指向第5个元素
printf("%d\n",*(++p));/*由于自增运算符在前,所以p先指向a\[5\],之后输出为25*/
printf("%d\n",(*p)++);/*先输出p指向的内容25,之后再把指向的内存单元的内容加1,也就是a\[5\]的值变为26,p的指向不变/
printf("%d\n",*(--p));/*先改变p的指向,指向a\[4\],之后输出a\[4\]的内容24*/
printf("%d\n",- -(*p)); /*先把p所指向的a\[4\]的内容减1,变为23,之后输出23*/
for(i=0;i
printf("%4d",a\[i\]);/*输出结果为20 21 22 23 23 26 26 27 28 29*/
printf("\n");
上述代码就是指针与数组之间关系的一个典型示例,通过自增或自减运算符不光改变p的指向,也可以改变p所指向的内存单元里面的内容(也就是数组元素的内容)。
C语言编程过程中,假设定义一个变量,编译时就为这个变量分配一定长度的内存空间。而在内存区每一个内存单元都有一个地址,用来标识内存单元,在地址所标识的单元存放数据。而正确使用指针变量,区分指针变量和指针的指向变量的含义和用法,判断变量与运算符的结合顺序来确定变量的数据类型以及指向变量或成员变量的类型。通过指针来访问数组元素和下标法数组元素的等价关系,作为函数参数的指针变量,可以改变所指向的主调函数变量的值。动态存储分配、对链表的创建以及相关操作都可以运用指针实现。
类成员的指针,类成员与外部变量相互比较,进行区分的方法就是它所在的域的不同,因为域的不同而决定了变量可以使用的范围,一个指向类的成员函数或者成员变量的指针,就要规范它的参数列表、返回类型,以及被指向变量或函数的域,所以使用类域限定如下:
classNJUPT{ staticdoublenumber=20000000; intnum; public: NJUPT():num(10){}; intget(){returnnum;}; doublegetNumber(){reuturnnumber;}}
在这里定义的成员指针为intNJUPT::*p;//指向int型成员变量int(NJUPt::*)p()//指向intf()型成员函数。
那么调用的方式为:cout<;
返回指针的函数,一个函数的接口是它的返回值,C语言可以自定义类型,我们使用引用作为函数的实际参数,或在函数的实际参数中使用指针。使用一个函数返回一个指针很容易将一个局部变量的地址传出来。例如:
UserType*Process(){ UserTypeut(param—list); //processut; return&;ut;//}
变量在函数运行结束已经被销毁,被传出的地址实际已经不存在被释放了。所以很容易出错。另一点是在运用new的时候。易造成内存泄露。
UserType*Process(){ UserTpye*put=newUserType(param—list); //processput; returnput;}
在函数内部使用一个new,分配了一个空间传出来。这样就不会发生问题,只是编程过程中通常会忘记在程序的外面把借来的空间还回去而造成内存泄露,所以把函数的参数设定为指针或引用作为代替。
两指针变量相减:所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。例如pf1和pf2是指向同一浮点数组的两个指针变量,设pf1的值为2010H,pf2的值为2000H,而浮点数组每个元素占4个字节,所以pf1—pf2的结果为(2000H—2010H)/4=4,表示pf1和pf2之间相差4个元素。两个指针变量不能进行加法运算。例如,pf1+pf2是什么意思呢?毫无实际意义。
关键词:C语言,指针,内存
1 引言
C语言的一大特点就是数据类型丰富,其中一个重要的数据类型就是指针,它也是C语言的精华所在。利用指针可以有效的表示复杂的数据结构,实现动态内存分配,更灵活、方便的使用数组、字符串,还能实现为函数间各类数据的传递提供简洁便利的方法。熟练掌握指针的应用,可以使程序简洁、紧凑和高效。
2 指针的概念
要想了解什么是指针,就必须弄清楚数据在内存中是如何存储的,内存是以字节为单位的一片连续的存储空间,每一个字节单元对应着一个唯一的编号,这个编号被就称为内存单元的地址,相当于宾馆的房号一样,在地址所标识的内存单元中存放数据,就相当于房间里入住的客人一样。若有如下定义:
char a;
int b;
float c;
根据变量的类型,内存为其分配相应的存储空间如图所示,由于变量a是字符型,所以内存为其分配1个字节的存储单元,变量b是基本整型,内存为其分配2个字节的存储单元,变量c是浮点型,内存为其分配4个字节的存储单元。内存为变量分配存储空间的首个字节单元的地址称为该变量的地址。如a的地址是1000,b的地址是1001,c的地址是1003。由此可见,地址就是用来标识每一个存储单元的,以方便用户对存储单元中的数据能够正确访问,在高级语言中就形象的将地址称为指针。指针可以用来指向变量、数组及其元素、结构体、和指针(称为多级指针)等,但不能用指针来指向表达式、常量、和寄存器变量等,因为这些对象没有地址的概念。
3 指针变量的定义和初始化
在C语言中规定,所有的变量必须先定义,后使用,对于指针变量,也不例外,其定义形式如下:
类型标识符 *指针变量名
例如:
char *a; /*定义一个指向字符型变量的指针变量a*/
int *b; /*定义一个指向整型变量的指针变量b*/
flaot *c; /*定义一个指向浮点型变量的指针变量c*/
需要注意的是,在定义指针变量时的*仅仅只是一个说明符,表面其后所定义的变量是一个指针变量。
既然指针是一种变量,那么就应该和其他变量一样,在定义的同时也可初始化。论文参考。例如:
char a=5,*b=&a;
这里由于指针变量b是指向字符型变量a的,所以在定义时,指针变量b的类型要与它所指向变量的类型一致,而“&”是一个取地址运算符,&a就来表示变量a的地址。通过对指针变量初始化,建立起指针变量b的指向,如图2所示。系统为指针变量b分配的存储空间地址是4100,b中存放的是变量a的地址,即1000,当需要读取变量a的值时,如果直接按变量名a的方式,就是对内存单元的直接存取方式,现在既然指针变量b是指向变量a的,那么也就可以先通过指针变量b得到b的值1000,即a的地址,再根据地址1000读取它所指向存储单元的值5。论文参考。这种间接的通过变量b得到变量a的地址,然后在存取变量a的值的方式就称为间接存取方式。
4 指针运算符
“*”运算符称为指针运算符,“&”是地址运算符,二者可以看作是一对互逆运算符。“&”的作用在前面已经说明,这里不再赘述。而“*”的作用是取其指向变量的内容(不是地址,是地址对应存储单元的值)。例如有如下程序段:
int i=3,j=4,k,*p,*q;
p=&i;
q=&j;
k=*p**q;
在这个程序段中多次使用到了“*”,要想得出k的结果,就要区分出每个地方出现的“*”所表示的含义,在定义时p和q前的“*”的作用只是用来标识这两个变量是指针变量,接下来通过将变量i的地址赋给p,变量j的地址赋给q,建立起指针变量p和q的指向,最后就是求解k的值了,在这条语句中出现了三个“*”,其中p和q前的“*”均是指针运算符,也就是用来分别去p、q所指向变量i、j的内容,即就是3和4,剩下的“*”则表示乘运算,所以求得k值为12。由此可见,要想得出正确的结果,首先要分清“*”在每一处的作用,为了方便解题,给出两个等价转换关系,供大家使用:
①i=*p=*(&i)
②p=&i=&(*p)
5 指针运算
常用的指针运算主要有三种:赋值运算,关系运算和算术运算。
首先对于赋值运算,前面的例子中已经见过,如:b=&a,p=&i。需要注意的就是不能够将一个常量地址赋给指针变量,如:int *p;p=1000;也不能让指针变量指向与它类型不相同的变量,如:int *p;float i;p=&i;
其次指针也可以进行关系运算,但在进行关系运算之前,指针必须先建立指向关系,即指针有初值,另外,只有相同类型的指针才能进行比较。
最后,指针也可以进行算术运算,对一个指针加、减一个整数n是,并不是用指针值直接加、减n,而是与指针的数据类型有关,若用公式表示即为:指针变量值±n×sizeof(指针类型),例如:
int a=1,b=2,c=3,*p=&a;
假设内存为a、b、c3个变量分配在了一个连续的存储区域内,a的地址为1000, p指向变量a,即p的内容是1000,如图3所示。执行p=p+2后,表示指针向下移动两个整型变量的位置,如图4所示,p的值为1000+2*sizeof(int)=1000+2×2=1004,而不是1002。利用指针的这一特点,指针被大量的使用在数组中,从而在访问数组元素时更加灵活,快捷。
6 总结
本文中介绍了指针的基本概念和初步应用,由于指针式C语言中一个重要的概念,也是C语言的一大特色,使用指针可以提高程序的效率,可以实现动态存储分配,也可以在调用函数时变量改变了的值能够为主调函数使用。论文参考。但是同时由于指针使用过于灵活,使用起来很容易出错,而且这种错误往往比较隐蔽,难于发现,所以在使用指针时要仔细小心,最好通过上机调试程序,弄清每一个细节,累积编程经验。
7 参考文献
[1]谭浩强. C程序设计(第三版)[M].清华大学出版社. 2005
[2]宗大华、蒋玮. C语言程序设计[M].人民邮电出版社. 2003
[3]黄维通,马力妮. C语言程序设计[M]. 北京:清华大学出版社. 2003
摘 要 指针在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[i]的地址。因此,a和&a[0]都代表第一个元素的地址,同理a+i和&a[i]都代表第i+1个元素的地址。
假设b是二维数组,如int b[4][5]; ,可以把数组b看成包含4个元素的一维数组(b[0]、b[1]、b[2]、b[3]),而其中每一个元素又是一个一维数组,包括5个元素。因此,在二维数组中数组名b代表数组的首地址,b+1是序号为1的行的首地址或称第2行的首地址。
跟数组名一样,函数名可以退化成指针。函数名是函数的地址,也就是入口地址。
3 指针与数组、函数的关系
3.1 指针与数组
指针可以指向数组,而数组也可以是指针数组。因此,指针与数组关系中有指向数组元素的指针和和指针数组。两者在形式上很相近,但意义不同。
定义指向数组元素的指针与指针变量的定义相似,如int a[10]; int *p;p=&a[0]; ,那么指针变量p指向了一维数组的第一个元素,通过指针下移可以指向数组中其它元素。而且,可以使用下标法(如a[i]形式)和指针法(如*(a+i)或*(p+i))访问一个数组元素。同时,在编程过程中我们经常见到形如int(*p)[10]的表示形式,其中p用来表示指向一维数组,p所指向的对象包括10个整型元素的数组。
指针数组是形如*p[5],它是一个数组,每一个元素都相当于一个指针变量。为了更方便、灵活的处理字符串,引入了指针数组。二维字符数组和指针数组都可以用来存放字符串,如果使用二维字符数组存放则会产生一些问题,比如在定义二维字符数组时,需要规定列数,而实际操作中,给定的各个字符串长度往往不相等,若以最长得字符串长度来限定列数,将会浪费许多内存空间。如果以指针数组来存放,只需将指针数组的各个元素指向相应字符串,通过改变指针数组元素的指向就能改变各元素的值。
3.2 指针与函数
指针可以指向字符变量、实型变量、一维数组、字符串,也可以指向一个函数。函数名代表函数的入口地址,即函数的指针,形如c =(*p)(a,b); ,它用指针形式实现了函数的调用。
函数可以返回整型值、实型值,也可以返回一个地址。形如,int *a(int x,int y);从形式上看,该式子与普通函数的定义比较相似,这里函数名a前多了一个*运算符,它表示函数是指针型函数,一般在该函数内部会再定义一个指针变量,同时给出相应的return语句。
4 总结
指针不仅在C语言中占据核心地位,还在一些课程如《数据结构》③中起很重要的作用,该课程里几乎所有算法的实现都离不开指针。而且,指针也出现在许多重要考试中,如大学计算机等级考试和计算机软件水平能力考试。因此,指针是学好C语言的关键。但C语言概念复杂,使用灵活,大部分学生难以掌握。在上机实验中,学生更容易出错,而且错误难以发现,这不仅要求教师在教学中能够深刻理解指针的概念,做到灵活应用,还需要不断的进行总结、比较和实践,而且要求教师能够利用各种教学手段与方法让学生更容易接受和理解, 同时也要求学生能够深入理解指针的概念、注重上机,在实践中不断学习、提高和完善。
注释
① 任正云,李素若.C语言程序设计.北京:水利水电出版社,2007.
关键词:指针;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,%d\n",i,j);
printf("%d,%d\n",*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)[2];声明了一个指针,指向了一个有两个int元素的数组。
其实这两种写法主要是因为运算符的优先级,因为[]的优先级比*高。所以第一种写法,p先和[]结合,所以是一个数组,后与*结合,是指针。后一种写法同理。
应当注意,如果数组为int型,指针变量也应是int型。下面是指针元素的赋值:
p=&a[0];
C语言规定数组名代表数组的首地址,是第一个元素的地址。所以p=&a[0]与p=a是等价的。注意a不代表整个数组,“p=a;”的作用是把a数组的首地址赋给p,而不是a的所有元素都赋给p。
在定义指针变量时是可以赋给初值的:
int *p=&a[0];
等效于:
int *p;
p=&a[0];
多维数组(以二维数组为例)
二维数组的定义:
static int a[2][3]={{1,2,3},{4,5,6}};
a是一个数组的名字,包含二个元素:a[0],a[1]。而每个元素又是一个一维数组,每个一维数组又包含有三个元素。如a[0]中的三个元素分别为a[0][0],a[0][1],a[0][2]。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语言指针对于初学者来说是一个短时间内很难掌握的问题,指针灵活性较大,对于刚开始学习的学生,要搞清楚指针的各个方面内容,例如:指针类型、指针所指向的类型、指针所指向的内存区,还有指针所占据的内存区等基础方面内容。在多思考、多注重比较和多上机实践,才能真正的掌握好指针课程。