资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,第7章 指 针,C语言大学实用教程,1,第7章 指 针C语言大学实用教程1,内容提要,指针的概念,数组的下标法引用和指针法引用,利用指针数组对各个字符串进行排序,存取等操作,带参数的,main(),函数,内容提要指针的概念,指针概述,指针的概念,一、什么是变量的地址,什么是变量的内容?,每个变量在内存中都占有一定字节数目的存储单元,,C,编译程序在对程序编译时,根据程序中定义的变量的类型,在内存中为其分配相应字节数目的存储空间。,变量在内存中所占存储空间的首地址,就称为该变量的地址(,address).,变量在内存中所占存储单元中存放的数据,就称为变量的内容(,content)。,指针概述指针的概念,直接寻址 间接寻址,指针变量 专门存放地址型数据的变量,运算符&和*的使用,&(*,p1)/*,该表达式的值代表的是变量,a,的地址*/,*(&,a)/*,该表达式引用的是变量,a,的内,容*/,直接寻址 间接寻址,引入指针的原因,为函数提供修改变量值的手段,指针为,C,的动态内存分配系统提供支持,指针为动态数据结构提供支持,指针可以改善某些子程序的效率,例:任意从键盘输入两个整数,然后将交换后的数据重新输出。,C语言指针应用课件,#include,void swap(int x,int y);,main(),int a,b;,printf(“Please enter a,b:”);,scanf(“%d,%d”,printf(“Before swap:a=%d,b=%dn”,a,b);,swap(a,b);,printf(“After swap:a=%d,b=%dn”,a,b);,void swap(int x,int y),int temp;,temp=x;x=y;y=temp;,仔细分析,是否成功交换?,#include仔细分析,是否成功交换?,变量的指针作为函数参数,变量指针 指针变量,变量的指针就是变量的地址,,指针变量就是,C,语言中专门用于存放地址型数据的变量,指针变量的定义,类型关键字 *指针变量名;,例:1),int*p1,*p2;,2)int a,b;,int*p1=,变量的指针作为函数参数变量指针 指针变量,指针变量的运算,1)指针变量的内容只能是地址,而不能是数据,必须用相同基类型的变量的地址对其进行赋值;,2)指针变量必须经初始化后才能使用,否则指针变量所指向的存储单元是不确定的,对其所作的赋值等操作将是很危险的。,3)由于指针的值就是地址,指针运算实质上就是对地址的运算。,指针运算只能参与赋值运算、算术运算和关系运算。其中,指针可参与的算术运算值有两种:加和减,即加、减一个整数或自增、自减运算。,指针变量的运算,分析,:,a=*p+;,a=*p;p=p+1;,a=(*p)+;,a=*p;*p=*p+1;,分析:,重新解决问题,#include,void swap(int*x,int *y);,main(),int a,b;,printf(“Please enter a,b:”);,scanf(“%d,%d”,printf(“Before swap:a=%d,b=%dn”,a,b);,swap(,printf(“After swap:a=%d,b=%dn”,a,b);,void swap(int *x,int*y),int temp;,temp=*x;*x=*y;*y=temp;,重新解决问题#include,字符指针作函数参数,字符数组与字符指针的不同,1)定义方法不同;,char str10;,定义的是一个字符数组,而,char*ptr;,定义的是一个字符指针。,2)初始化含义不同;,char str10=“China”;,char*ptr=”China”;,字符指针作函数参数 字符数组与字符指针的不同,3)赋值方法和含义不同;,指针变量可以用如下方式赋值:,char*ptr;,ptr=”China”;/*,正确*/,char str10;,str=”China”;/*,错误*/,strcpy(str,”China”);,3)赋值方法和含义不同;,4)输入字符串时略有不同。,用,scanf,语句输入字符串到数组中,用,char str10;,scanf(“%s”,str);,而用字符指针输入字符串时,必须确保字符指针,事先已指向了一个数组的首地址,即,char str10,*ptr;,ptr=str;,scanf(“%s”,ptr);/*,正确*/,而,char*ptr;,scanf(“%s”,ptr);/*,错误*/,4)输入字符串时略有不同。,5)字符数组的数组名是一个地址常量,它的值是不能改变的,而字符指针是一个变量,它的值是可以改变的。,for(ptr=str;*ptr!=0;ptr+)printf(“%c”,*ptr);,5)字符数组的数组名是一个地址常量,它的值是不能改变的,而字,指针和数组间的关系,一维数组的地址和指针,数组的指针:指数组的起始地址。,指向数组的指针变量:,int a9;,int p;,p=(,或,p=a;),通过指针引用数组元素,main(),int a10,*p;,for(p=a;pa+10;p+),scanf(“%d”,p);,for(p=a;pa+10;p+),printf(“%d”,*p);,可有五种引用数组元素的方法,指针和数组间的关系,二维数组的地址和指针,行地址和列地址,1),aij,2)*(ai+j),3)*(*(a+i)+j),4)(*(a+i)j,行指针和列指针,定义行指针,:,类型 (*行指针名,),常量,n,定义列指针:,int*p;(,例题),二维数组的地址,指针数组,指针数组:,类型名*数组名数组长度,如:,int*p4;,指针数组指针数组:,例题:,编程将若干字符串按字母顺序由小到大排序后输出。,#,include,#include,main(),int i,j;,char*temp;,char ptr5=“Pascal”,”Basic”,”Fortran”,”Java”,”Visual C”;,printf(“Before sorted:n”);,for(i=0;i5;i+)puts(ptri);/*,输出排序前,的5个字符串*/,例题:,for(i=0;i4;i+)/*,交换法排序*/,for(j=i+1;j5;j+),if(strcmp(ptrj,ptri)0)/*,若,字符串小于,ptri,所指字符串*/,temp=ptri;/*,则交换指针变量,ptrj,和,ptri,的指向*/,ptri=ptrj;,ptrj=temp;,printf(“After sorted:n”);,for(i=0;i5;i+)puts(ptri);,/*,输出排序后的5个字符串*/,for(i=0;i1),printf(“The other arguments is following:n”);,for(i=1;iargc;i+),printf(“%sn”,argvi);,下面的程序用于演示命令行参数与main函数各形参之间的关系。,运行程序,假定上面程序的文件名是,echo.c,,则在程序成功编译和,连接后(编译连接后的程序名为,echo.exe),,我们可按,如下命令行方式运行这个程序:,echo programming is fun,则程序将显示结果如下:,The number of command line arguments is:4,The program name is:echo.exe,The other arguments is following:,programming,is,fun,运行程序假定上面程序的文件名是echo.c,则在程序成功编译,
展开阅读全文