c语言中p2%3c%3c=1,C语言指针详解

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语言.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值