语言电子教案指针.ppt
《语言电子教案指针.ppt》由会员分享,可在线阅读,更多相关《语言电子教案指针.ppt(83页珍藏版)》请在三一办公上搜索。
1、第11章 指 针,知识点:指针的定义指针变量的使用各种指针的使用重点:指针的概念及C语言指针使用的特点指针变量的定义、引用数组的指针、字符串的指针、函数的指针、指向指针的指针的使用难点:指针的运算和使用指针在数组中的使用及使用特点,指针是C语言中的一个重要的概念,也是C语言的一个重要特色。可以表示复杂的数据结构 能动态分配内存 能方便地使用字符串 有效而方便地使用数组 在调用函数时能得到多于1个的值 能直接处理内存地址等,第11章 指 针,11.1 地址和指针的概念,“直接访问”方式 按变量地址存取变量值的方式,int x,y,z;,x=20,y=40;,z=x+y;,编译系统把变量名转换为变
2、量的地址,对变量值的存取通过地址进行的。,内存,11.1 地址和指针的概念,“间接访问”方式 通过存放变量地址的变量去访问变量,int x,*x_point;,x_point=,*x_point=20;,11.1 地址和指针的概念,k=x;/*直接访问*/,x_pointer=/*间接访问*/,10,10,变量的指针 就是变量的地址 指针变量 存放变量地址的变量 用来指向另一个变量 用“*”符号表示“指向”,11.2 变量的指针和指向变量的指针变量,定义一个指针变量 指针变量不同于整型变量和其他类型的变量,它是用来专门存放地址的。必须将指针变量定义为“指针类型”。一般形式 基类型*指针变量名;
3、基类型:指针变量所指向的变量的类型。例 float*pointer1;int*pointer2;char*pointer3;指针变量的定义是通过*进行的 定义后的指针变量只能赋值指针,不能赋值为一般数据类型,11.2 变量的指针和指向变量的指针变量,指针变量的引用&与*运算符-单目运算,优先级2,自右向左结合&取地址运算符 取变量的地址,取出的地址一定是一个常数&变量名=指针值*指针运算符 指针变量所指向的内存单元,可称为指针变量所指的变量 与指针变量定义中的*不同“*指针变量”可以作为一个基类型变量来用,11.2 变量的指针和指向变量的指针变量,11.2 变量的指针和指向变量的指针变量,ma
4、in()int a,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=,100,10100,10,指针变量的初始化 一般形式 基类型*指针变量名=初始地址值;,11.2 变量的指针和指向变量的指针变量,例 int i;int*p=,例 int i;int*p=,例 int*p=,用已初始化指针变量作初值,11.2 变量的指针和指向变量的指针变量,指针变量使用前必须先初始化或赋初值,例 main()int i=10,*p;*p=i;printf(“%d”,*p);,结果:10,危险!,例 main()int i=10,k,*p;p=,零指针与空类型指
5、针 零指针:(空指针)定义:指针变量值为零 表示:int*p=0;,11.2 变量的指针和指向变量的指针变量,p指向地址为0的单元,系统保证该单元不作他用(不存放有效数据)表示指针变量值没有意义,NULL在stdio.h中定义,原型为#define NULL 0 int*p=NULL;用途:避免指针变量的非法引用 在程序中常作为状态比较,例 int*p;.while(p!=NULL).,11.2 变量的指针和指向变量的指针变量,空类型指针 定义:指针变量不指向哪一种类型数据 表示:void*p;使用时要进行强制类型转换,表示不指定p2是指向哪一种类型数据的指针变量,例 char*p1;void
6、*p2;p1=(char*)p2;p2=(void*)p1;,11.2 变量的指针和指向变量的指针变量,main()int a;int*pa=,a=10,*pa=10&a=ffda(hex),pa=ffda(hex)&pa=ffde(hex),练习,11.2 变量的指针和指向变量的指针变量,int x,y,*x_pointer,*y_pointer;,x_pointer=,y_pointer=,y_pointer=,y=*,&与*运算符右结合*右侧接指针变量,如:*x_pointer&右侧接一般变量,如:&x,指针变量作为函数参数 作用是将变量的地址传送到另一个函数中,11.2 变量的指针和指
7、向变量的指针变量,swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;main()int a,b,*pointer_1,*pointer_2;scanf(%d,%d,5,9,9,5,11.2 变量的指针和指向变量的指针变量,swap(int*p1,int*p2)int*temp,x;temp=,5,9,9,5,11.2 变量的指针和指向变量的指针变量,swap(int*p1,int*p2)int*temp;temp=p1;p1=p2;p2=temp;main()int a,b,*pointer_1,*pointer_2;scanf(%d,
8、%d,5,9,5,9,想通过函数调用得到n个要改变的值,可以:在主调函数中设n个变量,用n个指针变量指向它们 将指针变量作实参,将这n个变量的地址传给所调用的函数的形参 通过形参指针变量,改变该n个变量的值 主调函数中就可以使用这些改变了值的变量,11.2 变量的指针和指向变量的指针变量,11.2 变量的指针和指向变量的指针变量,例:输入a、b、c3个整数,按大小顺序输出。,main()int a,b,c,*p1,*p2,*p3;scanf(%d,%d,%d,swap(int*pt1,int*pt2)int temp;temp=*pt1;pt1=*pt2;*pt2=temp;,exchange
9、(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);,数组的指针是指数组的起始地址 数组元素的指针是数组元素的地址指向数组元素的指针 用法与指向变量的指针变量相同 int,a5,*p,*q;p=,11.3 数组与指针,由于数组名是数组的首地址(常量)p=a;/*相当于p=,a,指针变量与指针的运算 指针变量的赋值运算 p=出现编译警告,但可以执行,11.3 数组与指针,指针的算术运算 p+/+p 指针后移一个单元(元素)p-/-p 指针前移一个单元(元素)p+n 指向p指
10、针下的n个单元(元素)p-n 指向p指针上的n个单元(元素)p-q 求两指针之间单元(元素)个数 单元(元素)大小与指针的具体数据类型有关,如当指针变量的基类型为整型时,一个单元(元素)的大小为2bytes;当指针变量的基类型为浮点型时,一个单元(元素)大小为4bytes。,11.3 数组与指针,11.3 数组与指针,例:,int a5,*p,*q;q=,p+;,p-;,p+2;,q-1;,q-p;,=4,*(p+1)或*(a+1);,=a1,指针的关系运算 实质是两个地址之间的比较,地址大的指针大,地址小的指针小 pq p=q pq p=q p=q p!=q,11.3 数组与指针,引用数组元
11、素的方法 int a5,*p;p=a;,11.3 数组与指针,下标法 ai和pi,指针法*(a+i)和*(p+i),例 输出数组中的全部元素,11.3 数组与指针,main()int a10=1,2,3,4,5,6,7,8,9,10,*p,i;for(i=0;i10;i+)printf(“%4d”,ai);,用下标法引用数组元素,main()int a10=1,2,3,4,5,6,7,8,9,10,*p,i;for(i=0;i10;i+)printf(“%4d”,*(a+i);,11.3 数组与指针,用指针法引用数组元素 数组名a在计算过程中代表数组的首地址 对ai进行变址运算,转化为*(a+
12、i),main()int a10=1,2,3,4,5,6,7,8,9,10,*p,i;for(p=a;p(a+10);p+)printf(“%4d”,*p);,11.3 数组与指针,p的初值为数组a的起始地址 计算过程中使用了指针加法 数组名a在计算过程中代表数组的首地址,main()int a10=1,2,3,4,5,6,7,8,9,10,*p,i;for(p=a,i=0;i10;i+)printf(“%4d”,pi);,11.3 数组与指针,用下标法引用数组元素 p的初值为数组a的起始地址,11.3 数组与指针,main()int i,*p,a10;p=a;for(i=0;i10;i+)s
13、canf(%d,p+);printf(n);for(i=0;i10;i+,p+)printf(%d,*p);,1 2 3 4 5 6 7 8 9 0,22153 234 0 0 30036 25202 11631 8259 8237 28483,p=a;,1 2 3 4 5 6 7 8 9 0,例 通过指针变量输出a数组的10个元素,main()int a=5,8,7,6,2;int y,*p=,11.3 数组与指针,6,5 6,例:,用数组名作函数参数 数组名作函数实参,传递给形参的是地址(地址传递)传递的地址是数组的首地址,形参接收的是数组的首地址 形参定义时为数组,形参数组的维数可省略(
14、一维数组)实际上,编译系统把形参数组名作为指针变量来处理,11.3 数组与指针,前面已经分析,指向数组的指针变量可以通过指针法,也可以通过下标法引用数组元素,所以,11.3 数组与指针,void f(int b)printf(len of b is%dByten,sizeof(b);printf(a1=%d,b1);main()int a3=1,2,3;f(a);,len of b is 2Bytea1=2,例:,void f(int*b)printf(a1=%d,*(b+1);,数组名作函数参数,实参与形参的对应关系,11.3 数组与指针,例 将数组a中n个整数按相反顺序存放,11.3 数组
15、与指针,算法:设两个“位置指示变量”i和j,i的初值为0,j的初值为n-1 将ai与aj交换 使i的值加1,j的值减1 再将ai与aj对换,直到i=(n-1)/2为止,main()int i,a10=3,7,9,11,0,6,7,5,4,2;printf(The original array:n);for(i=0;i10;i+)printf(%d,ai);printf(n);inv(a,10);printf(The array has been inverted:n);for(i=0;i10;i+)printf(%d,ai);printf(n);,void inv(int x,int n)in
16、t temp,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;,11.3 数组与指针,i,j,void inv(int*x,int n)int*p,temp,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)temp=*i;*i=*j;*j=temp;,11.3 数组与指针,多维数组与指针 多维数组的地址 int a34=1,3,5,7,9,11,13,15,17,19,21,23;可以把a看作是一维数组,有3个元素:a0,a1,a2 a0,a1,a2可以分别认为是包含4个元素
17、的一维数组 二维数组是数组的数组,11.3 数组与指针,11.3 数组与指针,11.3 数组与指针,a-二维数组的首地址,即第0行的首地址a+i-第i行的首地址ai*(a+i)-第i行第0列的元素地址ai+j*(a+i)+j-第i行第j列的元素地址*(ai+j)*(*(a+i)+j)aij,a+i=&ai=ai=*(a+i)=&ai0,值相等,含义不同a+i&ai,表示第i行首地址,指向行ai*(a+i)&ai0,表示第i行第0列元素地址,指向列,#define FORMAT%x,%xn#define FORMAT1%d,%dnmain()int a34=1,3,5,7,9,11,13,15,
18、17,19,21,23;printf(FORMAT,a,*a);printf(FORMAT,a0,*(a+0);printf(FORMAT,11.3 数组与指针,例 输出二维数组有关的值。,ffb8,ffb8ffb8,ffb8ffb8,ffb8ffc0,ffc0ffc0,ffc0ffc8,ffc8ffc8,ffc89,9,11.3 数组与指针,11.3 数组与指针,指向多维数组元素的指针变量 指向数组元素的指针变量,main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int*p;for(p=a0;pa0+12;p+)if(p-a0)%4=0)printf(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 电子 教案 指针

链接地址:https://www.31ppt.com/p-5666704.html