C程序设计第六章指针初步.ppt_第1页
C程序设计第六章指针初步.ppt_第2页
C程序设计第六章指针初步.ppt_第3页
C程序设计第六章指针初步.ppt_第4页
C程序设计第六章指针初步.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

VIP免费下载

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

文档简介

Ch6-1 第六章 指针初步 本章内容提要: 6.1 指针的概念与基本操作 6.2 指针与一维数组 6.3 字符串处理 重点小结 作业 Ch6-2 6.1 指针的概念与基本操作 6.1.1 指针的概念 1. 什么是指针? 指针是C语言的一种数据类型,该数据类型以内存 地址为值,并提供了相关的一系列操作。 2. 使用指针的优点与缺点 (1)直接访问内存,增强了高级语言的功能 (2)编程灵活度增加 (3)不易学习、掌握和正确安全地使用好指针 Ch6-3 6.1 指针的概念与基本操作(续1) 3. 指针的基本属性 (1) 值属性:指针值即内存地址, 它是一个非负整数 (2) 对象属性: 指该地址开始(指针指向)的内存单元中存放的数 据。定义指针变量时,必须指定指针变量的对象类 型。我们使用指针的主要目的就是通过指针访问内 存中的数据。 如: double p; /指针p的对象是一个double型数据 /指针p指向一个double型数据 void p; /指针p指向nothing /无值指针不能进行运算和存取操作 Ch6-4 6.1 指针的概念与基本操作(续3) 6.1.2 指针常量与变量 1. 指针常量(只有三种) Ch6-5 6.1指针的概念与基本操作(续4) 2.指针变量 (1)定义方法:对象类型名 指针变量名; 例: int p, q; double r; char s; 注意: 4 /VC+6.0 sizeof(p)=sizeof(q)=sizeof(r)=sizeof(s)=2 /TC2.0 说明:以VC+6.0为例,每个指针变量用于保存一个 32位(4字节)内存地址。指针变量的存储长度与其 对象类型无关。 Ch6-6 6.1指针的概念与基本操作(续5) (2)指针变量的初始化 C语言允许用指针常量表达式对指针变量初始化. 例: int a4, p=NULL, q=a+1; #include double ( f)(double)=sin; 注意: (a) 不能将一个整数值直接作为内存地址对指针变量 进行初始化。如:long p=0x410; Ch6-7 6.1指针的概念与基本操作(续6) (b) 作为一种特殊情况,C语言允许用一个字符串常量 初始化一个char *型的指针变量 如: char s=“ABCD“; 变量s得到的是字符串常量第一个字符(字母A)的地 址, 即串首地址。 6.1.3 指针的基本运算与操作 1. 取地址运算: p= q= Ch6-8 6.1指针的概念与基本操作(续7) 2.取对象运算: 指针表达式 例1:int a=123, p; p= printf(“%d“, p); /则打印结果为123,即变量a的值 例2:int a=0x4241; char p; p=(char ) putchar(p); /则打印结果为A 理解帮助理解帮助- -指针、指针变量与指针对象的关系指针、指针变量与指针对象的关系 Ch6-9 6.1指针的概念与基本操作(续8) 若有定义: double p; char q; 假设指针变量p的值(即变量p保存的地址值)为 0xB8000000,表达式p表示从p保存的地址值指定的内存 中取一个double型数据(即从内存地址0xB8000000开始连 续取8字节单元)。 若q的值也是0xB8000000, 表达式q表示从q保存的地址 值指定的内存中取一个char型数据(即从内存地址 0xB8000000开始连续取1字节单元)。 若有定义:float a=0.5f, r= 假设变量a的存储地址为0xA0000000, 则指针变量r得到的 值为0xA0000000, 执行初始化 float r=后,有 表达式r表达式a 表达式 r表达式 p=15; /* 相当于a=15 */ p=2; /* 相当于a=a2 */ (p)+; a+; /*指针对象自加减1必须用小括号*/ 比较*p+ (p) ; a ; +(p); +a; (p); a; p=(p)(p); /*相当于a=aa; */ scanf(“%d“,p); scanf(“%d“, scanf(“%d“, Ch6-11 6.1指针的概念与基本操作(续10) 4.正确建立指针对象的方法 (1) 用已有的变量或数组空间建立对象 例:int a=15,p, q, b3; p= q= (2) 用内存分配函数建立对象 介绍两个函数:头文件均为stdlib.h 函数原形: void malloc(unsigned n) 函数功能:分配n字节连续内存单元供用户使用, 分配成功,返回首地址,分配失败,返回NULL。 Ch6-12 6.1指针的概念与基本操作(续11) 函数原形: free(void p) 函数功能: 释放由malloc分配的内存单元。自变量p给 出内存块的首地址。 malloc与free函数一般配对使用(有分配就应有释放). 例:double p; p=(double ) malloc(8); /分配8字节内存 p=0.5; /p所指对象存入0.5 free(void )p); /释放p所指对象 Ch6-13 6.1指针的概念与基本操作(续12) 极不安全的对象用法: (1) double p; p=0.5; /p是指向哪里呢? (2) double p; p=(double )malloc(4); /空间没有分配够 p=0.5; (3) double p; p=(double )malloc(8); p=(double )malloc(8); /先前分配的8字节呢? 后果:突然死机/重启动/出现对话框“程序执行了非 法操作”(往往不得不手工重启动) Ch6-14 6.1指针的概念与基本操作(续13) 5.指针运算(指针表达式也称为地址表达式) (1)指针加减整型表达式n: 仍得同类型指针 运算规则:地址值增减n倍对象类型长度 例:long a=1,2,3,4,p=a; p=a+2; /*p指向元素a2, 即p= */ p p存储的地址值实际增加了存储的地址值实际增加了2 2 sizeof(long)sizeof(long) p+; /*相当于p=p+1; 即p指向下一个对象*/ Ch6-15 6.1指针的概念与基本操作(续14) 特殊表达式: (a) p+; 和 p-; 先取用对象,然后p自加减1 (b) +p; +p; -p; -p; 这四种形式都是p先自加减1,然后再取用对象 对比:+(p); (p)+; -(p); (p)-; 这是对象自加减1 Ch6-16 6.1指针的概念与基本操作(续15) (2) 两个对象类型相同的指针进行加法运算 例:int p, q, s; s=p+q; /*合法但无用处*/ (3) 两个对象类型相同的指针进行减法运算: 得相距的对象长度的倍数(可正可负) 例:int a5, p, q; p= q=a+1;则 pq=2而qp= 2 (4) 两个指针可以比较大小: 比地址值大小 例:int a5, p, q; p=q=a; 则 pq1而p=q Ch6-22 6.2 指针与一维数组(续3) /*下标法*/ #include “stdio.h“ #define N 8 void main() int aN,i ,t ; printf(“Input %d integers:n“,N); for(i=0;i串s,返回正数。 两串比较大小的方法两串比较大小的方法:对应字符比较ASCII码, ASCII码 大的则串大; 对应字符位置均相同,则串长大的串大. “ABCD“ABC“ “ABCD“9A8B“ 英文字典单词的编排顺序正好是字符串的升序排列 Ch6-32 6.3 字符串处理(续8) 对比: 若s, t均为char 型变量或者常量,则 if(strcmp(s,t) 0) /*比较两串相等*/ if(s t) /*比较两指针值是否相等*/ if(s=t) /*可能合法但不合理*/ 6. 查找子串: char strstr(char s, char sub) 功能:若子串sub包含于主串s中,则返回第一次出现 的位置;若查找失败,返回空指针NULL。 例如,char s=“ABCDEFGHI“,p; p=strstr(s, “CDE“); 则p的值为s+2,即p指向字符C。 Ch6-33 6.3 字符串处理(续9) 7查找字符 (1) char strchr(char s, int ch); 该函数查找字符ch在字符串中第一次出现的位置,查 找失败,返回空指针NULL。 (2) char strrchr(char s, int ch); 该函数查找字符ch在字符串中最后一次出现的位置, 查找失败,返回空指针NULL。 例如,char s=“01234500“,p; p=strchr(s, 0); 则p的值为s,它指向最左边的字符0。 p=strrchr(s, 0); 则p的值为s+7, 它指向最右边的字符0 。 Ch6-34 6.3.4 字符串处理程序设计举例 例1不用字符串处理函数,求串长。 #include “stdio.h“ void main() char s81,p;int n=0; printf(“Input a string:n“);gets(s); p=s;while(p) n+;p+; /* p!=0 或 p!=0 */ printf(“length=%dn“, n); /*利用串结束标志为0作为循环结束条件*/ /字符串处理的其它典型扫描结构 for(p=s;p;p+) n+; /*for指针循环法*/ for(n=0;sn;n+) ; /*for下标循环法*/ 6.3 字符串处理(续10) Ch6-35 6.3 字符串处理(续11) 例2 编程统计一个字符串小写英文字母的数目。 #include “stdio.h“ void main() char s81,k;int n=0; printf(“Input a string:n“);gets(s); for(k=0;sk;k+) if(sk=a 应该利用串结束标志字节0作为循环退出条件 Ch6-36 6.3 字符串处理(续12) 例3 不用字符串处理库函数,编程实现字符串拷贝。 #include “stdio.h“ /源程序1 void main() char s41,t41,i=0; / 串t复制到串s / gets(t); while(si=ti)i+; puts(s); void main() /源程序2 char p,q,s41,t41; / 串t复制到串s / gets(t); for(p=s,q=t;q!=0;) p+=q+; puts(s); 问题与思考问题与思考: 源程序2的缺陷是什么? Ch6-37 6.3 字符串处理(续13) 例5 输入一句英文,按单词分行输出。 例如,若程序的输入是 We are student 则输出是 We are students #include “stdio.h“ void main() char s81,p; printf(“Input an Engish sentence:n“);gets(s); for(p=s;p;p+) if(p= =32) /* 遇空格字符则换行 */ if(p+1)!=32) printf(“n“); /*注意多个空格的处理*/ else putchar(p); printf(“n“); Ch6-38 6.3 字符串处理(续14完) 例6 字符串逆序存储。 #include “stdio.h“ #include “string.h“ void main() char s81,p,q,temp; printf(“Input a string:n“);gets(s); p=s;q=s+strl

温馨提示

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

评论

0/150

提交评论