您好,欢迎访问三七文档
第6章指针第1章C语言概述第2章基本数据类型和运算第3章结构化程序设计第5章函数第6章指针第7章复合结构类型第8章编译预处理第4章数组及字符串●课程概述附录6.1指针的基本概念6.2指针变量的运算6.3指向数组元素的指针6.4指向多维数组的指针变量6.5指向字符串的指针变量6.6指针型函数6.7指针数组6.8二级指针6.9程序举例6.10用指针进行内存动态分配6.11指针数据类型的总结第9章位运算第10章文件指针第6章教学目标►掌握指针的概念和运算规则►掌握用指针访问变量、一维数组和二维数组►用指针处理字符串的方法6.1.1指针和指针变量6.1指针的基本概念1.指针的概念2.指针变量内存单元的编号叫做地址,通常也把这个地址称为“指针”。6.1.1指针和指针变量6.1指针的基本概念1.指针的概念2.指针变量在C语言中,允许用一个变量来存放指针,这种变量称为“指针变量”。6.1.2指针变量的定义1.定义的一般格式2.举例说明6.1指针的基本概念[存储类型]类型说明符*变量名;其中,“*”表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。一个指针变量只能指向同一种类型的变量,也就是说,不能定义一个既指向一个整型变量又指向一个双精度型变量的指针变量。6.1.2指针变量的定义1.定义的一般格式2.举例说明6.1指针的基本概念例如:int*m1;表示m1是一个指针变量,它的值是某个整型变量的地址;或者说m1指向一个整型变量。至于m1究竟指向哪一个整型变量,应该由指向m1赋予的地址来决定。再例如:staticint*m2;/*m2是指向静态整型变量的指针变量*/float*m3;/*m3是指向浮点型变量的指针变量*/char*m4;/*m4是指向字符型变量的指针变量*/6.1.3指针变量赋值1.变量地址表示方法2.给指针变量赋地址的方法C语言提供了地址运算符“&”,表示变量地址的一般形式为:&变量名;如:&a表示变量a的地址,&b表示变量b的地址。6.1指针的基本概念3.例6.16.1.3指针变量赋值1.变量地址表示方法(1)指针变量初始化的方法。inta;/*定义整型变量a*/int*p=&a;/*定义指针p,并将变量a的地址赋给指针p*/(2)赋值语句的方法。inta;/*定义整型变量a*/int*p;/*定义指针p*/p=&a;/*将变量a的地址赋给指针p*/6.1指针的基本概念2.给指针变量赋地址的方法3.例6.16.1.3指针变量赋值1.变量地址表示方法【例6.1】用指针变量访问变量中的数据。#includestdio.hmain(){inta,*p;/*定义整型变量a和整型变量指针p*/p=&a;/*指针p指向变量a*/printf(pleaseenteranumber:\n,*p);scanf(%d,p);/*为指针p所指的存储单元输入数值*/printf(%d\n,*p);/*输出指针p所指的存储单元的内容*/}6.1指针的基本概念2.给指针变量赋地址的方法3.例6.11501000ap10001001200020012.取内容运算符*3.注意事项取地址运算符“&”是单目运算符,其结合性为自右至左,功能是取变量的地址。在scanf函数中,我们已经认识并使用了&运算符。1.取地址运算符&6.2.1指针运算符6.2指针变量的运算2.取内容运算符*3.注意事项取内容运算符“*”是单目运算符,其结合性为自右至左,通过“*”可以存取指针所指的存储单元的内容。在“*”运算符之后跟的变量必须是指针变量。需要注意的是指针运算符“*”和指针变量说明中的指针说明符“*”不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符,用以表示指针变量所指的内容。1.取地址运算符&6.2.1指针运算符6.2指针变量的运算2.取内容运算符*3.注意事项【例6.2】分析下面程序的运行结果。#includestdio.hmain(){intd,x,*p;/*定义整型变量d、x和整型指针p*/d=10;x=19;p=&x;/*将变量x的地址赋给指针p*/printf(d=%d\n,*p);}1.取地址运算符&6.2.1指针运算符6.2指针变量的运算程序的运行结果如下:d=192.取内容运算符*3.注意事项(1)取地址运算符&表示变量的地址;而取内容运算符*表示指针所指的内容。(2)运算符&只能用于变量和数组元素。(3)*和&都是单目运算符,两者的优先级相同,结合性均是从右到左。(4)&x不能出现在赋值号的左边。(5),因此不能用&取寄存器变量的地址。(6)被赋值的指针变量前不能再加“*”说明符,如写为*p=&a也是错误的。1.取地址运算符&6.2.1指针运算符6.2指针变量的运算2.取内容运算符*3.注意事项【例6.3】通过指针变量访问字符型变量。#includestdio.hmain(){charch1,ch2;/*定义字符型变量ch1和ch2*/char*p1,*p2;/*定义字符型指针p1和p2*/ch1='A';ch2='B';p1=&ch1;/*指针p1指向变量ch1*/p2=&ch2;/*指针p2指向变量ch2*/printf(%c,%c\n,ch1,ch2);/*输出变量ch1和变量ch2的内容*/printf(%c,%c,*p1,*p2);/*输出指针p1和p2所指的存储单元的内容*/}1.取地址运算符&6.2.1指针运算符6.2指针变量的运算程序的运行结果为:A,BA,B&ch1&ch2P1P2ch1ch2(a)p1与ch1之间的关系(b)p2与ch2之间的关系2.指针中加减运算3.指针变量的关系运算(1)指针变量初始化赋值时,不要将一个内存地址常量赋给一指针变量。例如:inti=100,x;int*m;:m=&i;1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算(2)指针变量和一般变量一样,存放在其中的值是可以改变的,也就是说可以改变指针变量的指向,例如:inti,j;int*p1;int*p2;i='c';j='d';p1=&i;p2=&j;上面的程序语句也可以用下面的图来说明。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算赋值运算结果4.两指针变量相减2.指针中加减运算3.指针变量的关系运算如果此时有如下的赋值表达式:p2=p1;则指针变量p2与p1就指向了同一个对象i,此时的*p2就等价于i,而不再是j了,这种情况可以用如下的图来说明。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算p2=p1时的情形P1P24.两指针变量相减2.指针中加减运算3.指针变量的关系运算再例如,如果执行如下的表达式:*p2=*p1;则此时表示把p1指向的内容赋给p2所指的区域,此时可用下图来表示情形。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算*p2=*p1时的情形P1P24.两指针变量相减2.指针中加减运算3.指针变量的关系运算(3)如果需要,也可以把数组的首地址赋予指向数组的指针变量。例如:inta[8],*pa;pa=a;也可写为:pa=&a[0];也可采取如下初始化赋值的方法:inta[8],*pa=a;1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算(4)可以把字符串的首地址赋给指向字符类型的指针变量。例如,把字符串“Hellohuman”赋给指针变量p,方法如下:char*p;p=Hellohuman;或用初始化赋值的方法写为:char*p=Hellohuman;1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算对于指向数组的指针变量,可以给其加上或减去一个整数n。例如,设p是指向数组m的指针变量,则p+n,p-n,p++,++p,p--,--p都是合法的运算表达式。给指针变量加上或减去一个整数n表示把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算指向同一数组的两个指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:p1==p2;/*表示p1和p2指向同一数组元素*/p1p2;/*表示p1处于高地址位置*/p1p2;/*表示p2处于高地址位置*/1.赋值运算6.2.2指针变量的运算6.2指针变量的运算4.两指针变量相减2.指针中加减运算3.指针变量的关系运算4.两指针变量相减【例6.4】一个关于指针变量关系运算的例子。main(){intx,y,z,*max,*min;printf(pleaseinputthreenumbers:\n);scanf(%d,%d,%d,&x,&y,&z);if(xy)/*三个数进行大小比较*/{max=&x;min=&y;}else{max=&y;min=&x;}if(z*max)max=&z;if(z*min)min=&z;printf(themaxis:%d\ntheminis:%d\n,*max,*min);}1.赋值运算6.2.2指针变量的运算6.2指针变量的运算该程序的运行结果如下:pleaseinputthreenumbers:233465↙themaxis:65theminis:232.指针中加减运算4.两指针变量相减两指针变量也可以进行相减运算,其所得之差是:两个指针所指的数组元素之间相差的元素个数,实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。例如:p1和p2是指向同一整型数组的两个指针变量,设p1的值为1100H,p2的值为1050H,由于整型数组每个元素占2个字节,所以p1-p2的结果为(1100H-1050H)/2=25,因此“p1-p2”表示p1和p2之间相差25个元素。但是,p1和p2不能进行加法运算,因为指针变量相加是毫无意义的。1.赋值运算6.2.2指针变量的运算6.2指针变量的运算3.指针变量的关系运算2.数组指针变量的说明3.数组名和数组指针变量作函数参数第一,一个数组是由连续的一块内存单元组成的。其中的数组名就是这块连续内存单元的首地址。第二,一个数组也是由各个数组元素组成的。第三,数组元素的首地址也是指它所占有的几个内存单元的首地址。1.几个数组指针变量的关系6.3指向数组元素的指针2.数组指针变量的说明3.数组名和数组指针变量作函数参数数组指针变量说明的一般形式为:类型说明符*指针变量名;其中,“类型说明符”表示指针变量所指数组的类型;“*”表示其后的变量是指针变量。用数组指针变量访问数组元素有两种方法:第一种方法为下标法,即用m[i]形式访问数组元素。第二种方法为指针法,即采用*(pm+i)形式,该方法是用间接访问的方法来访问数组元素。1.几个数组指针变量的关系6.3指向数组元素的指针2.数组指针变量的说明3.数组名和数组指针变量作函数参数【例6.6】采用指针法访问数组元素。#includestdio.hmain(){intm[5],i,*pm;pm=m;for(i=0;i5;i++){*pm=i;pm++;}pm=m;for(i=0;i5;i++){printf(m[%d]=%d\n,i,*pm);pm++;}}1.几个数组指针变量的关系6.3指向数组元素的指针该程序的运行结果如下:m[0]=0m[1]=1m[2]=2m[3]=3m[4]=42.数组指针变量的说明3.数组名和数组指针变量作函数参数【例6.7】与例6.6的本意相同,但是其实现方式不同。#includestdio.hmain(){intm[5],i,*pm=m;for(i=0;i5;){*pm=i;printf(m[%d]=%d\n,
本文标题:C程序设计 第6章
链接地址:https://www.777doc.com/doc-7026377 .html