C语言程序设计 第8章指针
1 第8章 指 针 C 语言程序设计 北京科技大学 计算机系
第8章指针 8.1指针和指针变量 8.2指针与数组 8.3指针与函数 2021/2/21
2021/2/21 2 8.1 指针和指针变量 8.2 指针与数组 8.3 指针与函数 第8章 指针
81指和指变量 811指针和指针变量的概念 变量的两个物理意义 2000 001 变量的内容 loat x, 2002 2003 2004 变量的地址 2005 2021/2/21
2021/2/21 3 8.1 指针和指针变量 main() {float x; int y; … } 8.1.1 指针和指针变量的概念 变量的两个物理意义 2000 2001 2002 2003 2004 2005 … x y 变量的内容 变量的地址
81指和指变量 811指针和指针变量的概念 InaRi 利用变量名 [int a,b, ci 52000 存取数据的方式 E2001 b=8:直接将整刻为“直接存取 32002 ”方式。 2003 直接将 82004 直接将变量a、b的值 2005 取出,相加后存入变量c 2021/2/21
2021/2/21 4 8.1 指针和指针变量 main() {int a,b,c; a=5; b=3; c=a +b; … } 8.1.1 指针和指针变量的概念 2000 2001 2002 2003 2004 2005 a b c 5 直接将整数5 存入变量 a 3 直接将整数3 存入变量 b 8 直接将变量 a、b 的值 取出,相加后存入变量 c 利用变量名 存取数据的方式 称为“直接存取 ”方式
81指和指变量 811指针和指针变量的概念 2000 5 c语言 main E2001 还提供了对{inta=5,b=3,c,和; 3002 内存单元的D &c 2003 米p=a+b; 31= 21a 2004 ●变量的地址称为变量的指针 8 2005 ●存放地址的变量称为指针变量 2006 2004 2007 a和b相加的结果(*p=a+b)存放 到变量p所指向的内存单元中去。 此时c称为指针变量p的目标变量。L2004 2021/2/21
2021/2/21 5 C 语言 还提供了对 内存单元的 “间接存取” 方式 p 2000 2001 2002 2003 2004 2005 2006 2007 a b c 5 3 2004 a和b相加的结果(*p=a+b)存放 到变量p所指向的内存单元中去。 此时c称为指针变量p的目标变量。 p 2004 c p=&c 8 main() {int a=5,b=3,c,*p; p = &c; *p = a + b; … } 8.1 指针和指针变量 8.1.1 指针和指针变量的概念 ●变量的地址称为变量的指针 ●存放地址的变量称为指针变量
81指和指变量 8.12指针变量的定义 2000 E2001 指针变量定义的形式指针变量初始化 2002 main maino 2000 2003 lint a, *p I int a, p=&a 2004 float x, q float x,*q=&x; 2005 p && a 2006 2007 2008 2004 2009 2021/2/21
2021/2/21 6 main() { int a,*p=&a; float x,*q=&x; … } 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 a p x q 2004 8.1 指针和指针变量 8.1.2 指针变量的定义 main() 2000 {int a,*p; float x,*q; p = &a; q = &x; … } 指针变量定义的形式 指针变量初始化
81指和指变量 813指针的基本运算 2000 5 间接存取运η E2001 赋值运犷 2002 maino maino 2000 2003 [int a, p=&a tint a, *p; 2004 float x, q=&x; float x, *kg: 2005 p=5; p=&a 2006 printf(a+3=%dn",p+3):q&x 2007 2008 2004 2009 =&a: 2021/2/21
2021/2/21 7 main() { int a,*p=&a; float x,*q=&x; *p = 5; printf("a+3=%d\n",*p+3); … } 间接存取运算 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 a p x q 2004 8.1 指针和指针变量 8.1.3 指针的基本运算 2000 ×*p = &a; main() {int a,*p; float x,*q; p = &a; q = &x; … } 赋值运算 5
81指和指变量 8 首针变量的 【例81】输入a、b两个整数, 使用指针变量按大小顺序输出 6 8 这两个整数。 p1=&a: p2=&b scanf(”%d%d”,pl,p2); if(*p1<*p2) I p=pl: p1=p2: p2=p: I printf("a=%d, b=%d\n",a, b) printf (" max=%d, min=%d\n",*p1. *p2):a=b, b: max=8. min=6 2021/2/21
2021/2/21 8 方法1:目标变量值不变,改变指针变量的 指向求解。 main( ) { int a,b,*p1,*p2,*p; p1=&a;p2=&b; scanf(″%d%d″ ,p1,p2); if(*p1<*p2) { p=p1; p1=p2; p2=p;} printf(″a=%d,b=%d\n″,a,b); printf(″max=%d,min=%d\n ″ ,*p1,*p2); } a b p1 p2 p 6 8 a=6,b=8 max=8,min=6 8.1 指针和指针变量 【例8.1】输入a、b两个整数, 使用指针变量按大小顺序输出 这两个整数
81指和指变量 方法2:利用指针变量直接改变目标变量的值a、*p1b、*p2 求解。 maino t int a, b, t, *pl, p2 p1=&a; p2=&b: p 2 scanf(”%d%d”,pl,p2); if(*p1<*p2) t t=*p1;*p1=*p2;*D2=t;} 6 printf ( "a=%d, b=%d\n",a, b) a=8,b 6 printf("max=%d, min=d\n",*pl, *p2) max=8. min=6 2021/2/21
2021/2/21 9 方法2:利用指针变量直接改变目标变量的值 求解。 main() { int a,b,t,*p1,*p2; p1=&a;p2=&b; scanf(″%d%d″ ,p1,p2); if(*p1<*p2) { t=*p1; *p1=*p2; *p2=t;} printf(″a=%d,b=%d\n″,a,b); printf(″max=%d,min=%d\n ″ ,*p1,*p2); } a、*p1 b、*p2 p1 p2 t 6 8 a=8,b=6 max=8,min=6 8.1 指针和指针变量 6 8 6
81指和指变量 10 813指针的基本运算 →a[010 1404 指针的加微运 1405 20406 指针加减运算要点: 407 ①只有当指针变量指向数组时指针的加减 a[2 运算才有意义 30F408 ②指针变量可加减一个整型表达式。如: 1409 pl++、p2+3、p2-、p2-2 40 1410 ③指针的加减运算是以基类型为单位(即 sizeof(类型))的 ④两个指针变量不能作加法运算,只有当 a45012 两个指针变量指向同一数组时,进行指针变 1413 量相减才有实际意义。如:p2p1。 2021/2/21
2021/2/21 10 指针的加减运算 8.1 指针和指针变量 8.1.3 指针的基本运算 main() {int a[]={10,20,30,40,50},*p1,*p2; p1=p2=a; printf(″p1=%u,*p1=%d\n″ ,p1,*p1); p2+=3; printf(″p2=%u,*p2=%d\n″ ,p2,*p2); } P1=404,*p1=10 P2=410,*p2=40 404 405 406 407 408 409 410 411 412 413 a[0] a[1] a[2] a[3] a[4] 30 20 10 40 50 p1 p2 指针加减运算要点: ① 只有当指针变量指向数组时指针的加减 运算才有意义。 ② 指针变量可加减一个整型表达式。如: p1++、p2+3、p2--、p2-2。 ③ 指针的加减运算是以基类型为单位(即 sizeof(类型))的。 ④ 两个指针变量不能作加法运算,只有当 两个指针变量指向同一数组时,进行指针变 量相减才有实际意义。如:p2-p1