《c语言指针》PPT课件.ppt_第1页
《c语言指针》PPT课件.ppt_第2页
《c语言指针》PPT课件.ppt_第3页
《c语言指针》PPT课件.ppt_第4页
《c语言指针》PPT课件.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

C/C+程序设计,第十章 指针,第十章 指 针,1. 指针的基本概念 2. 指针变量和指针运算符 3. 指针和函数参数 4. 指针与数组 5. 指针与函数 6. 本章小结,1 指针的基本概念,变量是存放在内存上的,内存的每一个字节成为一个单元,每个单元有一个编号,这个编号就是地址,内存是按字节排列的连续空间。 定义变量: int k;编译系统根据类型为k分配内存 输入变量的值:scanf(“%d”,间接访问,C 提供了另一种方式,将变量 k的地址存放在另一个变量处(假定为pk),通过访问 pk,就可以间接地访问变量k,这种方式称为间接访问。 变量 int k; 变量 pk 中存放 k 在内存中的地址。 int k=100 int *pk = 变量pk 是一个指针变量,指向变量k,存放k的地址 ,因此指针就是地址。,举例分析,比较两个程序,main( ) int a, b, c; a=5; b=10; c=a+b; printf(“%d,%d,%d”,a,b,c); ,main( ) int a, b, c, *pc; a=5; b=10; pc= ,指针可以指向所有类型的数据,指针指向变量-变量的指针(存变量的地址)。 指针指向数组-数组的指针(存数组的起始地址)。 指针指向函数-函数型指针(存放函数的入口地址)。 指针指向指针-指针型指针(存放某指针的地址)。 由指针组成的数组-指针数组。,2 指针变量和指针运算符,一 、 指针变量的定义 1. 格式:类型 * 标识符; 其中: 指针的类型是指针所指变量的类型。 *为指针说明符,说明后面的标识符为指针变量(也叫间接访问符)。 2. * 和 & 在C中有两个作用: *: 乘号(双目)和指针说明符(单目)。 &: 取址符(单目)和位操作中的“与”,二、指针变量的引用,对变量k的访问就可以有两种方法: 直接访问:通过变量名访问-k 间接访问:通过指针变量名pk 例如: int k , *pk; pk= 完全等价。,区别: 定义指针 *pk(说明语句) 引用指针 *pk(执行语句),例子,main( ) int a,b,c; int *p ; / (指针说明) a=100; b=200; p= ,main( ) float a,b,c; float *p; a=100.0,b=200.0; p= ,*与& 之间是互逆的,int k; int *pk = 所以: *(&k) =*pk=k &(*pk)=&k=pk,三、 指针变量的初始化,1. 指针变量使用前必须有值。 2. 指针变量的初值必须是地址值。 (不能是整数) 3. 两种: (1) pk = ,关于指针几点说明,1. 程序中一旦进行了变量说明 int a,b,c ; 则机器自动设置a,b,c的存储区域,每个整数四个字节。 2. 当a=100,b=200 时,则分别存在 a,b 的空间内。 3. 为便于了解存储区的位置,用&a表示a的地址,&b表示b的地址, &c表示c的地址。 4. 如果变量p专门用来存放地址, p=&c, 称为指针变量。 5. 指针变量p自身也有地址,用&p表示,用 printf(“%x”,&p)可求得指针自身的存储地址,四. 指针的运算,C仅允许指针作三种运算: 1. 指针的比较运算(关系) pq : p 指针所指元素位于q所指元素之后时为真1 p=q:p指针所指元素位于q所指元素之后(或两指针指向同一元素)时为真1 p=p:p指针所指元素位于 q 指针所指元素之前(或两指针指向同一元素)时为真1 p=q: 两指针指向同一元素时为真1 p!=q: 两指针不指向同一元素时为真1,2. 指针的减法运算 条件:必须两指针p,q指向同一数组 p-q的结果为p所指元素与q所指元素之间相隔的元素的个数(不是地址值之差,也不是变量值之差)。 3. 指针与整数的加减运算 当一个指针指向一个数组时,指针与一个整数n相加或相减,表示将指针向后或向前移动了n个元素。,例题,1. 若定义char *p=“I am a student”; 则 *(p+7)的值为 2. 若定义int a4=0,1,3,5,*p; p= ,3 指针做函数参数,1. 指针变量既可以作为函数的形参,也可以作函数的实参。指针变量作实参时,与普通变量一样,是“值传递”,即将指针变量的值传递给被调用函数的形参,对应的形参必须是一个指针变量。 2. 当指针变量作函数的参数时,被调用的函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。,交换,void main( ) int a , b; printf(“Enter two numbers : ”); scanf(“%d,%d”, ,举例,void change(int x, int *pm) x=10; *pm=10; void main() int n=200,m=200, *p1; p1= ,4 指针与数组,一个指针,指向一个数组 数组名就是数组的起始地址 1、用指针访问数组元素 int a10,*pa; pa= 可以移动指针使其指向数组中后面的元素 向后移动i个元素 pa+i 指针指向元素ai。,访问数组元素,pa+i=&ai (将a i 的地址赋给指针pa) 掌握以下原则: *(pa+i)=*(a+i)=ai = pai(间接访问),字符指针,字符数组在C中可以用字符串常量初始化,可以整串的输入,输出,由于指针与数组的等价性,字符指针也有某些特点. 1. 字符指针定义 char *pc; 2. 字符指针的赋值: char c; pc=,4. 字符数组与字符指针的区别: (1)字符数组可以写成: char c =“book”; 但不能写成: char c ; c =“book”; 字符指针可以写成:char *pc=“book”; 也可以写成: char *pc; pc=“book”; (2) 当用字符串常量初始化时: 字符数组获得了串中所有的字符(内容)。 字符指针获得了串首的地址(与串内字符无关)。,5. 字符指针的应用举例,1、编写程序完成字符串的拷贝。 2、应用指针把一个字符串倒序存放,并输出。,10.4.2 指针数组,一 、指针数组的定义 格式:类型 *标识符长度; 如: int *pa3; 二 、指针数组的初始化 static int a33=1,2,3,4,5,6,7,8,9; int *pa3=a0,a1,a2; 指针数组*pa3 相当于有三个指针,pa0,pa1,pa2,初始化的结果:,指针数组与二维数组是等价的,通过指针数组可以引用二维数组中的元素。 对任意行i,可以有:pai=,三、 指针数组的应用,1. 用指针数组引用二维数组中的元素,void main( ) int i,j; static int a33=1,2,3,4,5,6,7,8,9; int *pa3=a0,a1,a2; for(i=0;i3;i+) for(j=0;j3;j+) printf(“%d,%d,%dn”, aij,*(*(a+i)+j),*(pai+j) ); ,2. 处理二维字符数组,#define SIZE 4 void main( ) int i, j, k; static char *strSIZE=“Program”, “ Fortran”, “ C” , “ Basic”; char *temp; for(i=0;i0 ) temp=str j ; str j =str i ; str i =temp; for(i=0;iSIZE;i+) printf(“%sn”,str i ); ,3. 指针数组作main函数的形参,void main(int 参数1,char* 参数2 ) /*参数1:命令行字符串的个数*/ /*参数2:各字符串在内存存放的首地址*/ 注意:形参值从何而来?由DOS系统执行.EXE的命令行提供。,10.4.3 指针型指针,一 、指针型指针的定义 1. 格式: 类型 *标识符; 2. 说明: 类型为被指针型指针所指的指针所指的变量的类型。 例: int a,*pa,*ppa; pa= *pa 与 a 等价 *ppa与 pa等价 *ppa与*pa与a等价,二、 指针型指针的应用,1.指针型指针(二级指针)与指针数组,二维数组等价性 #define SIZE 4 void main( ) static char *p =“program”, “basic”,“fortran”, “c”; char *pp; int i; for (i=0;iSIZE;i+) pp=p+i; printf(“%sn”,*pp); 指针与一维数组等价 指针数组与二维数组等价 二级指针与指针数组等价,2. 对数据的多级间接访问 int i, *pi , *ppi ; pi=,5 指针与函数,一 、 函数型指针 定义了函数之后,系统为该函数分配一段存储空间,其中函数的起始地址,称为该函数的入口地址,将此地址赋给另一个变量,则该变量为一个指向函数的指针。 二、 函数型指针的定义 格式: 类型 (*标识符) ( );

温馨提示

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

评论

0/150

提交评论