第8章 指针.ppt
《第8章 指针.ppt》由会员分享,可在线阅读,更多相关《第8章 指针.ppt(67页珍藏版)》请在麦多课文档分享上搜索。
1、第8章 指针,主要内容,地址和指针的概念,变量的指针和指向变量的指针变量,数组与指针,字符串与指针,指向函数的指针,返回指针值的函数,指针数组和指向指针的指针,有关指针的数组类型和指针运算的小结,本章学习目标: 认识到用地址作为一种数据类型的重要性。 理解指针包括地址和类型两种属性。 掌握指针运算符&和*。 能够通过地址引用调用在被调函数与主调函数之间共享数据。 理解指针和数组的关系。 理解指向函数的指针的用法。,8.1 地址和指针的概念,指针:一个变量的地址。 指针变量:存放某一变量的地址(即指针)。,8.2 变量的指针和指向变量的指针变量 定义一个指针变量 定义的一般形式:基类型 *指针变
2、量名; 基类型:用来指定指针变量可以指向的变量的类型。将决定指针移动和运算时的移动量。 * :表示该变量为指针类型,例 int *p1,*p2;float *q ;static char *name;,注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值,&与*运算符:,取地址运算符 含义: 取变量的地址,指针运算符(“间接访问”运算符) 含义: 取指针所指向变量的内容,i_pointer-指针变量,它的内容是地址量 *i_point
3、er-指针的目标变量,它的内容是数据 &i_pointer-指针变量占用内存的地址,指针变量的初始化 一般形式:存储类型 数据类型 *指针名=初始地址值;,赋给指针变量, 不是赋给目标变量,例 int i;int *p=,变量必须已说明过 类型应一致,例 int i;int *p=,用已初始化指针变量作初值,指针变量赋值: int i, j; int *p1, *p2; p1=,指针变量的引用,例8.1 通过指针变量访问整型变量 #include void main( ) int a, b, *p1, *p2 ; a=100; b=10; p1= ,运行结果: a=100, b=10 *p1=
4、100, *p2=10 &a=ffd4, &b=ffd6 p1=ffd4, p2=ffd6 &p1=ffd8, &p2=ffda,关于 则 &* p1 &a (p1) &* p2 &b (p2) p2=&* p1 p2=&a,2. * & a:先进行&a得a的地址,再对a的地址进行* 运算 即指向a地址所指向的变量,就是a ,其值是100 3. 运算符 * ,+ :优先级为2, 结合性:从右到左 (* p1)+ a+ * p1+ * (p1+) 意即: p1原指向a , 现在指向下一个地址了。,例8.2 输入a和b两个整数,用指针方法按先大后小顺序输出 #include void main(
5、) int *p1, *p2, *p, a, b; scanf(“%d%d”, ,运行情况: 5,9 a=5, b=9 max=9,min=5,指针变量作为函数参数地址传递,例8.3a 将数从大到小输出 #include void swap(int x,int y) int temp;temp=x;x=y;y=temp; void main() int a,b;scanf(“%d,%d“, ,运行结果: 5 , 9 5 , 9,5,9,5,5,9,COPY,例8.3b 将数从大到小输出 #include void swap(int *p1, int *p2) int *p;p=p1;p1=p2
6、;p2=p; void main() int a,b;int *pointer_1,*pointer_2;scanf(“%d,%d“, ,5,9,2000,2002,2000,2000,2002,运行结果:5,9,例8.3 将数从大到小输出(使用指针变量作函数参数) #include void main() void swap(int *p1, int *p2);int a,b;int *pointer_1,*pointer_2;scanf(“%d,%d“,运行情况: 5,9 9,5,问题:函数调用结束后, 分配给p1,p2,temp单元释放否?,5,9,2000,2002,5,9,5,地址传
7、递,例8.5 输入a,b,c3个整数,按从大到小输出 #include void main( ) void exchange(int *q1, int *q2, int *q3); int a,b,c,*p1,*p2,*p3; scanf(“%d,%d,%d”,运行情况: 9 , 0 , 10 10 , 9 , 0,void swap(int *pt1, int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp;,void exchange(int *q1, int *q2, int *q3) void swap(int *pt1, int *pt
8、2); if(*q1 *q2) swap(q1, q2); if(*q1 *q3) swap(q1, q3); if(*q2 *q3) swap(q2, q3);,8.3 数组与指针Q1:如何用指针指向数组?Q2:如何用指针访向数组元素?,回顾数组名代表什么?如何访向数组元素及地址?指针变量里存放的是什么?,int a5; / a代表这组数的首地址,a2代表第3个元素,&a2代表第3个元素地址,int *p; / p里存放的是内存单元地址,Q1:如何用指针指向数组?int a5=1,2,3,4,5, *p;p= ;p= ;,a,&a2,Q2:如何用指针访向数组元素?int a5=1,2,3,4
9、,5, *p=a;,P+;/指针移动,P-;,*P=5;,/给p所指向的数据元素赋值,表示数组元素的两种方法:, 变址运算符 ai *(a+i),ai pi *(p+i) *(a+i), 下标法: #include void main() int a10;int i;for(i=0; i10; i+)scanf(“%d“,运行情况: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0,例8.6 用三种方法输出数组中全部元素的值, 用数组名: #include void main() int a10;int i;for(i=0; i10; i+)scanf(“%d“,
10、 指针法: #include void main() int a10;int *p,i;for(i=0; i10; i+)scanf(“%d“, 指针法和指针下标: #include void main() int a10;int *p,i;for(i=0; i10; i+)scanf(“%d“,例8.7 用指针变量输出元素 #include void main() int *p,i,a10;p=a;for(i=0;i10;i+)scanf(“%d”,p+); printf(“n”);for(i=0;i10;i+,p+)printf(“%d”,*p);printf(“n”); ,运行情况: 1
11、 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483,例8.7 用指针变量输出元素 #include void main() int *p,i,a10;p=a;for(i=0;i10;i+)scanf(“%d”,p+); printf(“n”);p=a; /*或者p= ,能正确输出吗?,运行情况: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0,原因?,用数组名作函数参数,数组名作函数参数 void main( ) f(int arr , int n); int array10; f
12、(array, 10); void f(int arr , int n) ,编译时arr按指针变量处理,所以,此句与f(int *arr , int n)等价。,例8.8 将数组a中n个整数按相反顺序存放。思路:数组元素头尾对调。四种调用方式。,m=4, 实参与形参均用数组 #include void main() void inv(int x , int n);int i,a10=3,7,9,11,0,6,7,5,4,2;printf(“The original array:n“);for(i=0;i10;i+) printf(“%d,“ai);printf(“n“);inv(a,10);p
13、rintf(“The array has been inverted:n“);for(i=0;i10;i+) printf(“%d,“,ai);printf(“n“); void inv(int x , int n) int temp,i,j,m=(n-1)/2;for(i=0;i=m;i+) j=n-1-i;temp=xi; xi=xj; xj=temp; return; , 实参用数组,形参用指针变量 #include void main() void inv(int *x, int n);int i,a10=3,7,9,11,0,6,7,5,4,2;printf(“The origina
14、l array:n“);for(i=0;i10;i+) printf(“%d,“ai);printf(“n“);inv(a,10);printf(“The array has been inverted:n“);for(i=0;i10;i+) printf(“%d,“,ai);printf(“n“); void inv(int *x, int n) int temp,*p,*i,*j,m=(n-1)/2;i=x; j=x+n-1; p=x+m;for(;i=p;i+,j-) temp=*i; *i=*j; *j=temp; return; ,例8.8 实参与形参均用指针变量 #include
15、void main() void inv(int *x, int n);int i,arr10,*p=arr;printf(“The original array:n“);for(i=0;i10;i+,p+)scanf(“%d“,p);p=arr; inv(p,10);printf(“The array has been inverted:n“);for(p=arr;parr+10;p+)printf(“%d“,*p);printf(“n“); void inv(int *x, int n) int *p, m, temp,*i,*j;m=(n-1)/2;i=x; j=x+n-1; p=x+m
16、;for(;i=p;i+,j-) temp=*i; *i=*j; *j=temp; return;,此句用意?, 实参用指针变量,形参用数组 #include void main() void inv(int x , int n);int i,a10,*p=a;for(i=0;i10;i+,p+)scanf(“%d“,p);p=a;inv(p,10);printf(“The array has been inverted:n“);for(p=arr;parr+10;p+)printf(“%d “,*p);printf(“n “); void inv(int x , int n) int t,i
17、,j,m=(n-1)/2;for(i=0;i=m;i+) j=n-1-i;t=xi; xi=xj; xj=t; return; ,例 从10个数中找出其中最大值和最小值为了得到两个结果值,用两个全局变量max和min。, 实参和形参均用数组 int max, min; /* 全局变量*/ void max_min_value(int array ,int n) int *p, *array_end; array_end=array+n; /*指向数组最后一个元素的后面 */max=min=*array; /* 相当于max=min=array0 */for(p=array+1; p max)
18、max=*p; else if(*pmin) min=*p; main( ) int i, number10; printf(“enter 10 integer numbers: n”); for(i=0;i10;i+) scanf(“%d”, , 实参和形参均用指针变量 int max, min; /* 全局变量*/ void max_min_value(int *array,int n) int *p, *array_end; array_end=array+n; /*指向数组最后一个元素的后面 */max=min=*array; /* 相当于max=min=array0 */for(p=
19、array+1; p max) max=*p; else if(*pmin) min=*p; main( ) int i, number10,*p; p=number; /* 使p指向number数组 */ printf(“enter 10 integer numbers: n”); for(i=0;i10;i+,p+) scanf(“%d”,p); printf(“the 10 integer numbers:n“);for(p=number,i=0;i10;i+,p+) printf(“%d “,*p);p=number;max_min_value(p,10); printf(“nmax=
20、%d, min=%dn”, max, min); ,归纳:用数组做函数参数有如下四种情况: 1、实参形参都用数组名:int a10; inv(int x ,int n)inv(a,10) . 2、实参用数组名,形参用指针变量:int a10; inv(int *x,int n)inv(a,10) . 3、实参形参都用指针变量:int a10; inv(int *x,int n)int *p=a; inv(p,10) 4、实参用指针变量,形参用数组名:int a10; inv(int x ,int n)int *p=a; .inv(p,10), 实参用指针变量,形参用数组 #include vo
21、id main() void sort(int x , int n);int *p,i,a10;p=a;for(i=0;ixk) k=j;if(k!=i)t=xi;xi=xk;xk=t; ,例8.9 用选择法对10个整数排序,多维数组与指针 int a34=1,3,5,7,9,11,13,15,17,19,21,23;,行地址,列元素地址,列元素地址:a1+3 *(a+1)+3 &a13,指向多维数组的指针变量 指向数组元素的指针变量,例8.12 用指针变量输出数组元素的值 #include void main() static int a34=1,3,5,7,9,11,13,15,17,19
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 PPT
