C语言基础知识指针.ppt_第1页
C语言基础知识指针.ppt_第2页
C语言基础知识指针.ppt_第3页
C语言基础知识指针.ppt_第4页
C语言基础知识指针.ppt_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 指 针Pointer,6.1 指针的概念,指针是C语言的重要特征,是C语言访问内存数据和程序的灵活 和有效的手段。,C语言的指针支持: 函数的地址调用; 动态分配内存; 数组的地址引用。,内存、地址、指针 (Memory ,Address, Pointer),内存存放了计算机正在运行的程序和程序正在使用的数据。内 存的基本单元是字节(Byte)。,为了访问内存单元,CPU给每个内存单元一个编号,该编号称 为该内存单元的地址。,变量是程序中可以改变的量,当说 明变量时,系统将为其在内存中开辟相 应得内存单元。由此确定变量的地址及 内存中的表示方式。,2000H,2001H,2002H,2

2、003H,int a=0;,a 的 内 存 单 元,a的地址,标识符命名的指针变量名。,指针标志。,指针指向对象的类型。,int *p, *q; /* p、q是指向整型变量的指针。*/,float *pfValue ,*pf; /* pfValue和pf是指向浮点型的指针。*/,指针的引用,定义指针的目的是通过指针引用内存对象,指针的引用应按如 下步骤进行:,说明指针,int a=0, *p;,指针指向对象,p=,通过指针引用对象,*p=*p+2;,指针操作的两种运算:,取地址运算 ,2000H,a,p,p= /* p指向a。 */,2000H,*p=2;,2,举例:,#include voi

3、d main (void ) int x ,*p; x=55; p= ,2000H,x,p,2000H,55,65,关于指针的说明:,指针必须指向对象后,才能引用。,int *p; *p=2; /* Error! */, p= 则: p1=,a,2000H,b,2400H,p1,p2,2000H,2400H,p1+; /*含义指向a后的整型单元*/,2002H,2000H,p1- -; /*指向a前的整型单元*/,p1+n; /*指向a后的n个整型单元*/,p1- n; /*指向a前的n个整型单元*/,p2- p1; /*a和b之间差的单元数*/,结果 100H,p n 相当于: p的实际内容

4、 nsizeof(*p);,六种关系运算,比较两个同类型变量之间的地址关系。,p1p2;,指针运算说明,#include void main(void) int a,b,*p1,*p2; a=2; b=3; p1= ,差别,a,指针指向数组,p=a; /*指向数组的首地址*/ p= /*指向数组的首地址*/,通过指针引用数组元素,当指针指向数组的首地址时,则下标为i的元素地址为: p+i 或a+i,引用数组元素可以有三种方法:,下标法: a i 指针法: *(p+i) 数组名法:*(a+i),注意:数组名是地址常量,不能改变!,a=p; /*Error!*/,例 int a=1,2,3,4,5

