山西财经大学华商学院《C语言程序设计》课件第8章指针的课件_第1页
山西财经大学华商学院《C语言程序设计》课件第8章指针的课件_第2页
山西财经大学华商学院《C语言程序设计》课件第8章指针的课件_第3页
山西财经大学华商学院《C语言程序设计》课件第8章指针的课件_第4页
山西财经大学华商学院《C语言程序设计》课件第8章指针的课件_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 指针山西财经大学华商学院C语言程序设计指针的概念指针变量指针与数组0102038.1 指针的概念变量与地址程序中: int i10; float k20; 内存中一个字节是一个内存单元,它的编号-地址.2000200120022005内存02003ik 编译或函数调用时为其分配内存单元1020printf(“%d”, i;).2000200420062005整型变量i10变量i_pointer200120022003指针与指针变量2000指针指针变量 变量的内容 变量的地址指针:一个变量的地址指针变量:专门存放变量地址的变量指针变量与其所指向的变量之间的关系3i2000i_pointe

2、r指针变量变量变量地址(指针)变量值指向地址存入指针变量 & 与 * 运算符含义: 取变量的地址单目运算符优先级: 2结合性:自右向左含义: 取指针所指向变量的内容单目运算符优先级: 2结合性:自右向左两者关系:互为逆运算理解.2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内容是数据&i_pointer-指针变量占用内存的地址i_pointer &i &(*i_pointer)i *i_pointer *(&i)i_pointer = &i =

3、&(*i_pointer)i = *i_pointer = *(&i)直接访问与间接访问直接访问:按变量地址存取变量值间接访问:通过存放变量地址的变量去访问变量例 i=3; -直接访问指针变量.2000200420062005整型变量i10变量i_pointer20012002200320003例 *i_pointer=20; -间接访问208.2 指针变量指针变量的定义一般形式: 基类型 *指针名;合法标识符指针的目标变量的数据类型定义指针变量例 int *p1,*p2; float *q ; char *name;注意:1、指针变量名是p1,p2 ,不是*p1,*p22、 int *p1,

4、 *p2; 与 int *p1, p2;3、指针变量只能指向定义时所规定类型的变量4、定义指针变量时必须指定基类型。这是因为基类型的 指定与指针的移动和指针的运算(加、减)相关1.算术运算int *p,i;char *q , c;p=&i;q=&c;.i10001001100220002001cpqpq p+; q+;指针的运算指针的运算 y=*px+;y=(*px)+;.1010001001100220002001pxpx11iy=*px;px+;y=*px;(*px)+; (i+)y=10px=1002y=10*px=11px=1000问题1、若变量已正确定义并且指针p已经指向某个变量x,

5、则(*p)-相当于_。A、p- B、x- C、*(p-) D、&x- -问题2、下列语句定义 pf 为指向 float 类型变量 f 的指针,_是正确的。A、float f, *pf = f; B、float f, *pf = &f; C、float *pf = &f, f; D、float f, pf = f;BB实际例子:指针的概念main() int a; int *pa=&a; a=10; printf(a:%dn,a); printf(*pa:%dn,*pa); printf(&a:%dn,&a); printf(pa:%dn,pa); printf(&pa:%dn,&pa);.-3

6、8-34-32-33整型变量a10指针变量pa-37-36-35-38运行结果:a:10*pa:10&a:-38pa:-38&pa:-36指针变量的初始化一般形式:基类型 *指针名=初始地址值;赋给指针变量,不是赋给目标变量例 int i; int *p=&i;变量必须与已说明过的类型应一致例 int *p=&i; int i;例 int i; int *p=&i; int *q=p;用已初始化指针变量作初值例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危险!例 main( ) int i=10,k; int *p; p=&k; *p=i

7、; printf(“%d”,*p); 指针变量必须先赋值,再使用.2000200420062005整型变量i10指针变量p200120022003随机例 输入两个数,并使其从大到小输出main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);运行结果:a=5,b=9 max=9,min=5.指针变量p1 指针变量p20002008200220042006 指针变量p2 整

8、型变量b 整型变量a5200692008200620082006例 输入两个数,并使其从大到小输出main() int *p1,*p2, p,a,b; scanf(%d,%d,&a,&b); p1=&a; p2=&b; if(ab) p=*p1; *p1=*p2; *p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);运行结果:a=9,b=5 max=9,min=5.指针变量p1 指针变量p20002008200220042006 指针变量p2 整型变量b 整型变量a5200692008595指针变量作为函数参数地址传递特点

9、:共享内存,“双向”传递swap(int x,int y) int temp; temp=x; x=y; y=temp;main() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例 将数从大到小输出.20002008200A2002200420065变量a 变量b(main)9 变量temp 变量y 变量x(swap)55959COPY指针变量作为函数参数地址传递特点:共享内存,“双向”传递swap(int x,int y) int temp; temp=x; x=y; y=temp;main() int

