版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务一
认识指针
一、认识指针和指针变量
为了形象地描述内存单元的数据在存取过程中单元地址的变化情况,引入了指针这一概念。其实,指针就是地址。一般地,如果在程序中定义了一个变量,则编译时系统会根据变量的类型给变量分配一定长度的字节数。实际上,内存中每个字节都有一个编码,这个编码就是该字节的地址。假设程序已定义了二个整型变量i、j;二个实型变量a、b;二个字符型变量c1、c2,编译分配如图9-1所示返回下一页任务一
认识指针二、定义并使用指针变量1.指针变量的定义指针变量的定义其实就是把存放地址的变量定义成“指针类型”。一般格式为:类型名*指针变量名;2.指针变量的相关运算(1)指针运算符有两个相关的运算符:
&:取地址运算符。*:指针运算符(或称“间接访问”运算符)。下一页返回上一页任务一
认识指针1)可用运算符&求变量的地址用赋值语句使指针变量指向变量,例如:p1=&i;(表示将变量i的地址赋给指针变量)p2=&j;(表示将变量j的地址赋给指针变量)则p1、p2分别指向了变量i、j。如图9-2所示。2)可用运算符“*”引用指针变量“*”运算符用于某个地址(如指针变量)之前,表示取*后地址中的内容。上一页下一页返回任务一
认识指针(2)指针的赋值与比较例9.1main(){inta,b;int*p1,*p2;a=10;b=20;p1=&a;p2=&b;printf(“%d%d\n”,*p1,*p2);p1=p2;*p2=5;
printf(“%d%d\n”,*p1,*p2);}上一页下一页返回任务一
认识指针(3)指针的算术运算1)指针可以与整型数相加减若指针变量p当前指向2000单元,其基类型是整型,则以下操作是合法的。
p=p+1/*p指向2002单元*/p=p+2;/*p指向2006单元*/p=p-1;/*p指向2004单元*/2)指针的减法运算两个相同基类型的指针变量可以进行减法运算。设p1、p2均为指向整型变量的指针变量,且p1=2000,p2=2006,则p2-p1=3。3其实是(2006-2000)/2得到的结果,表示两个指针所指对象之间指针基类型的元素个数。系统会根据类型自动地进行地址运算,并不是两个地址的直接相减。上一页下一页返回任务一
认识指针三、使用指针变量作函数参数函数的参数是一般变量或常数时,函数实参向形参是单向值传递。函数的参数是数组名时,则将实参数组名传递给形参数组名,数组名表示数组中第一个元素的地址,故这种传递是地址传递。函数参数还可以是指针变量,其作用是将变量的地址传到另一函数中去。下面用指针变量作为函数参数来实现两个整数按由大到小的顺序输出。返回上一页任务二认识使用指针操作数组一、使用指针操作一维数组
C语言中数组与指针有着密切的联系,在编程时完全可以用指针代替下标引用数组及数组元素,且使数组的引用更为灵活、有效。当一个数组被定义后,程序会按照其类型和长度在内存中为数组分配一块连续的存储单元。此时,数组名成为符号常量,其值为数组在内存中所占用单元的首地址,也就是说数组名代表数组的首地址。指针是用来存放地址的变量,当某个指针存放数组名或数组中第一个元素的地址时,可以说该指针指向了这个数组,这样我们可以通过指针间接访问数组中的元素。下一页返回任务二认识使用指针操作数组通过指针引用数组元素,必须要定义指向数组的指针,例如:
inta[10];int*p;p=a;
以上语句定义了一个长度为10的一维整型数组,同时还定义了一个指针变量p,其基类型必须和所指向的数组类型相同,数组名a代表数组的首地址。由于数组的首地址就是数组元素a[0]的地址,故语句p=a;还可以是p=&a[0];,从而使p指向数组a的第0个元素。变量在定义的同时可以赋初值,上面三个语句还可以等价写成:
inta[10],*p=a;或inta[10],*p=&a(0);只要移动指针p,就可访问数组a的任一元素。如图9-8所示。上一页下一页返回任务二认识使用指针操作数组二、使用数组名作函数参数数组名可以作为函数的形参或实参。如果要将一个一维数组的首地址传给函数,实参可以是数组名或存放有数组首地址的指针变量。而形参可以为一个一维数组或基类型为数组元素的指针变量。例9.6编一个函数,求数组a中n个整数的最小值。方法1:形参为数组名,实参为指针。上一页下一页返回任务二认识使用指针操作数组intfmin(int*p,intn){inti,m;m=*p;for(i=0;i<n;i++)if(m>*(p+i))m=*(p+i);return(m);}main(){inta[10],min,i;for(i=0;i<n;i++)scanf(“%d”,&a[i]);min=fmin(a,10);printf(“min=%d”,min);}上一页下一页返回任务二认识使用指针操作数组
该程序在进行函数调用时,将实参a的值(即数组的起始地址)传给形参p,指针p获得了数组的起始地址,通过指针的移动求出数组中元素的最小值。如图9-10所示。上一页下一页返回任务二认识使用指针操作数组方法2:实参和形参均为指向数组元素基类型的指针变量。intfmin(int*p,intn){inti,m;m=*p;for(i=0;i<n;i++)if(m>*(p+i))m=*(p+i);return(m);}上一页下一页返回任务二认识使用指针操作数组main(){inta[10],i,*p1,min;for(i=0;i<n;i++)scanf(“%d”,&a[i]);p1=a;min=fmin(p1,10);printf(“min=%d”,min);}上一页下一页返回任务二认识使用指针操作数组方法3:实参和形参都是数组名。intfmin(intb[],intn){inti,m;m=b[0];for(i=0;i<n;i++)if(m>b[i])m=b[i];return(m);}上一页下一页返回任务二认识使用指针操作数组main(){inta[10],min,i;for(i=0;i<n;i++)scanf(“%d”,&a[i]);min=fmin(a,10);printf(“min=%d”,min);}上一页下一页返回任务二认识使用指针操作数组方法4:实参为指向数组的指针变量,形参为数组。intfmin(intb[],intn){inti,m;m=b[0];for(i=0;i<n;i++)if(m>b[i])m=b[i];return(m);}
上一页下一页返回任务二认识使用指针操作数组main(){inta[10],i,*p1,min;for(i=0;i<n;i++)scanf(“%d”,&a[i]);p1=a;min=fmin(p1,10);printf(“min=%d”,min);}上一页下一页返回任务二认识使用指针操作数组
说明:接受数组首地址的形参不论定义为数组形式还是定义为指针,C编译时都会把它转化为指针处理。因为参数不能接受整个数组,只能得到数组的起始地址。因此,形参中的数组名是指针变量而不是指针常量,这样就可以对作为形参的数组名进行各种运算,如自加或自减。但作为主函数中定义的数组名是常量,是不可以进行自加或自减的。上一页下一页返回任务二认识使用指针操作数组三、使用指针操作二维数组用指针变量可以指向一维数组,并可通过指针引用数组元素。指针变量也可以指向二维数组,在概念和使用上,二维数组的指针较一维数组的指针要复杂一些。1.二维数组的地址表示法二维数组从其表面上看既有行又有列,因此它的逻辑结构是二维结构。实际上,二维数组在内存中是以行的形式存放的,也就是说,它的物理结构是一维的。下面举例说明二维数组的地址及元素的关系和表示方法。上一页下一页返回任务二认识使用指针操作数组设二维数组为:inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};则数组名为a,它有3行4列共计12个元素。0行:a[0][0]a[0][1]a[0][2]a[0][3]1行:a[1][0]a[1][1]a[1][2]a[1][3]2行:a[2][0]a[2][1]a[2][2]a[2][3]经初始化后,如图9-11所示。上一页下一页返回任务二认识使用指针操作数组2.指向二维数组的指针变量在了解了上面的概念后,可以用指针变量指向二维数组及其元素。(1)指向数组元素的指针变量例9.7用指针变量输出数组元素的值。main(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int*p,i=0;for(p=a[0];p<a[0]+12;p++,i++)/*m*/{if(i%4==0)printf(“\n”);printf(“%5d”,*p);}}上一页下一页返回任务二认识使用指针操作数组(2)指向数组的指针变量对于二维数组元素的访问,还可以定义一个指向一维数组的指针,并将一个行地址送给它。这时指针值加1,则该指针移动的长度为一维数组的长度。指向一维数组的指针的定义方法如下:类型说明符(*指针变量名)[数组长度];
其中,类型说明符为数组元素的类型,数组长度确定了指针变量在进行加1或减1时移动的元素个数。上一页返回任务三使用指针操作字符串一、字符串的表示和引用
C语言中没有专门存放字符串的变量,字符串是存放在字符数组中,且以‘\0’作为结束标志,数组名表示该字符串在内存中的首地址。当定义一个指针变量指向一字符数组后,就可以通过指针访问数组中的每个元素。因此,可以用两种方法访问一个字符串。下一页返回任务三使用指针操作字符串1.用字符数组处理字符串例9.9main(){inti;charstr[]=“Iamastudent.”;printf(“%s\n”,str);for(i=0;str[i]!=’\0’;i++)print(“%c”,str[i]);printf(“\n”);printf(“%s”,&str[7]);}上一页下一页返回任务三使用指针操作字符串2.用字符指针实现上述结果例9.10main(){char*str=“Iamastudent.”,*str1;str1=str;printf(“%s\n”,str);for(;*str!=’\0’;str++)print(“%c”,*str);printf(“\n”);str1=str1+7;printf(“%s”,str1);}上一页下一页返回任务三使用指针操作字符串二、使用字符串指针作函数参数将一个字符串从一个函数传递到另一个函数,可以用字符数组作参数,也可以用指向字符串的指针变量作参数,即都是用地址传递的办法。若在被调用的函数中改变字符串的内容,则在主调函数中可以得到改变了的字符串。上一页下一页返回任务三使用指针操作字符串例9.13编一函数实现字符串的复制方法一:实参和形参都为字符数组voidstr_copy(charstr1[],charstr2[]){inti=0;while(str1[i]!=’\0’){str2[i]=str1[i];i++;}str2[i]=’\0’;}上一页下一页返回任务三使用指针操作字符串main(){chara[]=“Iamastudent.”;charb[]=“Youareateacher.”;printf(“string_a=%s\nstring_b=%s\n”,a,b);str_copy(a,b);printf(“\nstring_a=%s\nstring_b=%s\n”,a,b)}上一页下一页返回任务三使用指针操作字符串方法二:实参为字符型指针变量,形参为字符数组str_copy函数同上,main函数可改写如下:main(){char*a=“Iamastudent.”;char*b=“Youareateacher.”;printf(“string_a=%s\nstring_b=%s\n”,a,b);str_copy(a,b);printf(“\nstring_a=%s\nstring_b=%s\n”,a,b)}上一页下一页返回任务三使用指针操作字符串方法三:形参为字符型指针变量,实参为字符数组str_copy函数可改为:voidstr_copy(char*str1,char*str2){while(*str1!=’\0’){*str2=*str1;str1++;str2++;}*str2=’\0’;}main函数同方法一。上一页下一页返回任务三使用指针操作字符串方法四:形参和实参都用字符指针变量voidstr_copy(char*str1,char*str2){while(*str1!=’\0’){*str2=*str1;str1++;str2++;}*str2=’\0’;}上一页下一页返回任务三使用指针操作字符串main(){char*a=“Iamastudent.”;char*b=“Youareateacher.”;printf(“string_a=%s\nstring_b=%s\n”,a,b);str_copy(a,b);printf(“\nstring_a=%s\nstring_b=%s\n”,a,b)}上一页下一页返回任务三使用指针操作字符串说明:(1)实参和形参无论是数组还是指针变量,在参数传递过程中传递的都是地址。(2)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。(3)字符串的复制是将原字符串的内容依次复制到目标字符串中去,直到遇到字符串结束标志(’\0’)。上一页返回任务四
使用指针操作函数一、返回指针值的函数
一个函数可以带回一个整型值、实型值、字符型值等,也可以带回指针型的数据,即地址。带回指针值的函数的定义方法如下:类型名*函数名(参数表);例9.14输入两个字符串(长度不超过80),进行字符串比较,并输出较大的字符串。用指针函数实现。#include<string.h>#defineSTRLEN81#include<stdio.h>char*maxstr(char*str1,char*str2){if(strcmp(str1,str2)>=0)return(str1);elsereturn(str2);}下一页返回任务四
使用指针操作函数main(){charstring1[STRLEN],string2[STRLEN],*result;printf(“Inputtwostrings:\n”);scanf(“%s%s”,string1,string2);result=maxstr(string1,string2);printf(“Themaxstringis:%s\n”,result);}上一页返回下一页任务四
使用指针操作函数二、指针数组一个数组,其元素均为指针类型数据,称其为指针数组。定义形式如下:类型名*数组名[数组长度];例如:int*a[10];
说明:
a是一个指针数组,有10个元素,每个元素的类型为指针,指向数据的类型为整型。下一页返回上一页任务四
使用指针操作函数三、main()函数的参数指针数组的一个重要应用是作为main函数的形参。到目前为止,我们所编写的main()函数都不带参数,事实上main()函数是可以带参数的。如果main()函数带形参的话,由于它不能被其他函数调用,那么其参数是由谁提供的呢?显然不可能从程序中得到。只有系统调用main()函数时,才能提供实参,实际上实参是由命令行提供的。那么什么是命令行呢?命令行的一般形式为:可执行文件名参数1参数2…参数n上一页下一页返回任务四
使用指针操作函数说明:命令行中包括命令名和需要传给main()函数的参数,命令名和各参数之间用空格分隔。带参数的main()函数格式如下:
main(int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七年级生物下册 第四单元 生物圈中的人 第一章 人的由来 4.1.3 青春期教学设计 新人教版
- 第三章 声的世界 教学设计及反思 -物理教科版八年级上学期
- 2026年来宾市兴宾区社区工作者招聘笔试模拟试题及答案解析
- 2026年河北省衡水市社区工作者招聘考试参考题库及答案解析
- 2026年漯河市召陵区城管协管招聘笔试备考题库及答案解析
- 2026年吉林省通化市社区工作者招聘考试模拟试题及答案解析
- 2026年韶关市浈江区社区工作者招聘笔试模拟试题及答案解析
- 2026年周口市川汇区社区工作者招聘笔试参考题库及答案解析
- 2026年衡阳市雁峰区社区工作者招聘笔试参考题库及答案解析
- 2026年无锡市崇安区社区工作者招聘笔试参考题库及答案解析
- (2026版)《医疗保障基金使用监督管理条例实施细则》深度解读
- 世界知识产权日宣传课件
- 2026苏教版小学数学二年级下册期中综合测试卷及答案(共3套)
- 学校内部控制风险评估结果报告-学校工作总结
- 探索叙述者:理论、形态与功能的多维解析
- 2026年浙江长征职业技术学院单招综合素质考试题库有答案详细解析
- 病理科建设与管理指南(试行)
- (2026年)临床护理文书书写规范
- 2026年吉林铁道职业技术学院单招职业倾向性考试题库附答案详解(完整版)
- 2025年辽宁省考公安岗面试题库及答案
- 老年静脉治疗相关课件
评论
0/150
提交评论