




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章指针理论知识指针与指针变量1指针与数组2指针与字符串3指针与函数4要求:
能正确利用指针变量来引用所指向的变量、数组、字符串或函数。掌握各种指针变量作为函数的参数时的传递内容和过程。能正确应用指针编写相应程序来解决实际问题。要求:掌握地址、指针与指针变量的概念。理解变量、数组、字符串指针的概念。掌握指向变量、数组、字符串、函数的指针变量的定义与引用方法。了解指针数组与多级指针的概念。教学目标教学难点:能在程序设计中正确应用指针解决实际问题。教学重点:掌握地址、指针和指针变量的概念;能在程序设计中正确应用指针解决实际问题。教学重难点指针的概念1.内存和地址计算机的内存由数以亿万计的二进制位(bit)组成,每个位可以存放一个0或1。由于一个位所能表示的值的范围实在有限,所以单独一个位的用处不大,而是由许多位合成一组作为一个单位,通常以字节(Byte)即8个位一组作为内存的基本存储单位,这样就可以存储较大范围的值。而许多现代计算机上,也是以字节为基本单位进行存储单元编号的,即内存区中的每一个字节对应一个编号,这就是内存的“地址”。20002001200220032004200520062007
为了存储更大的值,可以把两个或更多的字节合在一起作为一个更大的内存存储单元。32000-12004指针的概念2.地址和内容高级语言所提供的特点之一就是通过名字来访问内存单元,例如:inta=3,b=-1;如果在程序中声明了一个变量,则在编译时会给这个变量在内存中一个特定位置分配存储单元,变量的值存储于其中,每个内存位置都由地址唯一确定并引用,并使用名字来代替地址,这些名字就是我们定义的变量名。3a-1b指针的概念3.变量地址的获取变量一经定义,将由编译器或程序运行时负责为变量在内存中分配相应大小的存储单元,程序员事先是无法知道某个特定的变量将存储在内存中哪个具体的位置。因此,我们要通过取地址运算符&获取一个变量的地址,而不是直接把它的地址写成字面值常量的形式,例如:
inta,b;
如果希望获得变量a和b的地址,我们无法书写一个类似0x125678de这样的字面值,因为我们确实不知道这是不是编译器实际分配的内存位置,而只能由&a和&b分别表示变量a和b的内存地址。又如,当一个函数每次被调用时,它的局部变量可能每次分配到的内存位置都不相同。例如在如下的程序段中:
inta,b;
scanf("%d%d",&a,&b);
指针的概念4.指针和指针变量通过变量名访问变量的方式称为“直接访问”方式。还可以定义一种特殊的变量,专门用来存储内存地址编号的。有如下语句:p1=&a;可以实现变量a的地址存放到变量p1中,这就好比变量p1指向变量a。&a——2000p13a30002000“指针”就是地址的另一个名字,“指针变量”就是专门用来存放另外一个(一些)内存地址(即指针)的变量。通过指针变量访问它所指向的变量的方式称为“间接访问”方式。用于执行间接访问的操作符是单目运算符“*”。知识链接#include“stdio.h”voidmain(){inta,b;int*p1,*p2;
/*对变量a和b的直接访问*/a=3;b=-1;printf(“%u,%u\n”,&a,&b);/*显示变量a和b的内存地址*/
printf(“%d,%d\n”,a,b); /*显示变量a和b的内容*/printf(“***************\n”);
/*对变量a和b的间接访问*/p1=&a;p2=&b;printf(“%u,%u\n”,&p1,&p2);
/*显示变量p1和p2的内存地址*/printf(“%u,%u\n”,p1,p2);
/*显示变量p1和p2的内容*/printf(“%d,%d\n”,*p1,*p2);
/*显示变量p1和p2分别指向的变量的内容*/}指针变量指针变量的定义一般形式:数据类型*指针变量名;合法标识符指针的目标变量的数据类型表示定义指针变量不是‘*’运算符例int
*p1,*p2;float*q;char*name;注意:1、int*p1,*p2;
与int*p1,p2;2、指针变量名是p1,p2,不是*p1,*p23、指针变量只能指向定义时所规定类型的变量4、指针变量定义后,变量值不确定,使用前必须先赋值指针:一个变量的地址指针变量的初始化一般形式:数据类型*指针名=初始地址值;例inti;int*p=&i;变量必须已说明过类型应一致例inti;int*p=&i;int*q=p;例
int*p=&i;
inti;用已初始化指针变量作初值&与*运算符含义含义:取变量的地址单目运算符优先级:2结合性:自右向左含义:
取指针所指向变量的内容单目运算符优先级:2结合性:自右向左两者关系:互为逆运算理解…...…...2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-----指针变量,它的内容是地址量*i_pointer----指针的目标变量,它的内容是数据&i_pointer---指针变量占用内存的地址200010i_pointer*i_pointer&i_pointerii_pointer
=
&i
=
&(*i_pointer)i
=
*i_pointer
=
*(&i)例main(){inti=10;int*p;
p=i;printf(“%d”,*p);}危险!例
main(){inti=10,k;int*p;
p=&k;*p=i;printf(“%d”,*p);}指针变量必须先赋值,再使用…...…...2000200420062005整型变量i10指针变量p200120022003随机任务2:将输入的任意两个整数调整为从小到大的顺序并输出。实践任务/*解决方案1*/
#include"stdio.h"voidmain(){ inta,b,t; printf("请输入两个整数:"); scanf("%d%d",&a,&b); if(a>b) { t=a;a=b;b=t; }
printf("a=%d,b=%d\n",a,b); }/*解决方案2*/
#include"stdio.h"voidmain(){ inta,b,t; int*p1,*p2; p1=&a; p2=&b; printf("请输入两个整数:");
scanf("%d%d",p1,p2); if(*p1>*p2) { t=*p1; *p1=*p2; *p2=t; } printf("a=%d,b=%d\n",a,b); }知识链接/*解决方案3*/
#include"stdio.h"voidmain(){ inta,b; int*p1,*p2,*p; p1=&a; p2=&b; printf("请输入两个整数:"); scanf("%d%d",p1,p2); if(*p1>*p2) { p=p1; p1=p2; p2=p; } printf("a=%d,b=%d\n",*p1,*p2); }知识链接#include"stdio.h"voidmain(){ inta,b,t; printf("请输入两个整数:"); scanf("%d%d",&a,&b); swap(a,b);
printf("a=%d,b=%d\n",a,b); }#include"stdio.h"voidswap(intx,inty){intt;t=x; x=y; y=t;}是否实现?实现两个数的互换指针变量作为函数参数指针变量作为函数参数——实现地址传递特点:共享存储单元,“双向”传递#include"stdio.h"voidswap(int*x,int*y){intt;t=*x; *x=*y; *y=t;}main(){inta,b;printf("请输入两个整数:");scanf("%d%d",&a,&b);swap(&a,&b);printf("a=%d,b=%d\n",a,b);}多级指针
二级指针变量的定义形式为:
类型标识符**指针变量名;
例如:
inta=3;int*b=&a;int**c=&b;
根据二级指针变量的思路,可以推广到三级指针、四级指针……定义几级指针变量就将变量名前放几个“*”。
3ab&ac&b
指针与数组指向数组元素的指针变量例intarray[10];int*p;
p=&array[0];//
p=array;或int*p=&array[0];或int*p=array;array[0]array[1]array[2]array[3]array[9]...整型指针p&array[0]p数组名是表示数组首地址的地址常量指针运算指针变量的赋值运算p=&a;(将变量a地址p)p=array;(将数组array首地址p)p=&array[i];(将数组元素地址p)p1=p2;(指针变量p2值p1)指针变量与其指向的变量具有相同数据类型指针的算术运算:pipid(i为整型数,d为p指向的变量所占字节数)p++,p--,p+i,p-i,p+=i,p-=i等若p1与p2指向同一数组,p1-p2=两指针间元素个数
(p1-p2)/dp1+p2无意义例p指向float数,则p+1p+14例p指向int型数组,且p=&a[0];
则p+1指向a[1]例inta[10];int*q=&a[2];q++;*q=1;例inta[10];int*p1=&a[2];int*p2=&a[5];
则:p2-p1=3;a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a数组qp+1,a+1p+i,a+ip+9,a+9p,a1通过指针访问数组元素a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下标法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)a[i]
*(a+i)a[i]
p[i]
*(p+i)
*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]#include<stdio.h>voidmain(){inti,b[8],*p=b;printf("\nInputb[i]:\n");for(i=0;i<8;i++)scanf(“%d”,p+i);//p+i等价于&b[i]/*效率最高,不直观*/printf("\nOutputb[i]:\n");for(i=0;i<8;i++)printf("%d,",b[i]);//也可以为p[i]for(i=0;i<8;i++)printf("%d,",*(b+i));/*数组名,指针法*/for(i=0;i<8;i++)printf("%d,",*(p+i));}例:分别用数组名和指针变量指针与字符串spchars[10]=“China!”用字符数组存放字符串China!\0用指针指向字符串char*p=“China!”China!\0字符串的输入和输出输入:scanf、gets函数输出:printf、puts函数形式说明以字符串为处理对象时,参数应当是数组名或指针。#include<stdio.h>voidmain(){chars[20];puts("请输入一个字符串:");gets(s);puts(s);}
#include<stdio.h>voidmain(){chars[20],*p=s;printf("请输入一个字符串:");scanf("%s",p);printf("这个字符串是:%s\n",p);p=p+3;printf(“字符串中第四个字符是:%c\n",*p);printf("从第四个字符开始,后面的字符串是:%s\n",p);}s=s+3;X字符数组和字符型指针变量的不同
字符数组和字符型指针变量都可以实现字符串的存储和运算,但它们主要有以下几点不同:
(1)存储的内容不同。字符数组存储字符串全部字符包括终止符,而字符型指针变量仅存储字符串的起始地址。
(2)赋值的方式不同。对字符数组的赋值只能逐个元素地进行,或者使用标准C库函数,而字符型指针变量可以被赋值为字符串但取得的是首地址。例如:
char*p;p=”TurboC”;
上面对字符型指针变量的赋值是正确的,但不能用下面的方法对字符数组赋值:chars[20];s=”TurboC”;
(3)性质不同。字符数组名代表存储单元的起始地址,它是指针常量,是不能修改的,而字符型指针变量可以通过修改它存储的值而实现指针的移
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国餐饮连锁行业运营市场深度调查及投资策略研究报告
- 2025-2030年中国阿莫西林行业竞争现状及投资战略研究报告
- 2025-2030年中国镀层钢板市场运营态势与发展风险分析报告
- 2025-2030年中国酒石酸美托洛尔缓释片行业发展趋势及投资战略研究报告
- 2025-2030年中国运动服饰行业运行现状及发展前景趋势分析报告
- 2025-2030年中国西厨设备行业市场发展现状及前景趋势分析报告
- 2025-2030年中国营养保健食品市场发展状况及投资战略研究报告
- 病人转运合同范本
- 2025河北省安全员B证(项目经理)考试题库
- 2025年广东省安全员知识题库及答案
- 肺栓塞患者护理查房课件
- 委托书之工程结算审计委托合同
- 《如何有效组织幼儿开展体能大循环活动》课件
- (完整版)重力式挡土墙专项方案
- 花城版四年级音乐下册全册教案
- 精神分裂症合并糖尿病患者护理查房课件
- 山东省2024届科目一模拟考试100题(答案)
- 共享wifi贴合同范本
- 借款人借款合同
- 统战工作先进个人事迹材料
- 国能辽宁北票 200MW 风力发电项目地质灾害危险性评估报告
评论
0/150
提交评论