您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 工作计划 > 清华大学C语言教程第10章
C语言程序设计基础教程第十章指针第一节概述第二节数组与指针第三节函数与指针第四节字符串与指针第五节指针数组与指向指针的指针第六节程序举例本章小结习题十C语言程序设计基础教程一般情况下,计算机在执行C程序时,60%~70%的时间都是用于寻找地址。为了减少寻址时间,引入了指针变量,通过指针变量可以直接对内存中的不同数据进行快速处理。第一节概述C语言程序设计基础教程一、指针的基本概念从某种角度讲,指针就是地址。在介绍指针之前,先了解以下几个概念:(1)直接访问:通过变量名访问数据的方式称为数据的直接访问。C语言程序设计基础教程例如:intn;scanf(“%d”,&n);/*系统将输入的整型数据送到内存变量n的地址中*/printf(“%d\n”,n);/*通过访问变量n输出该整型数据*/(2)间接访问:如果将变量p的地址存放到另一个变量q中,通过访问变量q达到间接访问变量p的目的,这种访问方式称为间接访问。C语言程序设计基础教程例如:intn,*p;/*定义整型变量n和指针变量p*/scanf(“%d”,&n);/*系统将输入的整型数据送到内存变量n的地址中*/p=&n;/*将变量n的地址赋给指针变量p*/printf(“%d\n”,*p);/*通过访问指针变量p输出整型数据n*/C语言程序设计基础教程(3)指针:指针是一种数据类型,它是一个变量在内存中所对应的单元地址。在计算机中,系统为每个数据都分配一个存储单元,每个存储单元对应着一个存储地址,用户可以通过地址找到存储单元所在的位置,从而获取该存储单元中的数据,在C语言中,此过程称为指针。C语言程序设计基础教程(4)指针变量:指针变量是存储另一个变量地址的变量,即存放地址的变量。当定义某个变量后,系统将根据数据类型在内存中为其分配一个相应大小的存储单元,因而使用指针在变量与对应的存储单元地址之间建立联系,即可通过指针的相关操作来实现对变量的访问。因此,变量指针就是变量的地址,存放变量地址的变量称为指针变量。C语言程序设计基础教程二、指针的引用和运算在实际应用中,对指针操作有两种方式,即对指针变量赋初值和利用指针间接访问变量。由于指针是一种存放变量地址的特殊变量,因而对其初始化的方法是把变量的地址赋给指针变量名。在C语言中,变量在内存中是以具体的地址形式存放的,可以使用取地址运算符“&”获得变量在内存中的地址。一般情况下,指针变量的赋值格式如下:C语言程序设计基础教程指针变量名=&所指向的变量名;例如,把整型数据10赋给指向整型变量的指针变量a。int*a;intb=10;a=&b;指针变量在使用前必须先定义,其定义的一般格式如下:C语言程序设计基础教程指针类型*指针变量名其中,指针类型表示指针所指向的变量中存放数据的类型;指针变量名是指针的名称,它的命名遵循标识符命名规则;“*”是指针标识符,仅起到一个标识作用,用于说明定义的变量为指针变量,它可以靠近定义中任何一个部分。C语言程序设计基础教程例如,定义一个指向整型变量的指针变量a。int*a;或int*a;或int*a;三、指针变量的初始化在使用指针变量前,首先要对其进行初始化,使指针变量指向一个具体的变量。一般情况下,指针变量的初始化分为以下两种形式:C语言程序设计基础教程(1)使用赋值语句进行指针初始化。例如:inta,*p;/*定义一个整型变量a和一个指针变量p*/p=&a;/*将变量a的地址赋给指针变量p*/C语言程序设计基础教程(2)在定义指针变量时进行初始化。例如:inta*p=&a;/*在定义指针变量p的同时,把整型变量a的地址赋给它*/当指针变量定义和赋值后,引用变量时可以用变量名直接引用,也可以通过指向变量的指针间接引用。C语言程序设计基础教程例10.1指针变量实例。程序#includestdio.hmain(){intnum1,num2;int*num3,*num4;printf(“num1=”);scanf(%d,&num1);C语言程序设计基础教程printf(“num2=”);scanf(“%d”,&num2);num3=&num1;num4=&num2;printf(“num1=%d\t\tnum2=%d\n”,num1,num2);printf(“num3=%d\tnum4=%d\n”,num3,num4);printf(num3=%d\t\tnum4=%d\n,*num3,*num4);C语言程序设计基础教程}输入num1=22↙num2=12↙输出C语言程序设计基础教程分析本程序首先获取从键盘输入的两个整型数据num1和num2,然后将它们的地址分别赋给指针变量num3和num4。在输出指向整型数据的指针变量时,应使用指针标识符“*”。C语言程序设计基础教程例10.2比较两个数的大小,并按从小到大的顺序输出。程序#includestdio.hmain(){int*num1,*num2,t,a,b;printf(“Inputtwonumbers:\n”);printf(“a=”);scanf(%d,&a);C语言程序设计基础教程printf(“b=”);scanf(“%d”,&b);num1=&a;num2=&b;if(ab){C语言程序设计基础教程t=*num1;*num1=*num2;*num2=t;}printf(“Theorderfromsmalltobigis\n”);printf(“%d\t%d\n”,a,b);printf(“min=%d\tmax=%d\n”,*num1,*num2);}C语言程序设计基础教程输入Inputtwonumbers:a=12↙b=8↙输出C语言程序设计基础教程分析本程序中,首先输入a=12,b=8,由于ab,因此将num1与num2通过t进行交换,具体交换情况如图10.1.1所示。图10.1.1指向整型数据的指针变量与整型变量的关系C语言程序设计基础教程实际上,a和b并未进行交换,只是改变了num1和num2的值。num1的原值为&a,交换后变成&b;num2的原值为&b,交换后变成&a。所以在输出*num1和*num2时,实际上是输出变量b和a的值,不是交换整型变量的值,而是交换两个指针变量的值。C语言程序设计基础教程在C语言中,凡是由数组下标完成的操作都可用指针来实现,因而指针与数组有着紧密的联系。一、指向数组元素的指针指针变量不仅可以指向基本数据类型(整型数据、字符型数据等)变量,也可以指向数组中的元素。定义一个指向数组元素指针变量的方法,与定义指向变量的指针变量相同。第二节数组与指针C语言程序设计基础教程例如:intarray[10];int*p;p=&array[0];等价于intarray[10],*p;p=array;C语言程序设计基础教程首先定义了一个一维整型数组array和一个指向整型变量的指针变量p,然后把该数组的首地址array[0]赋给指针变量p,通过赋值语句“p=&array[0]”或“p=array;”把数组与指针联系起来,如图10.2.1所示。array[0]array[1]array[2]array[3]array[4]array[8]array[9]……arrayp图10.2.1指针变量与数组元素的关系C语言程序设计基础教程在C语言中,如果某个指针变量p指向数组中的一个元素,则p+1指向该数组中的下一个元素。例如,一个整型数组变量a和一个指向整型变量的指针变量p,a中每个元素占两个字节,p指向a[i],则p+1指向p的值(某个确定的地址)加两个字节后所指的元素,如图10.2.2所示。C语言程序设计基础教程pa[i]p+1a[i+1]a[i+6]p+62个字节图10.2.2指针变量与数组元素的关系C语言程序设计基础教程如果p的初始值是&a[0],那么(1)p+i和a+i就是数组a[i]的地址,即数组a中第i个元素的地址。例如,p+5就是数组a中的第5个元素(即a[4])的地址。(2)*(p+i)和*(a+i)是数组a[i]所指向元素的值。例如,*(p+5)就是数组中第5个元素(即a[4])的值。(3)指向数组的指针变量还可以带下标。例如,p[5]与*(p+5)等价。C语言程序设计基础教程综上所述,引用某个数组的元素可以通过以下两种方法实现:(1)下标法:在数组中可以通过下标确定某个数组元素在数组中的顺序和存储地址。(2)指针法:由于指针变量可以指向普通变量,而每个数组元素相当于一个变量,因此指针变量同样可以指向数组中的元素。C语言程序设计基础教程例10.3随机产生一个一维数组,输出该数组的全部元素。(1)下标法。程序#includestdio.h#includetime.h#includestdlib.hmain()C语言程序设计基础教程{inti,a[10];srand(time(NULL));for(i=0;i10;i++)a[i]=rand()%100;printf(Thearrayis);for(i=0;i10;i++){C语言程序设计基础教程if(i%5==0)printf(“\n”);printf(“%3d”,a[i]);}}输出C语言程序设计基础教程(2)用数组名实现的指针法。程序#includestdio.h#includetime.h#includestdlib.hmain(){inti,a[10];C语言程序设计基础教程srand(time(NULL));for(i=0;i10;i++)a[i]=rand()%100;printf(“Thearrayis”);for(i=0;i10;i++){C语言程序设计基础教程if(i%5==0)printf(“\n”);printf(“%3d”,*(a+i));}}输出C语言程序设计基础教程(3)用指针变量实现的指针法。程序#includestdio.h#includetime.h#includestdlib.hmain(){inti,a[10],*p;srand(time(NULL));C语言程序设计基础教程for(i=0;i10;i++)a[i]=rand()%100;printf(Thearrayis);for(p=a,i=0;p(a+10);p++,i++){if(i%5==0)printf(“\n”);printf(“%3d”,*p);C语言程序设计基础教程}}输出注意:使用指针变量时,应注意以下几点:(1)指针变量的值可以改变。例如,上述方法(3)中用指针变量p来指向元素,用p++将p的值不断更新。C语言程序设计基础教程(2)要注意指针变量p的当前值。例如,上述方法(3)中指针p在第一次循环中指向数组a的第一个元素,在第二次循环中指向数组a的第二个元素,…,在第十次循环中指向该数组的末尾值。(3)在使用指针变量指向数组元素时,应确保指向数组中有效的元素。例如,*(p+11)这种表示法是不合法的。(4)应注意指针变量的运算。C语言程序设计基础教程在C语言中,常见的指针运算如下:(1)指针的加减运算。可以用指针变量进行加减运算,控制指针变量指向数组中的其他元素,有以下两种基本形式:1)p++(p--):使指针从当前位置向后(向前)移动一个元素地址,此时指针的指向已经发生了改变。2)p+i(p-i):实现对当前指针之后(之前)第i个元素地址的访问,此时指针的指向并未改变。C语言程序设计基础教程(2)指针变量赋值。将一个变量地址赋给一个指针变量。例如:p=&a;/*把变量a的地址赋给p*/p=array;/*把数组array首地址赋给p*/p=&array[i];/*把数组array第i个元素的地址赋给p*/p1=p2;/*把p2的值赋给p1*/C语言程序设计基础教程注意:不能把一个整数赋给指针变量,例如,“p=10;”是不合法的。(3)两个指针变量相减。如果两个指针变量都指向同一个数组元素,那么这两个指针变量值之差就是两个指针之间的元素个数。例如,p1和p
本文标题:清华大学C语言教程第10章
链接地址:https://www.777doc.com/doc-3635640 .html