《二级C第10章指针》由会员分享,可在线阅读,更多相关《二级C第10章指针(74页珍藏版)》请在金锄头文库上搜索。
1、 教学内容:11.1 指针的概念11.2 指针和变量11.3 指针和数组11.4 字符串和指针变量11.5 函数和指针11.6 指针数组和指向指针变量的指针 第11章 指 针教学要求:1.掌握指针的定义方法和引用方法 。 2.掌握指针的运算方法。3.掌握指针与数组的综合应用程序设计方法。4.掌握指针与字符串处理的程序设计方法。5.了解指针在函数中的应用。第11章 指 针指针是语言中的重要概念,也是语言的重要特色。使用指针,可以很好地利用内存资源,使其发挥最大的效率;使用指针,可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁、高效。 11.1 指针的概念1.
2、内存地址 (1)计算机硬件系统的内存储器中,拥有大量的存储单元,一个字节为一个存储单元,容量为字节。内存是按字节连续编号的,每一个存储单元编号就是存储单元的“地址”。 每个存储单元都有一个惟一的地址。(2)在地址所标识的存储单元中存放数据。注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。2.变量地址 系统分配给变量的内存单元的起始地址。 设有如下一个程序: main() int n;scanf(“%d“, printf(“n=%dn“, n); 变量n地址3000设系统分配给变量 n 的2字节存储单元为 3000 和 3001,则起始地址 3000 就是变量 n 在内存中的地址。C
3、编译程序编译到该变量定义语句时,将变量n 登录 到“符号表”中。符号表的关键属性有两个:一是“标识符名(id)” ,二是该标识符在内存空间中的“地址(addr)” 。3. 指针指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的三个方面的内容:(1)指针的类型(2)指针变量 (3)指针的值或者叫指针所指向的内存区。 4. 指针的类型指针也是有类型的,它的类型就是它所指向的对象(如变量、数组、函数等)的类型,一般在定义指针时指定其类型。5. 指针的值指针的值,或者叫指针所指向的内存区或地址。 指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,
4、而不是一个一般的数值。6.存取变量值的方式 (1)直接访问直接利用变量的地址进行存取1) scanf(“%d”, p2=p1是指向整型变量的指针变量,p2是指向字符型变量的指针变量 *p1和 *p2是p1和p2所指向的变量 a 和h 。 p1不能指向字符变量h。int a ,*p ; p = *p=5;(1) 后,则下列表示是等价的:对象:a= =*p=* 的作用是 p1= (5)(*p )+ 等价于a+。(6) i=3; p= 将一个指针变量赋给另一个同类型的指针变量。int i , pi , pj ;pi=pj=pi ;作用是使 pi , pj 都指向变量 i。piipjb. pi=0 c
5、. pi=0 在定义一个变量时,将变量的指针(即地址) 直接赋给指针变量:int x, p=8. 指针变量的运算 指针变量可以进行加法或减法运算,运算时将指针变量里存放的地址加上或减去它指向变量存储单元的大小。在Turbo C系统中,int为2字节,float为4字节,char为1字节 。 9. 指针变量作为函数参数指针变量既可以作为函数的形参,也可以作函数的实参。指针变量作实参时,将指针变量的值(一个地址)传递给被调用函数的形参,形参必须是一个指针变量。 例11.1 指针与变量的关系 #include main() int x=10, *p;float y=234.5, *pf;p= pf=
6、printf( “p=%lu,pf=%lun“ , p, pf);*p=*p+10; *pf=*pf+123.4;printf(“-n“);printf( “x=%d,y=%fn“, x, y);例11.2有问题的程序。指针变量在未赋值前指向一个不定值#include main()int *p, *s, a;a=*p+*s;printf(“a=%dn*p=%lun“,a,p);printf(“*s=%lu“,s); p, s 没有指向 对象例11.3main( )int *p1,*p2,*p,a,b;scanf(“%d,%d”,p1= p2=if (a main( ) char str130,
7、 str220;char *ptr1=str1, *ptr2=str2;gets(str2); /* 输入str2*/while(*ptr2!=”0”)*ptr1+=*ptr2+; / *字符串复制* /printf(“%s.%sn“, str1, str2);例11.15求字符串的长度,用指针变量作函数参数#include int getlength(char *str) char *p=str;while(*p!=0)p+;return p-str;main() char *string=“I am a student“;printf(“The length of “%s“, string
8、); printf(“ “ is %d “ , getlength(string) ); 例11.16字符串的复制,实参、形参都是字符指针变量void scopy( char *from , char *to ) for ( ; *from != 0; from+; to+)*to = *from ; *to = 0;main( ) char *a= “I am a teacher.”;char *b= “you are a student.”;scopy( a, b );printf( “string_a = %snstring_b = %sn”,a,b) ;先判断 后复制 例11.17字符
9、串的复制,数组名作实参,形参指针变量。void scopy(char *sfrom, char *sto) int i=0;for( ; (*(sto+i )=*(sfrom+i )!=0; i+) ; main() char astr120=”I am a teacher.”;char astr220;scopy(astr1, astr2); printf(“astr2=%sn”, astr2); 先复制、 后判断11.5 函 数 和 指 针1.函数指针的概念一个函数在编译时,被分配了一个入口地址,这个 地址就称为该函数的指针。 可以用一个指针变量指向一个函数,然后通过该指针 变量调用此函数
10、。2.指向函数的指针变量(1)定义格式函数类型 (*指针变量) ( );注意:“*指针变量”外的括号不能缺,否则成了返回 指针值的函数。例如,int (*fp) ( ); /* fp为指向int函数的指针变量*/(2)可用函数名给指向函数的指针变量赋值:指向函数的指针变量 = 函数名; 函数名代表该函数的入口地址。注意:函数名后不能带括号和参数;函数名前的“Long int t=0;for(i = 1; i int max(int a,int b) return ab?a:b; int min(int a,int b) return a0 ) min=j; /*保存之*/if ( min!=i
11、) /*存在更小的串,交换位置*/ p=namei; namei=namemin;namemin= p; 3.指向指针的指针变量(两级指针变量)例如,数组name是一个字符指针数组,即数组的每一个元素都是一个指向字符串的指针。既然name是一个数组,则它的每一个元素也同样有相应的地址,因此可以设置一个指针变量pa,使其指向指针数组的元素(元素的值还是一个指针),称pa为指向指针的指针变量。4. 指向指针的指针变量的定义数据类型 *指针变量 , *指针变量2; 指向指针数据的指针变量称为指向指针的指针。 例如: int *p;运算符的结合性是从右至左,*p相当于*(*p)。5. 指向指针的指针变
12、量的赋值指针变量 = 指针数组名 + i | int *k , *p;k= p=P k achar * p;int i;for (i=0; i 可执行文件名 串1串2 串n 表示空格符可执行文件名字符串字符串1字符串2字符串nargv0argv1argv2argvnargv此时形参 argc=n+1 其中可执行文件名 也视为一个参数。例 11.23 main()函数的参数应用 #include main ( int argc, char *argv, char *env) int i;printf(“argc=%dn“, argc);for(i=0;iargc;i+)printf(“argv%
13、d=%sn“,i,argvi);for(i=0;envi!=NULL;i+)printf(“env%d=%sn“,i,envi); 指 针针 类类 型定 义义 形 式备备 注指向变变量的指针变针变 量int *p;void *p ;void 类类型的指针变针变 量可以指向 任意类类型的数据。在将它赋给赋给 另一指针变针变 量时时,须进须进 行强制 类类型转换转换 。指向数组组元素的指针变针变 量int a10 ,b34; int*p=a, *q=b;指向字符串的指针变针变 量char *p=“Beijing”;将字符串数组组的首地址赋给赋给 p指向一维维数组组的指针变针变 量int (*p)4;指针针数组组int *p4;指向指针针的指针针int *p;指向函数的指针变针变 量int (*p)( );P 指向一个函数。 该该函数返回的值为值为 整型。返回指针值针值 的函数int *p(x,y)函数 p 返回一整型数据的地址。p60402080*pp指针小结形 参 实 参传 值基本类型的变量名 可 计 值 的 表达式(包括常量、变量、函数调用 、数组元素、结构体成员)传地址 数 组 名数 组 名 或指向数组的指针变量传地址 指 针 变 量 名指 针 变 量 名 数 组 名变量的首地址传地址指向函数的指针变量 函 数 名 形 实 参 数 的 结 合 规 则