10、 a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例 将数从大到小输出值传递.20002008200A2002200420065变量a 变量b(main)9运行结果:5, 9swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2)

11、; printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_220002002(swap)指针p1指针p2整型p5920002002COPY5例 将数从大到小输出指针变量作为函数参数地址传递swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointe

12、r_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_22000200259例 将数从大到小输出运行结果:9,5地址传递swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p2=*p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=

13、&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);运行结果:9,9编译警告!结果不对!int x;int *p=&x;x;例 将数从大到小输出.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_2200020029920002002COPY(swap)指针p1指针p2指针p*假设2000指针变量在使用前必须赋值!swap(int x,int y) int t; t=x; x=y; y=t;main(

14、) int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(*pointer_1,*pointer_2); printf(n%d,%dn,a,b);运行结果:5,9例 将数从大到小输出值传递.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_2200020029COPY(swap)整型x整型b整型t5559运行结果:5,9例 将数从大到小输出swap(int *p1, in

15、t *p2) int *p; p=p1; p1=p2; p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(%d,%d,*pointer_1,*pointer_2);.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_22000200220002002COPY(swap)指针p1指针p2指

16、针p*2000地址传递20002002如何通过函数调用得到n个改变的值1.在主调函数中设n个变量,用n个指针变量指向它们2. 用指针变量作形参,将n个变量的地址传给所调用的函数的形参3.通过形参指针变量,改变该n个变量的值4.主调函数中就可以使用这些改变了值的变量。指向一维数组的指针定义首先定义一个整型数组a,再定义一个指向整型变量的指针变量p,然后将此数 组的第0号元素的地址赋予p,此时p就是 指向a数组的指针,数组的指针就是数组的起始地址。例如: int a5; int *p; p&a0; /*或p=a;*/8.3 指针与数组说明C语言中数组名代表数组的首地址,p&a0与pa 等价,这里a

17、代表数组的首地址。指针的类型必须与数组元素的类型一致; 定义指针的同时赋予数组的首地址。例如: int a8; int *pa; 或 int *p=&a0;通过指针变量来引用一维数组的元素例如:定义如下数组和指针变量p: int a8,i,*p=a; (1) 下标法:用ai 来引用数组a的第i个数组元素,(2) 指针法用*(ai),*(pi),pi引用数组的第i个数组元素(即:ai)。说明:a+i相当于p+i等同于&ai指向数组元素的指针变量的运算p+1指向数组的下一个元素,而不是p值加1。例如:数组元素是整型,每个元素占2个字节,则p+1意味着使p的原值(地址)加2个字节,使它指向下一个元素

18、。 p+; +p; /*使p指向数组的后一个元素 */p-; -P; /*使p指向数组的前一个元素 */p+i; /*使p往后移i个元素 */p-i; /*使p往前移i个元素 */p-q; /*求指针变量p和q之间元素的个数,且q在p前*/p+q /* 两个地址相加,无意义 */注意:若a是数组名,p是指向a数组的指针变量,则a+是非法的,但p+是合法的且经常使用,用于指向数组下一个元素的地址。例 数组元素的引用。 1)用下标法main() int a10,i; for( i=0; i10; i+) ai=i; for(i=0;i10;i+) printf(%d ,ai); 2)用数组名 ma

19、in() int a10,i; for( i=0; i10; i+) ai=i; for(i=0;i10;i+) printf(%d ,*(a+i); 3)用指针变量main() int a10,*p ,i; for(i=0; i10; i+) ai=i; for(p=a; p(a+10); p+) printf(%d ,*p); 小结:1)引用数组元素包括下标法和指针法 如:*(a+i)或*(p+i)或pi指针变量可以实现本身值的改变,但应注意指针变量的当前值。 如:p+1不同于p+3) 注意指针变量的运算,弄清先取p值,还是先使p加1例 int a=1,2,3,4,5,6,7,8,9,10

20、,*p=a,i; 数组元素地址的正确表示:(A)&(a+1) (B)a+ (C)&p (D)&pi数组名是地址常量p+,p- ()a+,a- ()a+1, *(a+2) ()例 void main() int a =5,8,7,6,2,7,3; int y,*p=&a1; y=(*-p)+; printf(“%d ”,y); printf(“%d”,a0); 输出:5 6pp58762730123456a例 注意指针变量的运算6main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); printf(n); for(i=0;i7;i+,p+) p

21、rintf(%d,*p);例 注意指针的当前值p=a;pp58762730123456apppppp指针变量可以指到数组后的内存单元数组名作函数参数数组名作函数参数,是地址传递数组名作函数参数,实参与形参的对应关系实参形参数组名指针变量数组名指针变量数组名数组名指针变量指针变量例 将数组a中的n个整数按相反顺序存放 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723实参与形参均用数组void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=

22、xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);m=4例 将数组a中的n个整数按相反顺序存放 void inv(int *x, int n) int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2;

温馨提示

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

评论

0/150

提交评论