《计算机语言与程序设计》第九讲指针.ppt

上传人:本田雅阁 文档编号:2155419 上传时间:2019-02-23 格式:PPT 页数:32 大小:183.51KB
返回 下载 相关 举报
《计算机语言与程序设计》第九讲指针.ppt_第1页
第1页 / 共32页
《计算机语言与程序设计》第九讲指针.ppt_第2页
第2页 / 共32页
《计算机语言与程序设计》第九讲指针.ppt_第3页
第3页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《《计算机语言与程序设计》第九讲指针.ppt》由会员分享,可在线阅读,更多相关《《计算机语言与程序设计》第九讲指针.ppt(32页珍藏版)》请在三一文库上搜索。

1、1,第九讲 指 针,2,指针是C语言中的一个重要概念。掌握指针的用法,可使程序简洁、高效、灵活,但并不难学。 为了了解什么是指针,先看一个小故事 地下工作者阿金接到上级指令,要去寻找打开密电码的密钥,这是一个整数。几经周折,才探知如下线索,密钥藏在一栋三年前就被贴上封条的小楼中。一个风雨交加的夜晚,阿金潜入了小楼,房间很多,不知该进哪一间,正在一筹莫展之际,忽然走廊上的电话铃声响起。艺高人胆大,阿金毫不迟疑,抓起听筒,只听一个陌生人说:“去打开211房间,那里有线索”。阿金疾步上楼,打开211房间,用电筒一照,只见桌上赫然6个大字:地址1000。阿金眼睛一亮,迅速找到1000房间,取出重要数据

2、66,完成了任务。,3,我们画出下图,211,1000,P,说明: 1、数据藏在一个内存地址单元中,地址是1000。 2、地址1000又由P单元所指认,P单元的地址为211。 3、66的直接地址是1000;66的间接地址是211;211中存的是直接地址1000。 4、称P为指针变量,1000是指针变量的值,实际上是有用数据藏在存储器中的地址。,4,指针变量用来存放另一变量地址的变量 变量的指针就是变量的地址。 1、指针的概念 指针是一种特殊的变量,特殊性表现在类型和值上。 从变量讲,指针也具有变量的三个要素: (1)变量名,这与一般变量取名相同,由英文字符开始。 (2)指针变量的类型,是指针所

3、指向的变量的类型,而不是自身的类型。 (3)指针的值是某个变量的内存地址。,5,从上面的概念可知,指针本身类型是int型,因为任何内存地址都是整型的。但是指针变量的类型却定义成它所指向的变量的类型。 2、指针的定义(说明,先说明后引用) 例如: int *p, *q; / 定义p,q为指向整数类型变量的指针 float *point; / 定义point为指向float型变量的指针 double *pd; / 定义pd为指向double型变量的指针 int (*pa)10; / 定义pa为指向int型数组的指针 int (*pu)(); / 定义pu为指向int型函数的指针 int *qq;

4、/ 定义qq为指向int型指针的指针 还有指向结构、联合的指针,后面再介绍,6,3、指针赋值 例 int akey; / 定义一个整型变量akey int *p,*q; / 定义p,q为指向整型变量的指针变量 akey=66; / 将66赋给akey p = / 将p的值赋给q,见图2,7,q = p; / 将p的值赋给q,见图2,8,/ 指针1.c #include /预编译命令 void main() /主函数 /函数体开始 int a5=0,1,2,3,4; /定义数组,赋初值 int *p1,*p2; /定义指针变量 p1= /输出a1和a2的值 /函数体结束,9,说明:见图,&a1,

5、&a2,&p1,&p2,p1,p2,p1和p2分别指向a1,a2,这里 & 取地址运算符 * 指针运算符(间接访问运算符) *p1间接访问p1所指向的内存单元,当然是输出a1的值 *p2间接访问p2所指向的内存单元,当然是输出a2的值,10,/ 指针2.c #include /预编译命令 void main() /主函数 /函数体开始 int akey,b; /定义整型变量 int *p,*q; /定义指针变量 akey=66; /赋值给变量akey p= /输出b的值 /函数体结束,4、向指针所指向的内存单元赋值,11,12,/ 指针3.c #include /预编译命令 void main

6、() /主函数 /函数体开始 int a5=1,3,5,7,9; /定义数组,赋初值 int *p; /定义指针变量 int i; /定义整型变量 p=a; /赋值给指针变量,让p指向a数组for(i=0;i5;i=i+1) /循环体开始 printf(“a%d=%dn“,i,*p);/输出a数组元素的值 p=p+1; /指针变量加1 /循环体结束 /函数体结束,5、指针与数组 先看一个程序,13,说明 (1) p=a; 这里数组名作为数组的起始地址,即a0的地址。 因此 p=a 等效于 p=,p,p+1,p+2,p,p+1,p+2,等效,14,/ 指针4.c #include /预编译命令

7、void main() /主函数 /函数体开始 int a5=1,3,5,7,9; /定义数组,赋初值 int *p; /定义指针变量 int i=0; /定义整型变量,赋初值 for(p=a;pa+5;p=p+1) /赋值给指针变量,让p指向a数组 /循环体开始 printf(“a%d=%dn“,i,*p); /输出a数组元素的值 i=i+1; /让i加1 /循环体结束 /函数体结束,做下面的实验,15,/ 指针5.c #include void main() char *p; / 定义指向字符类型的指针变量p static char s = “abcdefgh”; / 定义字符数组,并赋值

