1 指针定义
在c语言中处理一个变量、一个数组、一个函数、一
个文件时,需要由操作系统把这些量调入内存的不同存储
单元中,每一个存储单元都有一个地址,把存放这些量的
地址保存起来,然后利用这个保存的地址来对这些量进行
操作,那么这个存放地址的量称为指针.
2 指针类型及应用
根据指针所指向的量的不同,我们把指针可以分为以
下几种:
2.1 指向简单变量的指针:即指向一个简单变量,存放这
个简单变量地址,定义如:int i=2,*p;P=蹦;(P是一个
指向变量i的指针, P=i)
例:main()
{int a=5,b=8;
exchange(&a,&b);
printf(“a=%d,b=%d”,a,b);}
void exchange(int*x,int Y)
{int temp;
temp *x:
x: *Y:
Y temp;}
说明:通过将a,b变景的地址传递给指针变量x,Y,通
过x,Y交换了a,b的值.输出结果是a=8,b=5.
2.2 数组指针:指向一个数组的首地址,即数组首元素
的地址.定义如:inta[1O],*p;p=a;(P指向a数组的
首元素,P+i指向第i+1个元素)
例:main()
{int a[6]={1,2,3,4,5,6};
im p;
f0 (P=a;P
p~ntf(“%2d”, P);}
说明:P指向了a数组的首地址,通过P++来访问a
数组的每一元素.输出结果是:1 2 3 4 5 6.
2.3 字符指针:指向一个字符数组的首地址.定义如:
char a= “a stririg'’, P,P=a;(P指向字符数组a,也可
定义为:char P= “a string”;)
例:main()
{char P= “this is a string.”:
prinf(“%8”,P);}
说明:P指向了字符串“this is a string.” 的首地址,
通过P访问字符串.输出结果是:this is a string.
2.4 指向指针的指针:指向的是指针的地址.定义如:
char*P[2]= {“CHINA”,“JAPAN”},**pp;PP=p;
(PP是一个指向指针的指针,PP指向P数组的首地址,而
P的每一元素又是一个指针,P[1]指向“CHINA”,P
[2]指向“JAPAN”)
例:main()
{char p[3]={‘‘CHINA”,“JAPAN ”,“ENGLAND”};
char * PP;
inti;
PP P:
for(i=O;i<3;i++,pp++)
p~tf(“%3c”,*( PP+2)+1);}
说明:通过循环,*PP分别指向P的每一元素,每
一元索又是指针,分别指向“CHINA”等字符串,*PP+
2指向每一字符串的第三个元素,如“CHINA”的“I”元
素,* ( PP+2)取出所指向的内容,即I.输出结果
是:J Q H.
2.5 指向函数的指针:指向函数的首地址,即函数的人
口地址.定义如:int max(intm,int n);int min(int m,
int n);void general (int x,int Y,int(*flIm) ());general
(int a,b,max);(调用general函数时,除了将a,b作为
实参传递给形参m,n外,还将函数max的首地址传递给
指向函数的指针的形参hm)
例:int max (int x,int Y)
{return(x>y)?x:y;}
int mln(int x,int Y)
{return(x
void general (int x,int Y,int(* )())
{int result;result= (*tim)(x,Y);
prinf(“%d”,result);}
main()
{int a=5,bm-8;
prinf(“max=”);
general(a,b,max);
prinf(“min=”);
general(a,b,rain);}
说明:程序中定义了max,min两个函数,分别完成
求两个数中的较大者和较少者的功能,main函数第一次调
用general函数时。除了将a,b作为实参传递给形参m,n
外,还将函数- 憎x的首地址传递给指向函数的指针的形参
fun,这样,fun就指向函数- 憎x,(*fun)(a。b)就等于执
行infix(a,b),从而求出两数中较大者.同理。第二次调
用general时, 指向min,从而求出两数中较小者,可
见将指向函数的指针作为函数参数后,函数general具有
通用性,输出结果是:rlla.X=8min=5
2.6 指向结构变量的指针:指向结构变量的首地址.定
义如:struet student stu, p;P=&stu; (P指向了结构变
量stu)
例:strnct student
{long stu-num;
char name l10J;
char sex;
float score;};
void print-score (struct student*st)
{prinf(“%5.2t"’,st一>SCOre);}
main()
{struet student stu= {99o050,“li”,18,98.6};
print-score (&stu);}
说明:将stU结构变量的地址传递给结构变量指针st,
st一>score与stu,score是同一个成员对象,输出结果是:
98,6
2.7 指向文件的指针:C语言对文件的操作并不是直接
通过文件名进行的,而是根据文件名生成一个文件指针,
通过该指针来对文件进行操作.文件指针定义如下:FILE
* ;(fp为文件指针,此时fp不指向任何文件)
例:#include
main()
{FILE *fp;
if((fp=fopen(“text.txt”,⋯W’))= =NUlL)
{prinf(“文件test.txt打开失败!”);
exit(1);
· 38 ·
}
pfinf(“文件text,txt成功打开!”);
fclose(fp):
}
说明:先定义了一个文件指针fp,若文件“test.txt”
文件打开成功,则fp指向了文件test,txt,以后对该文件
的操作都通过该文件指针fp进行;若文件打开失败,fp
为NUlL 值)
3 指针的运算
3,1 赋值运算
P= 将变量i的地址赋给P
P=a 将数组a的首地址赋给P
P=a[i] 将数组a中下标为i的元素地址赋给P
pl;p2 将指针变量p2的值赋给指针变量pl
P=NULL 将指针P赋空值,即不指向任何对象
3.2 指针变量加/减一个整数
P++ P指向下一个对象
P一一P指向前一个对象
P+i 当前对象后第i个对象
P—i 当前对象前第i个对象
P+=i P指向当前对象后第i个对象
P一=i P指向当前对象前第i个对象
3.3 两个指针变量相减
若两个指针变量指向同一个数组的元素,则两指针变
量值之差是两个指针之间的元素个数再加上1.
3.4 两指针变量比较
若两指针指向同一个数组的元素,则可以进行比较.
指向前面的元索的指针变量值小于指向后面元素的指针变
量值.
3.5 其它运算
*P 取出P所指的内容
P++ 先 P,再使P+1
*++P 先P+l,再 P
(*P)++ P所指向的内容加1
P一>
员变量,等价于(*P).成员名
c语言中的指针虽是难点,但却是精华.我们只要掌
握了其本质含义,也就不难了.只有正确地掌握了指针的
概念,才能在函数调用后改变有关变量的值,才能高效地
使用数组和字符串,才能动态分配内存,直接处理地址,
完成有关文件的操作,才能表达链表这一类递归数据结
构.因此,只有掌握了指针,才真正掌握了C语言.