c语言指针教程.pptx_第1页
c语言指针教程.pptx_第2页
c语言指针教程.pptx_第3页
c语言指针教程.pptx_第4页
c语言指针教程.pptx_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

第九章指针,指针是C语言中的一个重要概念,也是C语言的一个重要特征。使用指针可以使程序更加简洁、紧凑和高效。9.1指针和指针变量的概念9.2指针变量的定义和应用9.3数组的指针和9.4字符串的指针变量和9.5指向9.6指针数组的字符串函数和9.7函数的main()函数的参数指针和指针变量,9.1指针和指针变量的概念,1。内存地址-内存中存储单元的数量(1)在计算机硬件系统的内存中有许多存储单元(容量为1字节)。为了便于管理,每个存储单元都必须编号,该编号是存储单元的“地址”。每个存储单元具有唯一的地址。(2)在由地址标识的存储单元中存储数据。注意:存储单元的地址和存储单元中的数据是两个完全不同的概念。2.变量地址系统分配给变量的存储单元的起始地址,假设有这样一个程序:main() intnum;当使用scanf(%d )时,有两种方法来访问变量的num值:(1)直接访问-直接使用变量的地址来访问1) scanf (%d ,/*将3直接分配给变量num*/num_pointer=/*将3分配给指针变量num_pointer */return所指向的变量,定义并应用9.2指针变量,定义9.2.1指针变量及相关操作case 9.1指针变量定义及相关操作示例。/*案例代码文件名:al9 _ 1.c */main () intnum _ int=12,* p _ int/*定义指针变量p_int*/floatnum_f=3.14,*p_f到int数据;/*定义指针变量p_f*/charnum_ch=p ,*p_ch来浮动数据;/*定义一个指向字符型数据的指针变量p_ch*/p_int=程序演示。程序运行结果:NUM _ INT=12,* P _ INT=12NUM _ F=3.14,* P _ F=3.14NUM _ CH=P,* P _ CH=P程序描述:(1)与一般变量的定义相比,前三行中变量-指针变量的定义与数据类型*指针变量,*指针变量2的定义相同, 除了变量名前的星号“*”(指针变量的定义标识符)注意:指针变量p_int、p_f、p_ch此时不指向特定的变量(指针被称为浮动的)。 使用挂起的指针很容易破坏系统,导致系统瘫痪。(2)中间三行的赋值语句取地址操作(&)取地址操作的格式:& variables,例如,int*num1_p= program演示,程序操作:inputheifirst number :9;inputheisecond number :6num 1=9,num 2=6 min=6,Max=9 Program Description: (1)如果第5行的if语句为*num1_p*num2_p(即num1num2)(2)printf(“最小值=%d,最大值=%dn”,*num1_p,* num 2 _ p);语句:通过指针变量间接访问变量值。这种情况下的处理思想是交换指针变量num1_p和num2_p的值,而不是变量num1和num2的值(变量num1和num2没有被交换,但是原始值仍然保持),最后通过指针变量输出处理结果。9.2.2指针变量作为函数参数1。指针变量既可以用作函数的形式参数,也可以用作函数的实际参数。2.当指针变量被用作实际参数时,它也是一种“值传递”,即指针变量的值(地址)被传递给被调用函数的形式参数(它必须是指针变量)。注意:被调用的函数不能改变参数指针变量的值,但是它可以改变参数指针变量所指向的变量的值。案例9.3用函数调用方法重写案例9.2,要求参数是指针变量。/*案例代码文件名:AL9 _ 3 . c */* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *交换()函数:交换2个参数指针变量*/*参数指向的变量的值:2。两者都是指向整数数据的指针变量*/*返回值:无*/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *temp=*pointer1,*pointer1=*pointer2,* pointer2=temp/*主功能main()*/main()intnum1,num2/*定义并初始化指针变量num1_p和Num2 _ p */int * Num1 _ p=,printf(“InputtheFirstNumber :”);scanf(%d ,num 1 _ p);printf( Inputthesecondnumber : );scanf(%d ,num 2 _ p);printf(“num1=% d,num2=%dn”,num 1,num 2);如果(*num1_p*num2_p)/*即num 1 num 2)*/交换(num1_p,num 2 _ p);/*指针变量作为参数*/*输出num1和num2 */printf的排序值(“min=% d,max=% d n”,num 1,num 2);程序演示程序操作:InputtheFirstNumBer :9;InputtheSecondNumBer :6Num 1=9,Num2=6 min=6,Max=9,调用函数交换之前、之时、之时和之后(),如图9-5所示。参数指针变量pointer1(指向变量num1)和pointer2(指向变量num2)在函数调用开始时分配存储空间,并在函数调用完成后立即释放。尽管被调用的函数不能更改参数指针变量的值,但它可以更改它们所指向的变量的值。摘要:为了使用被调用函数改变的变量值,指针(或指针变量)应该用作函数参数。机制是:当被调用的函数被执行时,参数指针变量所指向的变量的值发生变化;函数调用完成后,通过常量参数指针(或参数指针变量)保留更改后的值。案例9.4输入3个整数,并按降序(从大到小)输出。需要使用变量的指针作为函数调用的参数。/*案例代码文件名:AL9 _ 4 . c */* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *交换()函数:交换2个参数指针变量*/*参数指向的变量的值:2。两者都是指向整数数据的指针变量*/*返回值:无*/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *temp=*pointer1,*pointer1=*pointer2,* pointer2=temp,/* main function main()*/main() int num 1,num 2,num 3;/*从键盘输入3个整数*/printf( InputtheFirstNumber : );Scanf (%d ,程序演示,程序操作:InputtheFirstNumber :9;InputtheSecondNumber :6;InputThethirdNumber 333612;Num 1=9,Num2=6,Num3=12排序结果333612,9,6返回,指向数组的9.3指针和指向数组的指针变量,9.3.1概述1。指向概念数组的指针-内存中数组的起始地址,指向数组元素的指针-内存中数组元素的起始地址。2.指向数组的指针变量的定义与指向公共变量的指针变量的定义相同。例如,在数组10,*指针=数组(或者注意:数组名表示数组在内存中的起始地址(与第一个元素的地址相同),因此指针变量可以用数组名来赋值。对数组元素的引用对数组元素的引用可以是下标或指针。采用下标法,直观;但是,使用指针方法可以使目标程序占用更少的内存,运行更快。9.3.2如果存在“数组10,*指针=数组”对于指针引用的数组元素,那么:(1)指针I和数组I都是数组元素数组i的地址,如图9-6所示。(2)*(指针I)和* (arrayli)是数组元素数组i。(3)指向数组的指针变量也可以看作数组名,因此可以用下标方法来使用。例如,指针i相当于*(指针I)。注意:指针1指向数组的下一个元素,而不是简单地使指针变量指针的值为1。实际的变化是指针1 *大小(大小是一个元素占用的字节数)。例如,假设指针变量指针的当前值是3000,指针1是3000 1*2=3002而不是3001。案例9.5使用指向数组的指针变量来引用数组元素。/*案例代码文件名:AL9 _ 5.c */*程序函数:使用指针变量引用数组元素*/Main () INTARRAY 10,*指针=数组,I;printf(“输入10数字3360”);对于(I=0;i10i )scanf(%d ,指针I);/*使用指针变量输入数组元素*/printf(“数组10 :”)的值;对于(I=0;i10i )printf(%d ,*(指针I);/*使用指向数组的指针变量输出数组*/printf( n );程序演示程序操作:输入10个数字:123456789 数组10 :123456789,程序描述:程序中第3行和第6行的2个for语句相当于以下程序段:for(I=0;i10I,指针)scanf(“% d”,指针);printf(“array10:”);指针=数组;/*导致指针重定向到数组*/的第一个元素(I=0;i10I,指针)printf(%d ,*指针);(1)如果“指针=数组”被删除,那么程序将如何运行?请在电脑上验证一下。(2)在这种情况下,我不能用作回路控制变量。如何修改程序?提示:指针可以参与关系操作。(1)指针变量的值是可以改变的,所以我们必须注意它的当前值,否则很容易出错。(2)指向数组的指针变量可以指向数组后的存储单元,尽管没有实际意义。(3)对指向数组的指针变量(px和py)执行算术运算和关系运算的含义1)只能执行以下类型的算术运算:PXN、PX/PX、PX-/-PX、PX-PYPXN:将指针从当前位置向前(n)或向后(-n)n个数据单元,而不是n个字节。显然,px/px和px-/-px是pxn (n=1)的特例。Px-py:两个指针之间的数据量,而不是指针地址之间的差异。(2)关系操作指示由两个指针指示的地址和位置之间的上下文:前者小,后者大。例如,如果指针px指向的地址在指针py指向的地址之前,则px py的值为1。9.3.3当将数组作为函数参数数组作为形式参数讨论时,接收参数数组的起始地址;作为参数,数组的起始地址被传递给形状参数组。在引入指向数组的指针变量之后,数组和指向数组的指针变量可以有四种等价形式(基本上是一种,即指针数据用作函数参数):(1)数组名(2)用于形式参数和实参数,指针变量(3)用于形式参数,数组名(4)用于实参数,数组名用于实参数,指针变量用于实参数, 9.3.42维数组的指针和1.2维数组的指针假定以下数组定义语句:intarray34 (1)从2维数组的角度来看,数组名array表示数组的起始地址,并且是由行单位控制的行指针:array i:行指针值,指向2维数组的第I行。 *(数组I):(列)指针值,指向行I,列0(控制从一行到另一列,但仍然是指针)。* (* (arrayli):数组元素数组i0 0的值。使用数组作为指针访问数组元素数组ij格式:* (*(数组I) j)注意:行指针是二级指针,如图9-7所示。(2)从一维数组的角度来看,数组名array的每个值和一维下标一起形成一组新的一维数组名array0,array1,array2,它们都由4个元素组成。语言C规定数组名代表数组的地址,所以数组i是第一行一维数组的地址,它指向该行第0列的元素,并且是由数组元素单位控制的列指针:数组i

温馨提示

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

评论

0/150

提交评论