C语言中的指针_第1页
C语言中的指针_第2页
C语言中的指针_第3页
C语言中的指针_第4页
C语言中的指针_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

会计学1C语言中的指针10.1指针的概念一、内存的访问方式1、直接访问(通过变量名对内存单元进行存取操作。)200020022004ijk

3

6

9

:

内存用户数据区::如:i=2,j=6,k=9printf(“%d”,i);该输出语句是这样执行的:根据变量名与地址的对应关系(该关系在编译时确定),找到变量的地址2000,然后将从2000开始的两个字节的内容(即3)取出后输出。第1页/共19页10.1指针的概念2000200220043010ijki_p

3

6

92000

:

内存用户数据区::2、间接访问将变量i的地址存放在另一个变量中。假设变量i_p用来存放整型变量的地址,它被分配3010、3011两个字节,可用下例语句将i的地址存放到i_p中。

i_p=&i;即i-p中的的值为2000此时,要存取变量的值,可以先找到存放“i”地址的变量i_p,从中取出i的地址(2000),然后到2000,2001字节取出i的值3。第2页/共19页两个概念:(1)指针──即地址

一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。(2)指针变量──专门用于存储其它变量地址的变量指针变量i_p的值就是变量i的地址。10.1指针的概念第3页/共19页变量的指针就是变量的地址,存放变量地址的变量就是指针变量。为表示指针变量和它指向的变量之间的关系,用指针运算符“*”表示。即:*(i_p)就是i_p所指向的变量。10.2变量的指针和指向变量的指针变量20003i_p*(i_p)i因此,下面两个语句的作用相同:①i=3; /*将3直接赋给变量i*/②i_p=&i;/*使i_p指向i*/*i_p=3;/*将3赋给指针变量i_p所指向的变量*/第4页/共19页10.2变量的指针和指向变量的指针变量1、指针变量的定义一般形式:类型标识符

*变量名如:int*p1;char*p2;float*p3;说明:*表示该变量为指针型变量,指针变量名为p1,p2,p3定义指针变量时必须指定基类型。它表示指针变量中存放的地址所指向的是什么类型的数据。给指针变量赋值:如:p1=&i(将i的地址赋给p1)注:一般不直接赋数值第5页/共19页2、指针变量的引用用指针变量对变量赋值:如:inti,j,*p;p=&i;*p=3;j=*p+2;注意:p是地址变量,而*p是非地址变量,与i是一回事。“*”:为指针运算符或叫指向运算符、间接运算符。定义后p=&I后*p=3后Ijp::::100010021004Ijp100010021004Ijp100010021004Ijp100031000100010021004j=*p+2后351000第6页/共19页例10.1通过指针变量访问整型变量

main()

{inta,b;int*pointer_1,*pointer_2;

a=100;b=10;

pointer_1=&a;/*把变量a的地址赋给pointer_1*/

pointer_2=&b;/*把变量b的地址赋给pointer_2*/

printf(”%d,%d\n”,a,b);printf(”%d,%d\n”,*pointer_1,*pointer_2);}*pointer_1=&a对吗?

运行结果为:

100,10100,10第7页/共19页关于运算符&和*的几点说明:(1)结合性&和*两运算符的优先级相同,但结合方向为自右向左如:inta,b,*p1,*p2;p1=&a;p2=&b;&*p1的含义?

&*p1相当于&(*p1),等于&(*p1)=&(a)=&a=p1*&a的含义?*&a相当于*(&a)=*(p1)=a(2)优先级处于第二位(见附录)第8页/共19页(3)自增自减运算如:inta,b,*p;p=&a;a=3;b=5;(*p)++:相当于a++

,a=4*p++:相当于*(p++),先求*P的值(为3),然后P再++,若p原为1000,则p++为1002,即P不再指向a了。若floata,*p;p=&a;

当p为1000,则p++为1004第9页/共19页例10.2输入a和b两个整数,按先大后小的顺序输出a和b。

main()

{int*p1,*p2,*p,a,b;

scanf("%d,%d“,&a,&b);

p1=&al;p2=&b;if(a<b){p=p1;pl=p2;p2=p;}printf("\na=%d,b=%d\n”,a,b);

printf("max=%d,min=%d\n“,*pl,*p2);

}

运行情况如下:输入5,9回车,输出结果?

a=5,b=9max=9,min=5第10页/共19页交换地址(指针变量),使p1指向大数b,而变量a、b未变。&a&b59&b5&a9p1ap2bppp1ap2b第11页/共19页3、指针变量作为函数参数功能:将一个变量的地址传送到另一函数中,实参和形参均用指针。例10.3即对输入的两个整数按大小顺序输出(用函数处理)。

运行情况如下:输入:5,9回车输出:9,5voidswap(int*p1,*p2){intp;

p=*p1;*p1=*p2;*p2=p;}voidmain(){inta,b;int*pointer_1,*pointer_2;

scanf("%d,%",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);

printf("\n%d,%d\n"a,b);

}第12页/共19页函数调用过程第13页/共19页下面例子能不能正确交换数据?

voidswap(pl,p2)

int*p1,*p2;{int*p;

p=pl;p1=p2;p2=p;

voidmain()

{inta,b;int*pointer_1,*pointer_2;

scanf(”%d%d",&a,&b);

pointer_l=&a;pointer_2=&b;

if(a<b)swap(pointer_l,pointer_2);

printf(”\n%d,%d\n”,*pointer_1,*pointer_2);

}第14页/共19页出错的原因是参量不是双向传递。&a&b59&a&b59&b5&b5&a9&a9Pointer_1ap1ap1apointer_1apointer_2bp2bp2bpointer_2b(a)(b)(c)(d)&a&b第15页/共19页如果想通过函数调用得到n个要改变的值,可以用如下方法:在主调函数中设n个变量,用n个指针变量指向他们;然后将指针变量作实参,将这n个变量的地址传给所调用的函数的形参通过形参指针变量,改变该n个变量的值;主调函数中就可以使用这些改变了值的变量。第16页/共19页例10.4输入a、b、c三个整数,按大小顺序输出。(P228)

swap(int*

pt1,int*

pt2){intp;p=*pt1;*pt1=*pt2;*pt2=p;}exchange(int*

q1,int*

q2,int*

q3){if(*q1<*q2)swap(q1,q

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论