5、,6,7,8,9,10,*p=a,i; 数组元素地址的正确表示:A) for (i=0 ; i10 ; i+ ) scanf ( “ %d” , ,数组元素法。,循环输入。,循环判断,满足条件输出。,数组名法。,a+i,*(a+i),指针法。,*p ;,p = a;,p+,*(p+i),结果是否 正确?,p= a; *p=*,注意指针在运算时的变化。,指针与字符串(字符数组),字符串在内存中可以存储为两种形式:,字符数组 字符串常量,可以使指针指向字符数组或字符串常量,通过指针引用字符数 组或字符串的各个字符。,指针与字符数组:,char *chp,ch =”Hello!”; /*说明字符指针

6、和字符数组*/ chp=ch; /*指针指向字符数组*/ putchar( *(chp+2); /*通过指针引用数组元素*/,指针与字符串:,char *chp; /*说明字符指针*/ chp=“Hello!”; /*指针指向字符串*/ puts(chp); /*通过指针引用字符串*/,说明指针时,可以同时赋初值,如:,char *chp=“Hello!”;,赋值表示将字符串的地址赋给指针!,例:char str10; scanf(“%s”,str); () 而 char *cp; scanf(“%s”, cp); (),改为:char *cp,str10; cp=str; scanf(“%s

7、”,cp); (),举例:将字符串中的大写字母转化对应的小写字母。,#include void main(void) char *p,s80; p=s; gets(p); for(;*p!=0;p+) if(*p=A ,将无符号的八进制字符串转换为十进制整数。,#include void main(void) char *p,s6; int i,n=0; p=s; gets(p); for(;*p!=0;p+) n=n*8+*p-0; printf(“%dn”,n); ,p指向s数组。,输入字符串。,s,p,s,5,5,6,0,n=0*8+5-05,n=5*8+5-045,n=45*8+6-0

8、366,思考题:将4位十六进值字符串转化为十进制字符串。,指针与二维数组,二维数组说明 int a34=1,2,3,4,5,6,7,8,9,10,11,12;,其二维结构如下:,行,列,为了便于索引,C语言将数组分为两级管理。,a0,a1,a2,将a理解为一维数组, 数组有三个元素,它们分别为a0、 a1,a2 。各个元素又是一个有四个元素的一维数组。,从地址的角度看: a 为a0 第一行的首地址 a+1 为a1 第二行的首地址 a+2 为a2 第三行的首地址,a+1 地址一次加一行。,i行j列数组元素的地址可以由a i +j得到。,数组名地址的两级管理,a,a0,a1,a2,a00 a01

9、a02,a10 a11 a12,a20 a21 a22,等价地址及其管理方式,数组名是数组的地址,而且是常量,* 运算不改变其值!,以下三种地址等价:,a+i,*(a+i),a i ,加法按行递增,数组名表示数组元素,a i j ,(*(a+i) j ,*(*(a+i)+j),*(a i +j),指针与二维数组,int *p, a34; p=a0; 对于i行j列元素 *(pi+j) *(*(p+i)+j) *(p+4*i+j)等价!,a00,a,a01,a02,a0,a10,a11,a12,a1,a20,a21,a22,a2,a+1,a1+2,举例: 在数组a中查找输入的数,输出行列位置。,#

10、include void main (void ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i, j,iS; int *p; p=a0; /或*a 或 ,下标法。,*(a i +j),*(*(a+i)+j),*(p+4*i+j),6.3 指向指针的指针,如果指针变量的内容存放其它指针的地址,称该指针为指向指 针的指针。,1. 指向指针的指针的说明,形式: type *p;,int *p;,p是一个指向整型指针的指针。,#include void main ( void) int x, *p, *q ; x=10; p= ,p为指向整型的指针。,q为指向整

11、型指针的指针。,x,p,q,2000H,3000H,10,2000H,3000H,2. 指向指针的指针的应用,指向指针的指针一般用于多维数组和指针数组的操作。,(1) 多维数组,#include void main ( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12, ; int *arr3 = a0 , a1 , a2 ; int i ,j, *p ; p=arr ; for (i=0 ;i3; i+) for (j=0 ; i4 ; j+) printf(“%5d” , *( *(p+i)+ j ) ) ; printf (“n”) ; ,ai,aij,arr,a

12、rr,p,p+1,(2) 用于处理多字符串,#include void main (void) char *name = “one” , “two” , “three” , “four” ; char *p ; int i ; for ( i=0 ; i4 ; i+) p=name+i ; printf (“%sn”, *p) ; ,p,name+i,#include void swap( int *, int * ); void main(void) int x,y; scanf(%d,%d, ,例1:通过函数实现主函数中变量a、b值的交换。,6.4 指针与函数,指针作为函数的参数:,flo

13、at aver(float *pa) int i; float s=0; for(i=0;i5;i+) s=s+*pa+; s=s/5; return s ; ,例2:输入一个学生5门课的成绩到数组a ,求平均成绩。,#include float aver(float *pa); void main( ) float sco5, av, *sp; int i; sp=sco; printf(“n input 5 scores: n”); for(i=0;i5;i+) scanf(“%f”, ,6.5 带参数的主函数,如DOS命令:COPY A:S.DOC C:,命令名。,命令参数。,主函数main()也可以带参数,由于main()不能被其他函数调用,故无法在程序内部取得实参值。它的参数来自dos命令,由操作系统传给 main函数。主函数一般有两个参数。,void main(int argc,char *argv ),

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论