




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指 针 复 习 资 料 长春工业大学 复习内容: 6、多级指针 7、带参数的主函数 8、指针型函数 9、指向函数的指针 1、指针与指针变量 2、指针的基本运算 3、指针与数组 4、指向字符串的指针变量 5、指针数组 程序中: int i; float k; 内存中每个字节有一个编号-地址 . 2000 2001 2002 2005 内存 0 2003 i k 编译或函数调用时为其分配内存单元 变量是对程序中数据 存储空间的抽象 . 一、指针与指针变量 a=5; b=3; c=a +b; 20002000 20012001 20022002 20032003 20042004 20052005 a a b b c c 5 直接将整数直接将整数 5 5 存入变量存入变量 a a 3 直接将整数直接将整数 3 3 存入变量存入变量 b b 8 直接直接将变量将变量 a a、b b 的值的值 取出,相加后存入变量取出,相加后存入变量 c c 利用变量名利用变量名 存取数据的方式存取数据的方式 称为称为“ “直接存取直接存取” ” 方式。方式。 C 语言 还提供了对 内存单元的 “间接存取” 方式 p p 20002000 20012001 20022002 20032003 20042004 20052005 20062006 20072007 a a b b c c 5 3 2004 a a和和b b相加的结果相加的结果(*p=(*p=a+ba+b) )存放存放 到变量到变量p p所指向的所指向的内存单元内存单元中去。中去。 此时此时c c称为指针变量称为指针变量p p的的目标变量目标变量 。 p p 20042004 c c p= a=5,b=3,c,*p; p = p = *p = a + b; *p = a + b; 变量的地址称为变量的指针变量的地址称为变量的指针 存放地址的变量称为指针变量存放地址的变量称为指针变量 指针变量与其所指向的变量之间的关系 指针变量的定义 n一般形式: 存储类型 数据类型 *指针名; 3 变量i 2000 i_pointer *i_pointer i*i_pointer *i_pointer=3 3 变量i 2000 i_pointer *i_pointer i*i_pointer *i_pointer=3 合法标识符 指针的目标变量的数据类型 表示定义指针变量 不是*运算符 例 int *p1,*p2; float *q ; static char *name; 注意: 1、int *p1, *p2; 与 int p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值 main() int a,*p= float x,*q= 20002000 20012001 20022002 20032003 20042004 20052005 20062006 20072007 20082008 20092009 a a p p x x q q 2004 2000 main()main() intint a,*p; a,*p; float x,*q; float x,*q; p = p = q = q = 指针变量定义指针变量定义 的形式的形式指针变量初始化指针变量初始化 二、指针的基本运算 main() int a,*p= float x,*q= *p = 5; printf(“a+3=%dn“,*p+3); 间接存取运算间接存取运算 20002000 20012001 20022002 20032003 20042004 20052005 20062006 20072007 20082008 20092009 a a p p x x q q 2004 2000 *p = main()main() intint a,*p; a,*p; float x,*q; float x,*q; p p = ; q q = ; 赋值运算赋值运算 5 方法方法1 1:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的 指向求解。指向求解。 main( ) main( ) intint a,ba,b, ,* *p1p1, ,* *p2p2, ,* *p p; ; p1p1= =a;p2p2= = b; scanf( scanf(%d%d%d%d, ,p1p1, ,p2p2);); if( if(* *p1p1 p1、p2 = p1。 指针与一个整型数据进行比较是没有意 义的 。 不同类型指针变量之间比较是非法的。 NULL可以与任何类型指针进行=、!= 的关系运算,用于判断指针是否为空指针 。 三、指针与数组 数组名是该数组的指针 a是数组的首地址(即a0的地址),是一 个指针常量。 a = a0 a9 p p a a 当p指向a0时,用p表示数组元素 下标法: p0,p1, ,pi, ,p9 指针法: *(p+0),*(p+1), ,*(p+i), ,*(p+9) a0 a9 p p 1. 一维数组的指针 指向一维数组元素的指针变量 由于数组元素也是一个内存变量,所 以此类指针变量的定义和使用与指向变量 的指针变量相同。例如:int a10,*p; p = a;(或 p = ) a a a0 a9 p p a a 【例】用指针针法输输出数组组元素。 main( ) int a10, i, *p; for (i=0; i*q) pp=q; if (pp!=p) t=*p;*p=*pp;*pp=t; for (p=a; p*q F pp=q T pp!=p F *pp*p 输出a数组 选择法排序N-S图 【例例】输入五个整数,使用指针变量将这五个数按从小到输入五个整数,使用指针变量将这五个数按从小到 大排序后输出。大排序后输出。 0 10 20 1 11 21 2 12 22 3 13 23 a 二维数组的地址 例如:int a34; 二维数组名a是数组的首地址。 二维数组a包含三个行元素:a0、a1、a2 。 a0 a1 a2 a 三个行元素的地址分别是:a、a+1、a+2。 而a0、a1、a2也是地址量,是一维数组名, 即*(a+0)、*(a+1)、*(a+2)是一维数组首个元素地址 。 2. 2. 二维数组的指针二维数组的指针 a+1 a+2 二维数组元素的地址 a0、a1、a2是一维数组名 ,所以ai+j是数组元素的地址 。 数组元素aij的地址可以表示为下列形式 : for (p=a0, i=0; i main( ) char c80,*str; strcpy(c,“How are you ?“); str=“Fine,thanks.“; printf(“%sn%sn“,c,str); 2. 2. 字符串的赋值运算字符串的赋值运算 将一个字符串赋给一个字符数组只能使用strcpy函数 将字符串常量的首地址赋给指针变量,可使用赋值运算 符“=” How are you ? Fine,thanks. 【例】利用指针变量输入输出字符串。 #include main( ) char c80,*str; str=c; gets(str); puts(str); 3. 3. 字符串的输入输出字符串的输入输出 使用字符串输入输出函数gets和puts; 在scanf和printf函数中使用 %s格式实现。 输入字符串时,函数参数:数组名、存有数组名的指针 变量; 输出字符串时,函数参数:数组名、存有字符串首地址 的指针变量。 I love China! I love China! 五、指针数组 指针数组定义的一般形式: 数据类型标识符 *数组名元素个数; 在这个定义中由于“ ”比“*”的优先级高,所以数 组名 先与“元素个数”结合,形成数组的定义形式,“*” 表示 数组中每个元素是指针类型,“数据类型标识符”说明指 针 的目标变量的数据类型。例如: int *ip10; char *cp5; 指针数组就是数组中的每个元素均为指针类型 例如: char c48=“Fortran“,“COBOL“,“BASIC“,“Pascal“; char *cp4=c0,c1,c2,c3; char *str5=“int“,“long“,“char“,“float“,“double“; int a23; int *p2=a0,a1; 指针数组初始化指针数组初始化 cpC 数 组 cp0Fortran0 cp1C O BO L0 cp2B A SIC 0 cp3P ascal0 例如: char c48=“Fortran“,“COBOL“,“BASIC“,“Pascal“; char *cp4=c0,c1,c2,c3; char *str5=“int“,“long“,“char“,“float“,“double“; int a23; int *p2=a0,a1; str0int0 str1long0 str2char0 str3float0 str4double0 【例8】用06分别代表星期日至六,当输入其中任意 一个数字时,输出相应英文单词。 main( ) char *weekname7=“Sunday“,“Monday“,“Tuesday“, “Wednesday“,“Thursday“,“Friday“,“Saturday“; int week; printf(“Enter week No.: “); scanf(“%d“, if (week=0 int *p3=a+2,a+1,a; int *q=p; printf(“%dn”,*(p0+1)+*(q+2); 【例】以下程序的执行结果是 #define P(x) printf(“%s”,x) main( ) static char *c =“you can make statement”,“for the topic”,“The sentences”, “How about”; static char *p =c+3,c+2,c+1,c; char *pp=p; P(*+pp); P(*-*+pp+3); P(*pp-2+3); P(pp-1-1+3); printf(“n”); 七、带参数的主函数 main(int argc, char *argv ) main函数只能有两个形参,并且这这两个形参 的类类型也是固定的。第一个形参必须须是整型变变量 ,第二个形参可以定义为义为 字符型指针针数组组,也可 以定义为义为 二级级字符指针变针变 量,因此也可以写成 main(int argc, char *argv) 带参数的主函数的调用带参数的主函数的调用 带参数的主函数调用形式: 可执执行文件名 参数1 参数2 参数n 在DOS系统提示符下键入的这一行字符称为 命令行。可执行文件名称为命令名,其后的参数 称为命令行参数,命令名与各参数之间用空格进 行分隔。 要调用带参数的主函数必须在操作系统环境下 进行。假设C语言源程序文件file1.c,经过编译、 连接生成一个可执行文件file1.exe。在DOS系统提 示符后键入可执行文件名file1,即可执行该程序 。 主函数参数的作用主函数参数的作用 argc 称作参数计数器,它的值是包括命令名在内的 参数个数。 argv 指针数组的作用是存放命令行中命令名和每个 参数字符串的首地址。 C:file1 one two three argv0file1 0 argv1one 0 argv2tw o 0 argv3three 0 argvargv argcargc 4 4 【例8】显显示命令行参数程序。 void main(int argc,char *argv ) int i=0; while (-argc0) printf(“%sn“,argv+i); 若上述程序编译后形成可执行文件file1.exe,并按下述语法执 行该命令: file1 one two three 则程序的输出结果为: 【例例9 9】 include main(int argc,char *argv ) while(-argc0) printf(“%s ”,argvargc); printf(“n”); 若上述程序编译后形成可执行文件COMM.EXE,并按下述语法执 行该命令: COMM THIS IS AN EXAMPLE 则程序的输出结果为: 八、指针型函数 指针型函数定义的一般形式: 数据类类型标识标识 符 *函数名(形式参数表) 其中函数名前的“*”表示函数的返回值是 一个指针类型,“数据类型标识符”是指针所 指向的目标变量的类型。 如果一个函数的返回值是指针,则称此函数 为指针型函数。 char *char *subcut(charsubcut(char * *a a, , intint s s, , intint lenlen) ) static char static char substrsubstrSIZE+1; /* SIZE+1; /* substrsubstr用于存放子串用于存放子串 * */ / intint n; n; char char * *psps; ; psps= =substrsubstr; ; if(if(s s strlen(strlen(a a) |) | lenleny) return(x); else return(y); 例 用函数指针变量作参数,求最大值、最小值和两数之和 void main() int a,b,max(int,int), min(int,int),add(int,int); void process(int,int,int (*fun)(); scanf(“%d,%d“, process(a,b,max); p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工会劳动保护监督检查员培训大纲
- 村干部培训班
- 2024中国能建葛洲坝集团春季校园招聘520人笔试参考题库附带答案详解
- 风电项目绿色施工方案
- 绿色使命青春行
- 绿色前行模板
- 绿色能源之源
- 立秋节气营销策略
- 2025年关于货物买卖合同纠纷的法律分析
- 2025商务合同撰写:英语合同语言特点与专业用词
- 部编 道法 六下 第5课、应对自然灾害(课件+教案+习题+知识点)【2套实用版】
- Chap-17垄断竞争(经济学原理 中英文双语)
- 新课程标准下的教学规范:5.山东省初中历史课堂教学基本要求
- “二级甲等妇幼保健院”评审汇报材料二级甲等妇幼保健院(最新)
- 单相变压器精品课件
- 烯烃分离装置操作规程
- 停电作业工作票配电填写模板
- 最新EXCEL上机操作练习题1
- 二重积分的概念与性质(课堂PPT)
- 海天注塑机日常点检表
- 换发药品生产许可证自查报告格式
评论
0/150
提交评论