课件考点分析九指针

上传人:bin****86 文档编号:55275077 上传时间:2018-09-26 格式:PPT 页数:69 大小:273KB
返回 下载 相关 举报
课件考点分析九指针_第1页
第1页 / 共69页
课件考点分析九指针_第2页
第2页 / 共69页
课件考点分析九指针_第3页
第3页 / 共69页
课件考点分析九指针_第4页
第4页 / 共69页
课件考点分析九指针_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《课件考点分析九指针》由会员分享,可在线阅读,更多相关《课件考点分析九指针(69页珍藏版)》请在金锄头文库上搜索。

1、考点分析九,指针,1、地址和指针,考点1、变量的地址和指针变量的基本概念,机器的内存是以字节为单位的连续存储空间,每一个字节都有自己的编号,这些编号也是连续的。字节的编号就是 “地址”。当定义一个变量的时候, 编译系统会在内存中为变量分配存储空间,被分配的存储空间所对应的编号就是变量的地址。,在c语言中,不仅可以定义整型变量、实型变量、字符型变量等,还可以定义一种特殊的变量,专门用来存放其它变量的地址,我们将它称为指针变量,简称指针。,根据指针变量的值(这个值是一个地址),就可以访问其它的目标变量,*用来表示指针所指向的目标变量。,考点2、指针变量的定义和赋值,定义指针变量的一般形式是:数据类

2、型 * 指针变量名;说明:数据类型并不是指变量本身的类型,而是该变量所指向目标变量的类型。,例如: int * p1;char * p2;,p1,p2,这里存放的是一个整 型变量的地址。,这里存放的是一个字符型变量的地址,给指针赋值有三种方法: 1、使用地址运算符 &:,例如: int a =123;int * p1;p1=,2、将一个已具有具体指向的指针变量赋值给另一个指针变量。,接上例: int * p2;p2=p1;,说明:p1和p2同时指向变量a。,3、为指针赋空值。可以通过语句p=NULL为指针变量p赋空值。,考点3、通过指针变量引用存储单元,当指针中存放了地址值时,可以通过指针操作

3、该地址中的数据。,1、使用取地址运算符可以得到一个变量的地址: 例如:int a;int score10=80,95,90,65,75,70,70,80,98,43;,(1) &a, &score0 合法,(2) &score 非法,(3) &(a+5)非法,(4) &a=123;非法,2、使用*运算符,间接存取指针所指向的目标变量的值。,int a =123;int * p1; p1=,a=a+1;,*p1=321;,*p1=*p1+1;,a=321;,3、指针与整数相加减,指针与整数相加减表示指针的移动。,例如: p+n p-n p+ p- +p -p其中n是整数。,进行加法运算时,表示p

4、向地址增大的方向移动; 进行减法运算时,表示p向地址减小的方向移动。,移动的具体长度取决于指针的数据类型,由计算机自动确定。,设p是指向type(type代表类型关键字)类型的指针,n是整型表达式,则 pn 为一个新地址,其值为pnsizeof(type),即在p原有值的基础上增加或减少了nsizeof(type)字节。,4、两个同类型指针相减,两个同类型的指针可以相减。如果两个指针之间所指向的目标变量数据类型相同(通常是数组的情况),则相减的结果是这两个指针之间所包含的数据个数。显然,两个指针相加是无意义的。,注意:*与+、-运算符结合使用时,这两个运算符的优先级相同, 结合顺序是右结合性。

5、 因此,请区分+*p和*p+的运算顺序。,2、指针变量与函数,*考点4、指针变量作函数参数,在函数的参数传递中,一种叫做传值调用,发生传值调用时,主调函数把实参的值复制一份传送给被调函数的行参,从而实现主调函数向被调函数传送数据。但是行参的变化不会影响时参发生变化。,另一种叫传址调用,所谓地址调用就是在函数调用时,将实参数据的存储地址作为参数传递给行参。,传址调用的特点是:,行参和实参占用同样的内存单元,函数中对行参值的改变也会改变实参的值。因此,可实现主调函数与被调函数之间数据的双向传递。,注意:由于行参和实参都必须是地址,通常将行参定义为指针变量,当把变量的地址作为实参传递给行参指针时,指

6、针指向的变量就是实参变量,从而实现数据的双向传递。,例: 利用函数调用交换两个整型变量的值:,#include void main() void swap (int *x, int *y);int a=10,b=20; printf(“%d,%dn”,a,b); swap( ,void swap(int *x,int *y) int t;t=*x; *x=*y; *y=t; ,第一条printf语句输出10,20;第二条printf语句输出20,10。,考点5、指针作为函数返回值,在C语言里,允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式

7、为:,类型说明符 *函数名(行参表)函数体语句;,其中:函数名前加了一个*号,表明这是一个指针型函数,即返回值是一个指针。类型说明符表示该指针指向的数据类型。,考点6、指向函数的指针,C语言规定, 一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。可以给函数的这个首地址赋予一个指针变量,使该指针指向该函数。然后通过指针变量调用该函数。把这种指向函数的指针变量称为“函数指针变量”。,函数指针变量定义的一般形式为:,其中,类型说明符表示被指向函数的返回值类型,后面的参数表对应于被指向函数的行参。,类型说明符 (*指针变量名)(参数表);,例如:int (*pf)(int x)

