c语言图形输出cpdn,某211大学C语言全套课件0805.pdf-资源下载在线文库www.lddoc.cn

某211大学C语言全套课件08_05.pdf

上节课我们学了上节课我们学了 数组数组定义、初始化、存储、使用定义、初始化、存储、使用 字符数组和字符串字符数组和字符串 本次课程 指针变量 取地址运算符、间接寻址运算符 指针的赋值 指针和数组(第一部分) C语言程序设计 主讲教师何震瀛 指针预备知识 变量 变量类型 变量名 变量的地址 变量的值内容 例 int i1; ii2; 指针预备知识 指针 指针是C语言最重要也是最常被误解的特性 之一 指针变量 类型* 标识符; 在VC中占4个字节 指针的值是一个内存地址 例 int *ip; float *fp1, *fp2; 指针赋值 例 int i, *ip; ip *ip1; ipNULL; 指针图示 int i, *ip; ipi ip 1 *ip1; ipNULL; 0 指针赋值例 int i100, j, *ip, *ip2; float f, *fp; ip int *i;判断以下赋值合法与否 1.ip100; 2.ip2j; 3.fp 4.fpip; 5.ip 6.ip2ip; 7.fp 8.ipNULL; 引用指针变量所指的变量 int i100, j, *ip, *ip2; ip 指出以下语句的功能 j*ip; *ip200; ip2 *ip2*ip; ip2ip; 指针续 讨论一下程序的执行结果 1.testpointer.cpp 2.include 3.void main 4.int * ip,i1; 5.char * cp,c2; 6.ip 7.cp 8.ipint*cp; “ipcp;“ 是非法语句 9.printf“*ipdn*cpdn“, *ip, *cp; 10. 用指针定义数组 Simple arrays How do we declare Static declaration int a10; Dynamic declaration int *a; a int * malloc sizeof int * 10; Example 1 1.void main 2.int a10, i; 3./* initialize the array to zero */ 4.for i 0; i 2.void main 3.int *a, i; 4./* allocate the memory */ 5.a int * malloc sizeof int * 10; 6./* initialize the array to zero */ 7.for i 0; i 若两指针若两指针p和和q指向同一个数组的元素,则指向同一个数组的元素,则pq为真表示为真表示 pq指向数组的同一个元素;若指向数组的同一个元素;若p 2.void main 3.int j, *p, a 1, 2, 3, 4; 4.forj 0; j 0; j 14.printf“p-dtdt“, j, p-j; 15.printf“n“; 16. 指向字符串的指针 为字符串常量提供存储空间有两种方法为字符串常量提供存储空间有两种方法 一是把字符串常量存放在一个字符数组中。例如一是把字符串常量存放在一个字符数组中。例如 char s “I am a string.“; 另一种方法是由编译系统将字符串常量与程序中出现的其他 常量一起存放在常量存储区中。例如 另一种方法是由编译系统将字符串常量与程序中出现的其他 常量一起存放在常量存储区中。例如 1.char *cp1, *cp2 “I am a string“; 2.cp1 “Another string“; 程序为了能访问存于常量存储区中的字符串常量,可用一个字 符指针指向它的起始位置(第一个字符)。 程序为了能访问存于常量存储区中的字符串常量,可用一个字 符指针指向它的起始位置(第一个字符)。 当字符串常量作为表达式出现时,系统将字符串常量放入常量 存储区,而把表达式转换成该字符串常量存储单元的第一个字 符的字符指针。 当字符串常量作为表达式出现时,系统将字符串常量放入常量 存储区,而把表达式转换成该字符串常量存储单元的第一个字 符的字符指针。 指向字符串的指针续 系统预定义许多用于字符串处理的库函数,程序可以 用字符串常量或指向某字符串的指针调用这些库函 数。 系统预定义许多用于字符串处理的库函数,程序可以 用字符串常量或指向某字符串的指针调用这些库函 数。 如调用库函数如调用库函数strlen 求一字符串常量的长度求一字符串常量的长度 strlen“I am a string.“ 该函数调用的结果是该函数调用的结果是14,表示此字符串常量由,表示此字符串常量由14个有 效字符组成。 个有 效字符组成。 如如s是一个字符数组,其中已存有字符串;是一个字符数组,其中已存有字符串;cp是一个字 符指针变量,它指向某个字符串的首字符,则代码 是一个字 符指针变量,它指向某个字符串的首字符,则代码 printf“sn“, s; 输出存于字符数组输出存于字符数组s中的字符串,而代码中的字符串,而代码 printf“sn“, cp; 输出字符指针变量输出字符指针变量cp所指向的字符串。所指向的字符串。 例21 将一个已知字符串复制到一个字符数组将一个已知字符串复制到一个字符数组 设设from为已知字符串的首字符指针,为已知字符串的首字符指针,to为存 储复制字符串的字符数组首元素的指针。若 用下标引用数组元素标记法,完成复制的代 码可写成 为存 储复制字符串的字符数组首元素的指针。若 用下标引用数组元素标记法,完成复制的代 码可写成 1.k 0; 2.while tok fromk 0 k; 如采用字符指针描述有如采用字符指针描述有 while *to *from 0; 字符串复制更简洁的写法是字符串复制更简洁的写法是 while *to *from; 例22 将字符串将字符串s中的某种字符去掉,设要去掉的字符与字 符变量 中的某种字符去掉,设要去掉的字符与字 符变量c中的字符相同。中的字符相同。 采用一边考察字符一边复制的方法。采用一边考察字符一边复制的方法。 引入两个字符指针引入两个字符指针p和和qp指向当前正考察的字符,指向当前正考察的字符, q指向下一个用于存储复制字符的位置。若指向下一个用于存储复制字符的位置。若p所指字 符与 所指字 符与c不相同,则将它复制到新字符串;否则,该字 符不被复制。每复制一个字符 不相同,则将它复制到新字符串;否则,该字 符不被复制。每复制一个字符q才增才增1p是每考察一 个字符就增 是每考察一 个字符就增1 1.forp q s, *p; p 2.if *p c *q *p; /* 复制复制 */ 3.*q 0; /* 重新构成字符串重新构成字符串 */ 回顾 回顾符号*, 占一块连续内存空间占一块连续内存空间 大小为大小为sizeofint*10个字节个字节 二维数组的存放 二维数组例二维数组例 int a23; 占一块连续内存空间占一块连续内存空间 大小为大小为sizeofint*2*3个字节个字节 二维数组的元素的存放顺序是按行存放的,即从数组 的首地址开始,先顺序存放第一行的元素,再存放第 二行的元素。例如,对于前面例子中的数组 二维数组的元素的存放顺序是按行存放的,即从数组 的首地址开始,先顺序存放第一行的元素,再存放第 二行的元素。例如,对于前面例子中的数组a,其元素 在内存中的存放顺序为 ,其元素 在内存中的存放顺序为 a00a01a02a10a11a12 多维数组的存放 多维数组多维数组 类型类型 ai1i2in 占一块连续内存空间占一块连续内存空间 大小为大小为sizeof类型类型*i1*i2in个字节个字节 多维数组的元素的存放顺序是多维数组的元素的存放顺序是 a000 a001 a0 0in-1 a010 a011 a0 1in -1 a0in- 1-10 a0in- 1-11 a0in- 1-1in-1 ai1in- 1-10 ai1in- 1-11 ai1in-1-1in 1 第一维的下标变化最慢,最右边的下标变化最快第一维的下标变化最慢,最右边的下标变化最快 二维数组和指针 如果有一个二维数组,且指针变量所指的是二维数组 中的一整行,则指针变量另有一些很有意义的性质。 设二维数组为 int a34 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ; 按行来看数组a,数组a有三个元素,分别为a0, a1,a2。它们又分别是一个一维数组,各有4个元 素。例如,a0所代表的一维数组为 a00、a01、a02、a03 二维数组和指针续 与一维数组名可看作数组的第一个元素下标 为 0的地址的约定相一致,二维数组名a可以 看作a的首元素a0的地址,即表示二维数组第 一行的首地址。一般地,ai可以看作数组a的 元素ai的地址,即二维数组第i1行的首地 址。 因二维数组a能用a0,a1,a2分别表示其 中的一维数组,所以a0能表示以a0表示的 一维数组的首元素a00的地址;a1能表示 以a1表示的一维数组的首元素a10的地 址。 一般地,ai能表示用ai表示的一维数组的首 元素ai0的地址。 二维数组和指针续 由于数组的开始地址与数组首元素的地址相同,ai与 ai应有相同的值,但它们的意义不同。ai表示用ai 表示的一维数组的首地址,ai表示用ai表示的一维 数组的首元素ai0的地址。另外,因ai可写成 *ai,所以ai 与*ai 也有不同意义,而值相等。 ai或*ai表示二维数组a的元素ai0的地址,即 定义指针变量p能指向一个由四个int型元素组成的 数组。 在以上定义中,圆括号是必需的, 否则, int *p4; 定义为一个指针数组p,即p有四个元素,每个元素 是一个指向整型变量的指针。 指向数组的指针续 定义int *p4; 中的p不同于指向整型变量的指 针。指向整型变量的指针变量指向整型数组的某个元 素时,指针增减1运算,表示指针指向数组的下一个或 前一个元素。p是一个指向由4个整型元素组成的数 组,对p作增减1运算,就表示向前进或向后退4个整型 元素。 如有变量定义 int a34, *p4; p a ;使p指向二维数组a的第1行。 p1的指针值为指向二维数组a的第二行。 若p a,则pi指向二维数组a的第i1行,与ai一样。 同二维数组元素的地址计算规则相对应,*pj指向a0j; *pij,或者pij指向数组a的元素aij。 例23 指向数组元素的指针和指向数组的指针的区别的示意程序。 1.include 2.void main 3.int a34 1, 3, 5, 7, 4. 9, 11, 13, 15, 5.17, 19, 21, 23; 6.int i, *ip, *p4; 7.p a1; ip p0; 8.fori 1; i 2.define N sizeof ap/sizeof ap0 3.void main 4.int a, b, c, d, e, f; 5.int *ap 6.int k, j, t; 7.printf“Enter a, b, c, d, e, f.n“; 8.fork 0; k *apj1 交换变量的值 13.t *apj; *apj *apj1; *apj1 t; 14. 15.fork 0; k 2.define N sizeof ap/sizeof ap0 3.void main 4.int a, b, c, d, e, f; 5.int *ap 6.int k, j, *t; 7.printf“Enter a, b, c, d, e, f.n“; 8.fork 0; k *apj1 交换变量的指针 13.t apj; apj apj1; apj1 t; 14. 15.fork 0; k 2.define N 8 3.void main 4.int pN*N1/2, i, j, *ptN; 5.forpt0p, i1; iN; i pti pti-1 i; 6.fori 0; i N; i 7.pti0 ptii 1; 8.forj1; ji; j ptijpti-1j-1pti-1j; 9. 10.fori 0; i N; i 11.printf“*c“, 40-2*i, ; 12.forj 0; j i; j printf“4d“, ptij; 13.printf“n“; 14. 15. 多级指针 多级指针例 1.int pp, *ip, i; 2.ip 3.pp 当指针变量pp所指的变量ip又是一种指针时,pp是一 种指向指针的指针,就称指针变量pp是一种多级指 针。 定义指向指针变量的指针变量的一般形式为 类型说明符 变量名; 多级指针与指针数组有密切的关系 更详细内容请自习4.5.5节非大纲内容 Thats the end 8thWeek

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值