最新版课件c语言 (2)_第1页
最新版课件c语言 (2)_第2页
最新版课件c语言 (2)_第3页
最新版课件c语言 (2)_第4页
最新版课件c语言 (2)_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计大连理工大学大连理工大学第九章第九章 指针指针 第九章 指针-指针与一维数组指针特不合用于会见在内存中指针特不合用于会见在内存中接连存储的一样类型的信息接连存储的一样类型的信息.似似:一维数组、二维数组等一维数组、二维数组等.p- 0012FF00p- 0012FF00a0a00012FF010012FF010012FF020012FF020012FF030012FF03p+1- 0012FF04p+1- 0012FF04a1 a1 0012FF050012FF050012FF060012FF060012FF070012FF07p+2- 0012FF08p+2- 0012FF08

2、a2 a2 0012FF090012FF090012FF0A0012FF0A0012FF0B0012FF0Bp+3- 0012FF0Cp+3- 0012FF0C.a3 a3 int a10; int *p;p = &a0; 往往指向首元素往往指向首元素以一维数组为例以一维数组为例:先定义一个指向类型为数组基先定义一个指向类型为数组基类型的指针类型的指针,再让指针指向某再让指针指向某个数组元素个数组元素,即可操纵数组中即可操纵数组中的每一个元素的每一个元素.指针加减运算法那么的应用2第九章 指针-指针与一维数组#include main( ) int a5 = 1, 2, 3, 4, 5

3、; int i; for (i = 0; i 5, i+) scanf(%d, &ai); for (i = 0; i 5, i+) printf(%d, ai);#include main( ) int a5 = 1, 2, 3, 4, 5, i; int *p=&a0; for (i = 0; i 5, i+) scanf(%d, p+i); for (i = 0; i 5, i+) printf(%d, *(p+i);下标法指针法3第九章 指针-指针与一维数组#include main( ) int a3 = 1, 2, 3; printf(%d, a0); 1 prin

4、tf(%d, a1); 2 printf(%d, a2); 3 printf(%p, a); 0012FF00数组名自已也具有数值数组名自已也具有数值,其内其内容是数组的首地址容是数组的首地址,是一个指是一个指针常量针常量.地址与运行环境有关地址与运行环境有关a- 0012FF00a- 0012FF000101a0a00012FF010012FF0100000012FF020012FF0200000012FF030012FF0300000012FF040012FF040202a1 a1 0012FF050012FF0500000012FF060012FF0600000012FF070012FF

5、0700000012FF080012FF080303a2 a2 0012FF090012FF0900000012FF0A0012FF0A00000012FF0B0012FF0B00004第九章 指针-指针与一维数组int a4;a- 0012FF00a- 0012FF00a0a00012FF010012FF010012FF020012FF020012FF030012FF03a+1- 0012FF04a+1- 0012FF04a1 a1 0012FF050012FF050012FF060012FF060012FF070012FF07a+2- 0012FF08a+2- 0012FF08a2 a2

6、0012FF090012FF090012FF0A0012FF0A0012FF0B0012FF0Ba+3- 0012FF0Ca+3- 0012FF0C.a3 a3 数组名是数组首元素的地址a = &a0数组名是指向数组首元素的指针常量a的指针类型为( int * )a+1便是&a1*(a+1)便是a1数组名定律这是一条不变的定律这是一条不变的定律,合用于随合用于随意率性维数的数组意率性维数的数组.5第九章 指针-指针与一维数组a-a-a0a0a+1-a+1-a1a1a+2-a+2-a2a2a+3-a+3-a3a3int a4;a=&a0a=&a0* *a=a0a=

7、a0a+1=&a1a+1=&a1* *(a+1)=a1(a+1)=a1a+2=&a2a+2=&a2* *(a+2)=a2(a+2)=a2a+3=&a3a+3=&a3* *(a+3)=a3(a+3)=a3a+i=&aia+i=&ai* *(a+i)=ai(a+i)=ai*( )与 是完全等价的!a aa+1a+1a+2a+2a+3a+3a0a0 a1a1a2a2a3a3等价定律通式通式6第九章 指针-指针与一维数组int a10; int *p;p = a;int a10, *p; p = a;int a10, *p=a; int

8、a10, *p= &a0;int a10; int *p;p = &a0;int a10, *p; p = &a0;用指针变量会见一维数组,以下几种写法等价:注重区不:a是常量,p是变量a是指向首元素的指针常量, 元素指针, 指针类型是int *7第九章 指针-指针与一维数组p-p-a0a0p+1-p+1-a1a1p+2-p+2-a2a2p+3-p+3-a3a3int a4, *p=a; p=&a0* *p=a0p=a0p+1=&a1p+1=&a1* *(p+1)=a1(p+1)=a1p+2=&a2p+2=&a2* *(p+2)=

9、a2(p+2)=a2p+3=&a3p+3=&a3* *(p+3)=a3(p+3)=a3p+i=&aip+i=&ai* *(p+i)=ai(p+i)=aip pp+1p+1p+2p+2p+3p+3a0a0a1a1a2a2a3a3注重:一但p的值被改变,以上等式不成站8第九章 指针-指针与一维数组p-p-a0a0p0p0p+1-p+1-a1a1p1p1p+2-p+2-a2a2p2p2p+3-p+3-a3a3p3p3int a4, *p=a; p=&p0* *p=p0p=p0p+1=&p1p+1=&p1* *(p+1)=p1(p+1)=p1p+