8、 p=s; / 数组名是一个常量指针, / 它指向该数组首地址 while (*p != 0) / 当p所指向的数组元素不为0时 p=p+1; / 让指针加1 printf(“字串长度为%dn”,p-s); / 输出字串长 ,数组名是一个常量指针,指向该数组的首地址,例,16,s,s,p,图中数组的首地址是s0的地址,即&s0。s可看作是指向s0的指针。s是不会动的,是常量指针。,17,/ 指针6.c #include /预编译命令 void main() /主函数 /函数体开始 static char shuzi=“987654321”; /定义数组, / 赋初值为数字字符串 char *p

9、= / 换行 ,数组名是一个常量指针,指向该数组的首地址,例,18,shuzi,p,说明: 1、字符串: 数字字符串。 2、p指向shuzi8,即指向串中的字符1。 3、直到型循环,用putchar函数将shuzi8输出到屏幕;之后让p=p-1。 4、在while中,当p=shuzi则继续执行循环体。一旦 pshuzi 则退出循环。这种做法使输出结果为 123456789 5、在本例中数组名shuzi是一个常量指针,永远指向shuzi0的地址上。 思考:如何通过p和shuzi求该数字字符串的长度,19,/ 指针7.c #include /预编译命令 void main() /主函数 /函数体开

10、始 int i; char *p; /定义指针变量,赋初值 p=“computer“; /指针赋初值,指向字苻串 printf(“%sn“,p); /输出字苻串 for (i=0;i8;i=i+1) /循环体开始 putchar(pi); /输出第i个字苻 /循环体结束 putchar(n); /换行 while(*p) /循环体开始 putchar(*p); /输出p所指向的字符 p=p+1; /指针变量值加1 /循环体结束 putchar(n); /换行 /函数体结束,20,上例中有三种不同的输出方式,请你自己分析一下,各有什么特点 说明: 1、对字符指针变量赋值的写法 (1)char *

11、p; (2) char *p=“computer”; p = “computer”; 以上两种都行。可以整体赋值。 2、对字符数组赋初值的写法 (1)char as12=“department”;/ 可以。在定义时可以整体赋值 char as =“department”;/ 可以。在定义时可以整体赋值 (2)char as12; as = “department”; / 不可以!不可以整体赋值 as12=“department”; /不可以!不可以整体赋值,21,#include /预编译命令 void main() /主函数 /函数体开始 int i; char s = “China“; /

12、s 为字符数组 char* t = s ; /t为指向字符数组的指针变量 / p为指针数组变量,p数组元素依次指向 / 字符串“China“,“Canada“,“Denmark“,“Greece“ char* p =“China“,“Canada“,“Denmark“,“Greece“; /q为指针数组变量,q数组元素依次指向指针数组元素 /p0,p2,p3,p1 char* q =p,p+2,p+3,p+1;,例题分析,22,/输出1.1: s 的地址 cout“1.1: 输出 s 的地址“,23,1.1:输出 s 的地址0x0012FF78 1.2:输出 s 的内容China 1.3:输出

13、 t 指向的内容China 1.4:输出 *t 表示的内容C 1.5:输出 *s 表示的内容C 1.6:输出 t 所在的地址0x0012FF74,结果,24,/输出2.1: P0 指向的字符串 cout“2.1: 输出 P0 指向的字符串 “p0endl; /输出2.2: P1 指向的字符串 cout“2.2: 输出 P1 指向的字符串 “p1endl; /输出2.3: P2 指向的字符串 cout“2.3: 输出 P2 指向的字符串 “p2endl; /输出2.4: P3 指向的字符串 cout“2.4: 输出 P3 指向的字符串 “p3endl;,25,2.1: 输出 P0 指向的字符串

14、China 2.2: 输出 P1 指向的字符串 Canada 2.3: 输出 P2 指向的字符串 Denmark 2.4: 输出 P3 指向的字符串 Greece,结果,26,/输出3.1: p0本身的地址 cout “3.1: 输出p0本身的地址“ ,27,3.1: 输出p0本身的地址0x0012FF64 3.2: 输出p1本身的地址0x0012FF68 3.3: 输出p2本身的地址0x0012FF6C 3.4: 输出p3本身的地址0x0012FF70,结果,28,/ 输出4.1: q0指向的内容 cout “4.1: 输出q0指向的内容“ q0 endl; / 输出4.2: q1指向的内容

15、 cout “4.2: 输出q1指向的内容“ q1 endl; / 输出4.3: q2指向的内容 cout “4.3: 输出q2指向的内容“ q2 endl; / 输出4.4: q3指向的内容 cout “4.4: 输出q3指向的内容“ q3 endl;,29,4.1: 输出q0指向的内容0x0012FF64 4.2: 输出q1指向的内容0x0012FF6C 4.3: 输出q2指向的内容0x0012FF70 4.4: 输出q3指向的内容0x0012FF68,结果,30,/ 输出5.1: q0指向的内容的内容 cout “5.1: 输出q0指向的内容的内容“ *q0 endl; / 输出5.2: q1指向的内容的内容 cout “5.2: 输出q1指向的内容的内容“ *q1 endl; / 输出5.3: q2指向的内容的内容 cout “5.3: 输出q2指向的内容的内容“ *q2 endl; / 输出5.4: q3指向的内容的内容 cout “5.4: 输出q3指向的内容的内容“ *q3 endl;,31,5.1: 输出q0指向的内容的内容China 5.2: 输出q1指向的内容的内容Denmark 5.3: 输出q2指向的内容的内容Greece 5.4: 输出q3指向的内容的内容Canada,结果,32,结 束,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1