8、;,这里定义了一个指向函数的指针变量pf,被指向函数的返回值是整型,并且被指向函数有一个整型行参。,3、指针变量与数组,*考点7、指向数组的指针,由于数组中各个元素的存储单元是连续分配的,因此,可以用指针访问数组,数组名就是该数组的首地址。,例如:int score10;,score就为该数组的首地址,它等价于&score0。,通过首地址,可以很方便的访问数组中的其它元素,方法如下:,首地址+偏移量;,例如:score+0,score+1,.score+i,它们分别表示数组中的第0个元素的地址、第1个元素的地址、第i个元素的地址、.,例如:用指针的方式输入字符串,统计其长度并输出字符串和它的长

9、度。,#include void main()char str30,*p;int n=0;p=str;scanf(“%s“,str);,while (*p!=0)n+;p+; printf(“%dn“,n); printf(“%s“,str); ,考点8、指针数组,1、指针数组的概念,指针数组也是数组,但它和一般的数组不同,其数组里面的元素值全部是其它变量的内存单元地址,即指针。并且,这些指针必须指向同一类型的变量。,2、指针数组的定义,数据类型 * 数组名 数组长度;,例如: char * p1 5;int * p2 6;,3、指针数组的使用,假设存在三个数组:char str1 =“Chi

10、na”;char str2 =“America”;char str3 =“German”;,那么可以用下面的语句定义指针数组并初始化:,char *p 3=str1,str2,str3;,指针数组p,p0,p1,p2,考点9、指向指针的指针变量,由于指针变量本身是一个变量,因此可以创建指向指针的指针双重指针变量,其值为一个指针变量的地址。,例如:,int a=123; int *p_a=,p_a是指向变量a的指针变量,p是指向变量p_a的指针变量,假设已经定义指针数组str。char *str 3=“China”,“America”,“German”;,指针数组str,很显然,str数组中的元

11、素值是某一个字符串的首地址,而数组str本身也占用内存空间,数组元素str0、str1、str2有其自身的地址,因此,可以利用指向指针的指针对字符串进行访问。,#include void main() char *str 3=“China“,“America“,“German“;char *p;int i;for (i=0;i3;i+)p=str+i;printf(“%sn“,*p);,例如:,考点10、命令行参数,在此前的例子中,main函数都没有参数。其实,在支持c语言的环境中,可以在运行c程序时,通过运行c程序的命令行把参数传递给c程序。main函数通常有两个参数,格式如下:,void

12、main(int argc, char *argv),第一个参数是int型,表示运行程序时命令行中参数的个数;第二个参数是指向char型数组的指针。C语言规定,argv0的值是调用该程序的程序名,因此argc的值至少为1,argv1argvargc-1中存放的是传递给main函数的参数。,例如:下列程序的功能是照原样输出命令行参数。将程序存放在myc.c中,编译连接后生成可执行文件myc.exe,,#include void main(int argc, char *argv) int i;for (i=0;iargc;i+)printf(“%s“,argvi);,如果在命令行中输入how a

13、re you程序输出 myc how are you,*考点11 二维数组的地址,对于二维数组中的元素aij,其地址有以下表示方法:,& aijai+j*(a+i)+j,引用数组元素aij也有下列表示方法: aij *(ai+j) *(*(a+i)+j),对于二维数组aNN来说,a是数组的首地址,a+0和a0是第0行元素的地址,a+1和a1是第1行元素的地址,4、动态存储分配,考点13、动态存储分配的基本概念,在程序执行需要存储数据时,得到指定的内存空间,使用完毕后,就将该空间释放,由系统另做它用,这种存储分配方式为动态存储分配。,考点14、mallco函数和free函数,1、malloc函数

14、,malloc(size)用于分配一个长度为size的连续内存空间,若分配成功,函数返回值为指向该内存空间首地址的指针,否则, 返回NULL。,使用举例:char *p1;struct slist *p2;p1=(char *)malloc(50);p2=(struct slist *)malloc(sizeof(struct slist);,2、free函数,free(p)函数用来释放由p指向的内存区。p是最近一次调用malloc函数或calloc函数时的返回值。,例题,1、设已有定义:float x;,则下列对指针变量 p 进行定义且赋初值的语句中正确的是 ( )。 A)float *p=

15、1024; B)int *p=(float)x; C)float p=,2、设有定义:int n1=0,n2,*p=,3、下列叙述中错误的是( ) 。 A)改变函数形参的值,不会改变对应实参的值 B)函数可以返回地址值 C)可以给指针变量赋一个整数作为地址值 D)当在程序的开头包含头文件 stdio.h 时,可以给指针变量赋 NULL,4、设有定义:int n1=0,n2,*p=,5、若有说明语句:double *p,a;则能通过 scanf语句正确给输入项读入数据的程序段是 ( )。 A)*p =,6、若有以下函数首部 int fun (double x10,int *n) 则下列针对此函数的函数声明语句中正确的是( )。 A)int fun(double x, int *n); B)int fun(double , int); C)int fun(double *x, int n); D)int fun(double *, int *);,7、有下列程序: #include main( ) int n,*p=NULL; *p=,8、有下列程序: main( ) int a=1, b=3,c=5,*p; int *p1= 执行后的输出结果是( )。 A)1 B)2 C)3 D)4,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > 其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号