10、2=&p2p+2=&p2* *(p+2)=p2(p+2)=p2p+3=&p3p+3=&p3* *(p+3)=p3(p+3)=p3p+i=&pip+i=&pi* *(p+i)=pi(p+i)=pip pp+1p+1p+2p+2p+3p+3p0p0p1p1p2p2p3p3p的值被改变后,以上等式仍旧成站.但与a数组元素不对应.9第九章 指针-指针与一维数组#include main( ) int a6 = 1,2,3,4,5,6, *p=&a1; p+; printf(%d , *p+); 3 printf(%d , p2); 6 与与*(p

11、+2)等价等价 printf(%d , (a+2)2); 5#include main( ) int a=258, *p=&a; printf(%d , p0); 258 与与*p等价等价10第九章 指针-指针与一维数组main( ) int a5, i; for (i = 0; i 5; i+) scanf(%d, &ai); for (i = 0; i 5; i+) printf(%d , ai);main( ) int a5, i; for (i = 0; i 5; i+) scanf(%d, a+i); for (i = 0; i 5; i+) printf(%d ,

12、*(a+i);下标法地址法会见一维数组元素的多种方式11第九章 指针-指针与一维数组main( ) int a5, i, *p = a; for (i = 0; i 5; i+) scanf(%d, p+i); for (i = 0; i 5; i+) printf(%d , *(p+i);main( ) int a5, i, *p=&a0; for (i = 0; i 5; i+) scanf(%d, &pi); for (i = 0; i 5; i+) printf(%d , pi);指针法指针-下标法会见一维数组元素的多种方式12第九章 指针-指针与一维数组指针法(注重指

13、针被改变了)main( ) int a5, i, *p=&a0; for (i = 0; i 5; i+) scanf(%d, p+); p=a; 注重注重p的指向的指向 for (i = 0; i 5; i+) printf(%d , *p+);main( ) int a5, *p; for (p = a; p - a 5; p+) scanf(%d, p); for (p = a; p - a 5; p+) printf(%d , *p);会见一维数组元素的多种方式指针法(指针做为循环变量)13第九章 指针-指针与一维数组#include #define N 5main( ) in

14、t aN = 5, 7, 3, 6, 2; int *p, max; p = a; max = *p+; for (; p max) max = *p; printf(max=%dn, max); 求一批整数的最大值#include main( ) int a5=1,2,3,4,5, i, *p; p=a+2; for (i = 0; i a-200020001a0a+1-a+1-200120012a1a+2-a+2-202120213a2a+3-a+3-202120214a3a+4-a+4-202120215a4a+5-a+5-202120216a5a+6-a+6-202120217a6a+

15、7-a+7-202120218a7a+8-a+8-202120219a8a+9-a+9-202120210a9a+10-a+10-202120210a10char a =1234567890;31323334353637383930016进制示意指针与字符串指针与字符串15第九章 指针-指针与一维数组pp+1p+2p+3p+4p+5123450a0a1a2a3a4a5char a6 = 12345; a是指针常量是指针常量, 指针类型是指针类型是char *a+;非法非法char *p=a; p是指针变量是指针变量, 指针类型是指针类型是char *char *p=&a0;p+;合法合

16、法似果字符数组中存放的是字似果字符数组中存放的是字符串符串,那么数组名可看做是字那么数组名可看做是字符串的首地址符串的首地址.a, p俗称为字符串俗称为字符串.16第九章 指针-指针与一维数组#include main( ) char a20, b = 123; int i; for (i = 0; bi!=0; i+) ai = bi; ai = 0; puts(a);#include main( ) char a20, b = 123; int i; for (i = 0; *(b + i); i+) *(a + i) = *(b + i); *(a + i) = 0; puts(a);注

17、重:扫描字符串的方式.复制字符串17第九章 指针-指针与一维数组#include main( ) char a20, b = 123, *p, *q; for (p = a, q = b; *q; p+, q+) *p = *q; *p = 0; puts(a);#include main( ) char a20, b = 123, *s = a, *t = b; while (*s+ = *t+); puts(a); 指针做为循环变量上面程序的简化18第九章 指针-指针与一维数组#include main( ) char s = abc; char *t = s; while (*t) t+

18、; printf(%d, t - s);#include main( ) char s = abc; char *t = s; while (*t+); printf(%d, t - s - 1);统计字符串的长度19第九章 指针-指针与一维数组#include main( ) char a20=abc; char b = 123; int i = 0, j = 0; while (ai) i+; while (ai+ = bj+); puts(a);#include main( ) char a20 = abc; char b = 123; char *s = a, *t = b; whil

19、e (*s) s+; while (*s+ = *t+); puts(a);毗邻字符串20第九章 指针-指针与一维数组char a5 = a, b, c, d, 0;char a5 = a, b, c, d;char a5 = abcd;char a5 = abcd;a+;合法合法char *a = abcd;char *a;a = abcd; 合法合法char a5;a = abcd; 非法非法a是指针变量.将字符串的首地址赋给a.a+;非法非法a是指针常量.只能在定义时赋初值.定义字符串的多种方式(现实上便是两种)21第九章 指针-指针与一维数组#include main( ) char

20、a20 = xyz; *a = w; a+; 错误错误 printf(%s, a); 结论结论:wyz#include main( ) char *a = xyz; *a = w; 错误错误 a+; printf(%s, a);结论结论:yz字符串被安排在动态信息区(栈)中.a不能被改变,字符串内容能够被改变.字符串被安排在静态只读区.a能够被改变,字符串内容不能被改变.两种定义字符串方式的对比22第九章 指针-指针与一维数组#include main( ) char *a; 指针未赋值指针未赋值 scanf(%s, a); printf(%s, a);错误的#include main( ) char a20; 安排空间安排空间 scanf(%19s, a); printf(%s, a);精确的以下程序的输出结论是以下程序的输出结论是( 68 )char str =ABCD, *p=str; printf(%dn,*(p+3);练习23第九

温馨提示

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

评论

0/150

提交评论