




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 指 针 YYH版 第8章 指 针 8.1 指针的概念与定义 8.2 指针作函数参数 8.3 指针与数组 8.4 指针与函数 8.5 复杂指针 教材上的 第二章2.8 第8章 指 针 YYH版 8.1 指针的概念与定义 8.1.1 指针的概念 地址 图 8.1 内存分配表 8.1.2 指针的定义及使用 1. 指针的定义:指针是一种存放地址值的变量,它指向/ 表示另一变量。 设一个数据占 两个字节(后同 ) 第8章 指 针 YYH版 说明:如它变量一样,必须在使用前定义。指针变量的命名 遵守与其它变量相同的规则。指针定义的格式如下: 类型名 *指针名; 例 8.1 指针与非指针的定义 char *pcl,*pc2; * pcl和pc2均为指向char型变量的指针* float *pt,pf; *pt是float型的指针,而pf为普通的float型变量* 例 8.2 指针的指向 int *point; scanf(“%d”, point); /键入十进制数据给指针所指向的地方/变量, 这里,若是变量必冠“ int i; register int k; 则表达式 *pc=F; c= F ; 说明:指针变量应先定义后用单目运算符“*”和“ 指针变量只能先取地址运算后才能进行其间接访问(*)。 例 8.3 取地址运算符。 int a=10; cout void main( ) int a, b, *p1, *p2; a=10; b=20; p1= p2= printf(“%dt%dn”, *p1, *p2); p1= p2= printf(“%dt%dn”, *p1, *p2); 程序运行结果: 10 20 20 10 2A00 2A10 2B00 2B10 2B00 2B10 p1 p2 a b 10 20 2A00 2A10 2B00 2B10 2B00 2B10 p1 p2 a b 10 20 第8章 指 针 YYH版 8.2 指针作函数参数:引例 8.6交换任意两个数并输出( 形参为变量即“值传递”见函数的三角交换例子)。 #include void swap(int x, int y); void main() int a, b; a=10; b=20; swap(a, b); printf(“a=%d, b=%dn”, a, b); void swap(int x, int y) int temp; temp=x; x=y; ytemp; 图 8.5 swap函数被调用时的内存分配图 1020 2000 2002 a b 20 2100 2102 x y 10 图 8.5 swap函数被调用结束时的内存分配图 1020 2000 2002 10 2100 2102 20 a b x y 运行结果: a=10, b=20 程序运行结果并没交换,原因是虽然函数内的局部变量 x和y交换了,但主函数内的局部变量a和b并未交换。 第8章 指 针 YYH版 例 8.7 (对上例)指针作函数参数(形参为指针“地址传递” -两方) 。 void swap(int * x, int * y); /方一 void main() int a, b; a=10; b=20; swap( printf(“a=%d,b=%dn”, a,b); void swap(int *p1, int *p2) int temp;/利用中间变量 temp=*p1;/将两指针变量 *p1=*p2;/所指的变量内容 *p2=temp;/10和20进行交换 运行结果: a=20, b=10 注意:若用 “swap(a,b)” 则错 误, 因不可将“int” 传递给 “int *”, 即不同类。 2A00 2A10 2B00 2B10 2B00 2B10 p1 p2 a b 10 20 temp 第8章 指 针 YYH版 void swap(int * x, int * y); /方二 void main() int a, b, *p1, *p2; a=10; b=20; p1= p2= swap(p1, p2); printf(“a=%d,b=%dn”, a,b); void swap(int *pa, int *pb) int temp;/利用中间变量 temp=*pa;/将两指针变量 *pa=*pb;/所指的变量内容 *pb=temp;/10和20进行交换 运行结果: a=20, b=10 2A00 2A10 2B00 2B10 2B00 2B10 p1 p2 a b 10 20 temp 2B002B10 papb 实例见 “VC+教 程VC+实 例一般程 序指针” 第8章 指 针 YYH版 图 8.7 swap函数被调用时的内存分配图 图 8.8 swap函数调用结束时的内存分配图 方一运行的示意图 temp 第8章 指 针 YYH版 8.3 指 针 与 数 组 8.3.1 指向一维数组的指针 C/C+语言引用数组元素有两种等价的形式:通过下标引用 和通过指针引用。以数组a为例, 假定pa指向a0,元素的下标 引用和指针引用的对应关系如下(写在同一行上的表达式是对同 一元素的等价引用形式): a0 *pa *a或*(a+0) a1 *(pa+1) *(a+1) a2 *(pa+2) *(a+2) a9 *(pa+9) *(a+9) /先声明 void main() int *p, i, a10; p=a; /指针变量指向数组起址 for(i=0; ixk) k=j; if(k!=i) t=xi; xi=xk;xk=t; 8.3.2 数组作函数参数 例 8.10 数组名作函数参数(对给定的任意十个数进行排序):方1 2000 2001 2008 2009 a0 a1 a8 a9 2xxx pp+ 可用p= for(i=0; ixk) k=j; if(k!=i) t=xi; xi=xk; xk=t; #include void sort(int *x, int n); void main() int i, a10; for(i=0; i void my_strcpy(char *t, char *s) while(*t=*s)!=0) s+;t+; 指针变量=字符串或数 组名(相当于内存地址) my_strcpy可简写为: void my_strcpy(char *t,char *s) while(*t+=*s+)!=0); 将*s所指的字符串拷 贝到*t所指的地方 注意:对后缀增1而又参与其它 运算,是参与运算后再增1;对 前缀增减1则相反。此例不可用 前缀增1(因第一个字符漏掉了) 第8章 指 针 YYH版 对my_strcpy函数的正确调用: (设s1、s2为数组,ps1、 ps2为指针变量) (1)my_strcpy(s1,“I am a student“); (2) ps1= ps2=“I am a student”; my_strcpy(ps1,ps2); (3) ps2= my_strcpy(s1,s2); 或 my_strcpy(s1,ps2); 上述三例的结果均是相当于 实现了s1=“I am a student“ 第8章 指 针 YYH版 复制过程继续的条件是被复制的字符为非0(非0,即结束标记) 。 由于组成字符串的任何字符(0除外)的值都为非0, 所以 my_strcpy还可以进一步简化为 void my_strcpy(char *t, char *s) while(*t+=*s+); 例 8.12 字符串比较函数(为0即相等,否则非0不相等)。 int my_strcmp(char *s, char *t) for(; *s= =*t; s+, t+) /循环逐个比价字符相等否(可用while) if(*s= =0) return 0; /若为结束符则返回0 return(*s-*t); /两种情况下返回两字符串的差值 一种:两字符串相等返回0(同上); 另一种:两字符串不相等返回非0 第8章 指 针 YYH版 8.3.4 指向多维数组的指针 设一个二维数组的定义为 static int a24=1, 3, 5, 7, 2, 4, 6, 8; 设数组a在内存中的分配情况如下: 第8章 指 针 YYH版 例 8.13 多维数组(输出给定的二维数组) 。 void main() /方一 static int a34=1, 3, 5, 7, 2, 4, 6, 8, 10, 20, 30, 40; int *p; for(p=a0; p / day_of_year: 从月份和日期计算为一年中的第几天 int day_of_year(int year, int month, int day, int *pi) int i, leap; leap=year%4=0 for(i=1; i*(*(pdaytab+leap)+i); i+) yday-=*(*(pdaytab+leap)+i); *pmonth=i; *pday=yday; int main(void) int daytab213= 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 y, m, d, yd; 第8章 指 针 YYH版 printf(“input year, month, day: n“); scanf(“%d%d%d“, yd=day_of_year(y, m, d, printf(“day of year is %dn“, yd); printf(“input year, day_of_year: n“); scanf(“%d%d“, month-day(y, yd, daytab, printf(“%d, %d in %dn“, m, d, y); return 0; 运行结果: input year, month, day: (输出) 1995 12 11 (输入) day of year is 345 (输出) input year, day_of_year: (输出) 1994 280 (输入) 10, 7 in 1994 (输出) 第8章 指 针 YYH版 8.3.5 指针与数组(类似8.4 指针与函数 ) 由指针变量组成的数组称为指针数组,组成数组的每个元素 都是相同类型的指针。 指针数组说明的形式为 类型名 *数组名常量表达式: 其中“*数组名常量表达式”是指针数组说明符。 例如: int *ps10; 设有二维数组说明: int a44; 用指针数组表示数组a, 就是把a看成4个一维数组, 并说 明一个有4个元素的指针数组pa,用于集中存放a的每一行元素 的首地址,且使指针数组的每个元素pai指向a的相应行。于是 可以用指针数组名pa或指针数组元素pai引用数组a的元素。 指针数组pa的说明和赋值如下: 数组指针格式为: 类型名 (*指针名)常量表达式: 为指向“类型名”数组的指针 为 “类型名”的指针数组(值为地址) 第8章 指 针 YYH版 int *pa4, a44; pa0= 或pa0=a0; Pa1= 或pa1=a1; pa2= 或pa2=a2; pa3= 或pa3=a3; *(*(pa+i)+0), *pai或*(pai+0)(i=0, 1, 2, 3)引用第i行第0列元素 ai0; *(*(pa+i)+1)或*(pai+1)引用第i行第1列元素 ai1; 。 用指针数组表示二维数组在效果上与数组的下标表示是相同 的,只是表示形式不同。用指针数组表示时,需要额外增加用 作指针的存贮开销;但用指针方式存取数组元素比用下标速度 快,而且每个指针所指向的数组元素的个数可以不相同。例如 ,可用有5个元素的指针数组和5个不同长度的整型数组来描述 下面的三角矩阵: 第8章 指 针 YYH版 存贮三角矩阵的数组和每一 行的指针可说明如下: int a11, a22, a33, a44, a55, *pa5; 下面的语句使pa的每个元素指 向三角矩阵的每一行: Pa1= Pa2= Pa3= Pa4= Pa5= 第8章 指 针 YYH版 8.4 指 针 与 函 数 8.4.1 函数指针 C/C+语言定义指向函数的指针称为函数型指针,其定义形式: 类型标识符 (*指针名)(参数表); 例如: int (*fp)(参数表 ); 说明: fp是指向int类型函数的指针;与指向数组的指针说明类 似,说明符中用于改变运算顺序的()不能省。如果将(*fp)( )写成 *fp(),则fp则为指针函数(见后8.4.2 指针函数),即返回值为int 指针类型的函数(即该函数值为int指针类型的地址。注意(*fp)() 和*fp()的区别)。 第8章 指 针 YYH版 例 8.16 指向函数的指针(同一函数而实现不同的功能)。 设一个函数operate,在调用它的时候,每次实现不同的功 能。输入a和b两个数,第一次调用operate得到a和b中最大值, 第二次得到最小值,第三次得到a与b之和。 #include void main() /必须进行函数声明,否则无法调用 int max(), min(), sum(), a, b; printf(Enter two number: ); scanf(%d%d, printf(max=); operate(a, b, max); printf(min=); operate(a, b, min); printf(sum=); operate(a, b, sum); int max(int x, int y) if(xy) return(x); else return(y); 第8章 指 针 YYH版 int min(int x, int y) if(x # define STRLEN 81 # include 第8章 指 针 YYH版 char *maxstr(char *str1, char *str2) if(strcmp(str1, str2)=0) return(str1); else return(str2); void main() char string1STRLEN, string2STRLEN, *result; printf(Input two strings: n); scanf(%s%s, string1, string2); result=maxstr(string1, string2); printf(The max string is: %sn, result); 程序运行情况: Input two strings: abcde abcee The max string is: abcee 第8章 指 针 YYH版 8.5 复 杂 指 针 8.5.1 指向指针的指针 定义了指针pointer,它指向char型,用它可以存放字符型变量的 地址,并且可以用它对所指向的变量进行间接访问; 进一步定义: char *p-p; 从运算符*的结合性可以知道, 上述定义相当于: char *(*p-p); 例 8.18 指向指针的指针。 void main() int a, *pointer, *p-p; a=20; pointer= p-p= printf(%d, %u, %un , a, pointer, p-p); printf(%d, %u, %dn, *pointer, *p-p, *p-p); 运行结果: 20, 2000, 2050 20, 2000, 20 第8章 指 针 YYH版 例 8.19 指向指针的指针。 void main() static char *country=CHINA, ENGLAND, “ FRANCE, GERMANY; char *p; int i; for(i=0; i void main(int argc, char *argv) int i; for(i=1; i #include #include int max(int x, int y) return(xy?x: y); int min(int x, int y) return(xy?y: x); void main(int argc, char *argv) int a, b; char *operate_flag; if(argc2) printf(usage: abc integer1 interger2 operate_flagn); exit(0); 第8章 指 针 YYH版 a=atoi(argv1); b=atoi(argv2); operate_flag=argv3; if(strcmp(operate_flag, max)=0) printf(“The %s of%s and %s is: %dn”,argv3, argv1, argv2, max(a, b); else if(strcmp(operate_flag, min)=0) printf(The %s of %s and %s is: %dn, argv3, argv1, argv2, min(a, b); else printf(operate-flag should be max or minn);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国宽温液晶屏行业市场全景分析及前景机遇研判报告
- 上海民办华曜浦东实验学校2025-2026学年八年级上学期9月月考语文试题(含答案)(解析版)
- 2025年中国咖啡豆研磨机行业市场全景分析及前景机遇研判报告
- 生态友好型建筑材料对城市可持续发展的贡献
- 推动校企合作与产教融合
- 工商管理类学生创业失败经验对创新能力提升的作用分析
- 理工科大学生思想政治教育传播的互动性与实效性提升
- 优化创新型疫苗研发与生产技术的突破路径
- 2025年禁毒学导论考试题及答案
- 2025年农村社会治理真题及答案
- GB/T 10081-2005矩形内花键长度系列
- GA/T 1968-2021法医学死亡原因分类及其鉴定指南
- GA 1551.6-2021石油石化系统治安反恐防范要求第6部分:石油天然气管道企业
- 各类机载娱乐系统快速操作指南6.24制
- 《古筝的艺术流派》
- 徐州的传统民俗
- DDI高绩效辅导经典课程讲义
- 公共秩序部车辆管理办法
- 服装企业生产工序分析
- 我的暑假生活PPT模板
- DB11-T 775-2021多孔混凝土铺装技术规程
评论
0/150
提交评论