c语言电子教案(指针).ppt
《c语言电子教案(指针).ppt》由会员分享,可在线阅读,更多相关《c语言电子教案(指针).ppt(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、UNIX C编程编程* Page 2q 指针是指针是C语言中的一个重要的概念,也是语言中的一个重要的概念,也是C语言的一个重要语言的一个重要特色。特色。v 可以表示复杂的数据结构可以表示复杂的数据结构v 能动态分配内存能动态分配内存v 能方便地使用字符串能方便地使用字符串v 有效而方便地使用数组有效而方便地使用数组v 在调用函数时能得到多于在调用函数时能得到多于1个的值个的值v 能直接处理内存地址等能直接处理内存地址等第第11章章 指指 针针UNIX C编程编程* Page 3 x xxxyz 20002001 20132014 2020202111.1 地址和指针的概念地址和指针的概念q “
2、直接访问直接访问”方式方式 按变量地址存取变量值的方式按变量地址存取变量值的方式int x,y,z;x=20,y=40; z=x+y;x 40 x20yz 20002001 20132014 20202021 编译系统把变量名转换为变量的地址,对变量值的存取编译系统把变量名转换为变量的地址,对变量值的存取通过地址进行的。通过地址进行的。 内存内存x 406020yz 20002001 20132014 20202021变量变量z的地址的地址指针指针 UNIX C编程编程* Page 4 11.1 地址和指针的概念地址和指针的概念q “间接访问间接访问”方式方式 通过存放变量地址的变量去访问变量
3、通过存放变量地址的变量去访问变量 int x,*x_point; x_point=&x;*x_point=20;x x_point 20002001 20132014 x 2000 x_point 20002001 20132014 x 200020 x_point 20002001 20132014 指针指针专门存放变量地址的变量专门存放变量地址的变量指针变量指针变量*x_point指针变量指针变量变量变量变量地址(指针)变量值指向地址存入地址存入指针变量指针变量UNIX C编程编程* Page 511.1 地址和指针的概念地址和指针的概念整型变量整型变量x指针变量指针变量x_pointer
4、2000200420062005200120022003整型变量整型变量k.102000 k=x; /*直接访问直接访问*/ x_pointer=&x; k=*x_pointer; /*间接访问间接访问*/1010UNIX C编程编程* Page 6q 变量的指针变量的指针v 就是变量的地址就是变量的地址 q 指针变量指针变量v 存放变量地址的变量存放变量地址的变量v 用来指向另一个变量用来指向另一个变量 v 用用“*”符号表示符号表示“指向指向”11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量UNIX C编程编程* Page 7q定义一个指针变量定义一个指针变量v 指针
5、变量不同于整型变量和其他类型的变量,它是用来专门指针变量不同于整型变量和其他类型的变量,它是用来专门存放地址的。存放地址的。v 必须将指针变量定义为必须将指针变量定义为“指针类型指针类型”。v 一般形式一般形式 基类型基类型 *指针变量名指针变量名; 基类型:指针变量所指向的变量的类型。基类型:指针变量所指向的变量的类型。 例例 float *pointer1; int *pointer2; char *pointer3;v 指针变量的定义是通过指针变量的定义是通过*进行的进行的v 定义后的指针变量只能赋值指针,不能赋值为一般数据类型定义后的指针变量只能赋值指针,不能赋值为一般数据类型11.2
6、 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量UNIX C编程编程* Page 8q指针变量的引用指针变量的引用v & & 与与* *运算符运算符 - - 单目运算,优先级单目运算,优先级2 2,自右向左结合,自右向左结合 & & 取地址运算符取地址运算符 取变量的地址,取出的地址一定是一个常数取变量的地址,取出的地址一定是一个常数 & &变量名变量名= =指针值指针值 * * 指针运算符指针运算符 指针变量所指向的内存单元,可称为指针变量所指的指针变量所指向的内存单元,可称为指针变量所指的变量变量 与指针变量定义中的与指针变量定义中的* *不同不同 “* *指针变量指针变量”
7、 可以作为一个基类型变量来用可以作为一个基类型变量来用11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量UNIX C编程编程* Page 911.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量main()int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1=&a; /*把变量把变量a的地址赋给的地址赋给pointer_1*/ pointer_2=&b; /*把变量把变量b的地址赋给的地址赋给pointer_2*/ printf(%d,%dn,a,b); printf(%d,%dn,*pointe
8、r_1,*pointer_2); getch();100,10100,10UNIX C编程编程* Page 10v 指针变量的初始化指针变量的初始化 一般形式一般形式 基类型基类型 *指针变量名指针变量名=初始地址值初始地址值;11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量例例 int i; int *p=&i;例例 int i; int *p=&i; int *q=p;例例 int *p=&i; int i;用已初始化指针变量作初值用已初始化指针变量作初值ipqipUNIX C编程编程* Page 1111.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针
9、变量v 指针变量使用前必须先初始化或赋初值指针变量使用前必须先初始化或赋初值例例 main() int i=10, *p; *p=i; printf(“%d”,*p); 指针变量指针变量p整型变量整型变量i2000200420062005200120022003.10200210内容随机内容随机结果:结果:10危险!危险!例例 main( ) int i=10,k, *p; p=&k; *p=i; printf(“%d”,*p); UNIX C编程编程* Page 12v 零指针与空类型指针零指针与空类型指针 零指针:零指针:( (空指针空指针) ) 定义:指针变量值为零定义:指针变量值为零
10、表示:表示: int * p=0; 11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量p指向地址为指向地址为0的单元的单元,系统保证该单元不作他用系统保证该单元不作他用(不存放有效数据)(不存放有效数据)表示指针变量值表示指针变量值没有意义没有意义 NULL在在stdio.h中定义,原型为中定义,原型为#define NULL 0 int *p=NULL; 用途用途: 避免指针变量的非法引用避免指针变量的非法引用 在程序中常作为在程序中常作为状态状态比较比较 例例 int *p; . while(p!=NULL) . UNIX C编程编程* Page 1311.2 变量的指
11、针和指向变量的指针变量变量的指针和指向变量的指针变量 空类型指针空类型指针 定义:定义:指针变量不指向哪一种类型数据指针变量不指向哪一种类型数据 表示:表示: void *p; 使用时要进行使用时要进行强制类型转换强制类型转换表示不指定表示不指定p2是指向哪一种是指向哪一种类型数据的指针变量类型数据的指针变量例例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;UNIX C编程编程* Page 1411.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量paaffdaffdeffe0ffdfffdbffdcffdd.ffda10m
12、ain()int a; int *pa=&a; a=10; printf(a=%d, *pa=%d n,a,*pa); printf(“&a=%x(hex) ,&a); printf(pa=%x(hex) n,pa); printf(&pa=%x(hex)n,&pa); getch();a=10,*pa=10&a=ffda(hex),pa=ffda(hex)&pa=ffde(hex)UNIX C编程编程* Page 15 练习练习11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 int x,y,*x_pointer,*y_pointer;x_pointer&xx2y_po
13、inter&yy4 x_pointer=&x;y_pointer=&y;y_pointer=&*x_pointer;y=*&x;2 &与与*运算符右结合运算符右结合 *右侧接指针变量,如:右侧接指针变量,如:*x_pointer &右侧接一般变量,如:右侧接一般变量,如:&xUNIX C编程编程* Page 16q指针变量作为函数参数指针变量作为函数参数 作用是将变量的地址传送到另一个函数中作用是将变量的地址传送到另一个函数中11.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量swap(int *p1,int *p2)int temp; temp=*p1; *p1=*p2;
14、*p2=temp;main() int a,b,*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);pointer_1?a?pointer_2?b?5,9 59&a&b&ap1&bp2?temp595pointer_1&aa9pointer_2&bb59,5UNIX C编程编程* Page 1711.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量swap(int *p1,int *
15、p2) int *temp,x; temp=&x; *temp=*p1; *p1=*p2; *p2=*temp;main() int a,b,*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);pointer_1?a?pointer_2?b?59&a&b&ap1&bp29?temp?x&xtemp?x55pointer_1&aa9pointer_2&bb55,9 9,5UNIX C编程编程* Pag
16、e 1811.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量swap(int *p1,int *p2) int *temp; temp=p1; p1=p2; p2=temp;main() int a,b,*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);pointer_1?a?pointer_2?b?59&a&b&ap1&bp2?temp5,9 5,9&atemp&b&apoin
17、ter_1&aa5pointer_2&bb9UNIX C编程编程* Page 19q 想通过函数调用得到想通过函数调用得到n n个要改变的值,可以:个要改变的值,可以:v 在主调函数中设在主调函数中设n n个变量,用个变量,用n n个指针变量指向它们个指针变量指向它们v 将指针变量作实参,将这将指针变量作实参,将这n n个变量的地址传给所调用的个变量的地址传给所调用的函数的形参函数的形参v 通过形参指针变量,改变该通过形参指针变量,改变该n n个变量的值个变量的值v 主调函数中就可以使用这些改变了值的变量主调函数中就可以使用这些改变了值的变量11.2 变量的指针和指向变量的指针变量变量的指针和
18、指向变量的指针变量UNIX C编程编程* Page 2011.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 例:输入例:输入a、b、 c3个整数,按大小顺序输出。个整数,按大小顺序输出。main() int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d,&a,&b,&c); p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf(n%d,%d,%dn,a,b,c);swap(int *pt1, int *pt2) int temp; temp=*pt1; pt1=*pt2; *pt2=temp; exchange(i
19、nt *q1, int *q2, int *q3) if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2a1a+1UNIX C编程编程* Page 25v 指针的关系运算指针的关系运算 实质是两个地址之间的比较,地实质是两个地址之间的比较,地址大的指针大,地址小的指针小址大的指针大,地址小的指针小 pq p=q pq p=q p=q p!=q11.3 数组与指针数组与指针a2a3a4 2000 2008 a1a020002002200420062008200A2024202220202010pqqpUNIX C编程编程* Page 26v
20、 引用数组元素的方法引用数组元素的方法 int a5,*p; p=a;11.3 数组与指针数组与指针下标法下标法 ai和和pia2a3a4 2000 a1a020002002200420062008200A2024202220202010p pap0p1p2p3p4指针法指针法 *(a+i)和和* (p+i)pp+1p+2p+3p+4aa+1a+2a+3a+4a2a3a4 2000 a1a020002002200420062008200A2024202220202010p p+5UNIX C编程编程* Page 27v 例例 输出数组中的全部元素输出数组中的全部元素11.3 数组与指针数组与指
21、针main() int a10=1,2,3,4,5,6,7,8,9,10,*p,i; for (i=0;i10;i+) printf(“%4d”,ai);用下标法引用数组元素用下标法引用数组元素UNIX C编程编程* Page 28main() int a10=1,2,3,4,5,6,7,8,9,10,*p,i; for (i=0;i10;i+) printf(“%4d”,*(a+i); 11.3 数组与指针数组与指针 用指针法引用数组元素用指针法引用数组元素 数组名数组名a在计算过程中代表数组的首地址在计算过程中代表数组的首地址 对对ai进行变址运算,转化为进行变址运算,转化为*(a+i)U
22、NIX C编程编程* Page 29 main() int a10=1,2,3,4,5,6,7,8,9,10,*p,i; for (p=a;p(a+10);p+) printf(“%4d”,*p); 11.3 数组与指针数组与指针 p的初值为数组的初值为数组a的起始地址的起始地址 计算过程中使用了指针加法计算过程中使用了指针加法 数组名数组名a在计算过程中代表数组的首地址在计算过程中代表数组的首地址UNIX C编程编程* Page 30main() int a10=1,2,3,4,5,6,7,8,9,10,*p,i; for (p=a,i=0;i10;i+) printf(“%4d”, pi)
23、; 11.3 数组与指针数组与指针 用下标法引用数组元素用下标法引用数组元素 p的初值为数组的初值为数组a的起始地址的起始地址UNIX C编程编程* Page 3111.3 数组与指针数组与指针main() int i,*p,a10; p=a; for(i=0;i10;i+) scanf(%d,p+); printf(n); for(i=0;i10;i+,p+) printf(%d,*p);for(i=0;i10;i+) scanf(%d,p); p+; 1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483a2a
24、3a4 a9 ? ? ? a1a020002002200420062008200A2024202220202010 pp=a;1 2 3 4 5 6 7 8 9 0v例例 通过指针变量输出通过指针变量输出a数组的数组的10个元素个元素UNIX C编程编程* Page 32 main() int a =5,8,7,6,2; int y,*p=&a1; y=(*-p)+; printf(%d ,y); printf(%d,a0); 11.3 数组与指针数组与指针a27a36a42 a18a0520002002200420062008200A2024202220202010 pp65y5 6例:例:
25、UNIX C编程编程* Page 33q用数组名作函数参数用数组名作函数参数v 数组名作函数实参,传递给形参的是地址(地址传递)数组名作函数实参,传递给形参的是地址(地址传递) 传递的地址是数组的首地址,形参接收的是数组的首地址传递的地址是数组的首地址,形参接收的是数组的首地址 形参定义时为数组,形参数组的维数可省略(一维数组)形参定义时为数组,形参数组的维数可省略(一维数组) 实际上,编译系统把形参数组名作为指针变量来处理实际上,编译系统把形参数组名作为指针变量来处理11.3 数组与指针数组与指针UNIX C编程编程* Page 34 前面已经分析,前面已经分析,指向数组的指针变量指向数组的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 电子 教案 指针
限制150内