C语言程序设计课件第8章 8.1指针的概念与变量_第1页
C语言程序设计课件第8章 8.1指针的概念与变量_第2页
C语言程序设计课件第8章 8.1指针的概念与变量_第3页
C语言程序设计课件第8章 8.1指针的概念与变量_第4页
C语言程序设计课件第8章 8.1指针的概念与变量_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计

录目录CONTENTS

指针的概念8.1

指针变量8.2

8.1指针的概念

核心概念定义

一个变量的地址称为该变量的“指针”。如果有一个变量专门用来存放其他变量的地址(指针),这个变量被称为“指针变量”。

变量地址:以整型变量为例,若其占据4个字节,这4个字节中编号最小的字节的地址,即为该整型变量的地址,也称为其“首地址”。

指针:变量的地址就叫做该变量的“指针”。例如整型变量a的地址,可直接记作&a,&a就是变量a的指针。

指针变量:专门用于存放其他变量地址(即指针)的变量,被称为“指针变量”。

实例说明

以整型变量inta=247为例,具体解释上述概念:1.变量a在内存中占据4个连续字节,用于存储数值247。2.假设这4个字节的起始地址(首地址)为0012FF7C,那么变量a的地址就是0012FF7C。3.这个地址0012FF7C既是变量a的首地址,也是变量a的指针,按规定写法记为&a。访问变量的方式可分为两种,一种是“直接访问”方式,另一种是“间接访问”方式。按变量名访问的方式称为“直接访问”方式。例如,图所示即为直接访问方式,通过变量名a直接赋值,由于变量名与变量的地址一一对应,因此,直接将数值1放到变量a的存储单元中。

8.1指针的概念如果将变量a的地址存放在另一变量中,然后通过该变量来找到变量a的地址,从而访问变量a,这就是“间接访问”方式。例如,图所示即为间接访问方式,先找到存放变量a地址的变量p,从其中得到变量a的地址(2000),从而找到变量a的存储单元,然后对它进行存取访问。这就好比要取抽屉a中的东西,需要先用抽屉p的钥匙打开抽屉p,从抽屉p中取出抽屉a的钥匙,再打开抽屉a。

提示一个变量的地址称为该变量的“指针”。例如,地址2000是变量a的指针。专门用来存放另一变量地址(即指针)的变量称为“指针变量”。例如,上述变量p就是一个指针变量。“指针”是一个地址,而“指针变量”是存放地址的变量。注意区分两者的概念。

8.1指针的概念指针变量与一般变量一样,必须“先定义后使用”。定义一个指针变量需要解决两个问题:一是说明指针变量的名字,二是说明指针变量指向变量的数据类型。定义指针变量的一般形式为:类型说明符*指针变量名1,*指针变量名2…;例如:int*p1; /*定义指向整型变量的指针变量p1*/char*p2,*p3; /*定义指向字符型变量的指针变量p2和p3*/其他类型的变量允许和指针变量在同一个语句中定义,例如:intm,*p; /*定义2个变量,其中m是整型变量,p是指向整型变量的指针变量*/

8.2指针变量8.2.1指针变量定义

提示1)在定义时,指针变量名前的“*”表示该变量的类型是指针型变量,不能省略。(2)指针变量定义中的“数据类型”是指针指向的目标数据的类型。读者可能会提出,既然指针变量是存放地址的,那么为什么要指定数据类型呢?我们知道,不同类型的数据在内存中所占的字节数和存放方式是不一样的。例如,字符型数据占1个字节,整型数据占4个字节。因此,如果想通过指针引用一个变量,只知道地址(如2000)是不够的,因为无法判断是从地址为2000的一个字节中取出字符型数据,还是从2000到2003四个字节中取出整型数据。

8.2指针变量8.2.1指针变量定义可以在定义指针变量的同时为其赋初值,即指针变量的初始化。由于指针变量是指针类型,因此,所赋初值应是一个地址值。其一般格式为:类型说明符*指针变量名1=地址1,*指针变量名2=地址2…;例如:inti;int*p=&i; /*定义指针变量p指向整型变量i*/表示地址的形式可以是“&变量名”“数组名”“其他指针变量”等。例如:chars[20];char*str=s; /*定义指针变量str指向字符数组s的首地址*/

8.2指针变量8.2.2

指针变量初始化在引用指针变量时,一般有3种情况。给指针变量赋值1在程序执行过程中,可以使用赋值语句为指针变量赋值,一般格式为:指针变量=地址;例如:inta=20,b=30,*p1,*p2;p1=&a; /*把变量a的地址赋给指针变量p1*/p2=&b; /*把变量b的地址赋给指针变量p2*/

8.2指针变量8.2.3

指针变量引用定义了两个整型变量a和b,a初值为20,b初值为30;定义了指针变量p1指向变量a,指针变量p2指向变量b,其相互之间的关系如左图所示。指针变量和一般变量一样,存放在它们之中的值是可以改变的,也就是说,可以改变它们的指向,例如,执行表达式语句“p2=p1;”,意思是p2与p1指向同一对象a,此时*p2就等价于a,而不是b,如右图所示。

8.2指针变量8.2.3

指针变量引用

名师点睛要熟练掌握两个有关的运算符:(1)“&”运算符是取地址运算符,它是单目运算符,其功能是返回其后所跟操作数的地址,其结合性为从右向左。例如,&a是变量a的地址。(2)“*”运算符是指针运算符,也称间接运算符,它也是单目运算符。其功能是取该指针指向的存储单元的值。例如,*p代表指针变量p指向的对象。

8.2指针变量8.2.3

指针变量引用引用指针变量指向的变量2如果在上述定义语句后面执行表达式语句“*p2=*p1;”,即:inta=20,b=30,*p1,*p2;p1=&a; /*把变量a的地址赋给指针变量p1*/p2=&b; /*把变量b的地址赋给指针变量p2*/*p2=*p1; /*引用指针变量指向的变量*/则表示把p1指向的内容赋给p2所指的区域,即等价于“b=a;”,如图所示。

8.2指针变量8.2.3

指针变量引用【例8-1】有下列代码,试分析输出结果。#include<stdio.h>intmain(){ intx=10,*p,y; p=&x; /*取变量x的地址赋给指针变量p*/ y=*p; /*将*p的值赋给y*/ printf("x=%d,*p=%d,y=%d\n",x,*p,y); /*输出x,*p和y的值*/ printf("&x=%x,p=%x,&y=%x\n",&x,p,&y); /*输出x和y的地址以及指针p的值*/ return0;}引用指针变量的值3用十六进制形式输出指针变量p的值,即输出a的地址,可以用如下语句实现。inta;int*p=&a;printf("%x",p);

8.2指针变量8.2.3

指针变量引用【程序说明】此例中定义了三个变量,x和y为整型变量,p为指针变量。x的初值为10,让p去指向x,*p表示取指针变量p所指存储单元的内容,即变量x的值,因此,*p和y也等于10。p为指针变量且指向x,因此,p即为x的地址;y和x是不同的变量,因此,它们所占的存储空间不同,即地址不同。

8.2指针变量8.2.3

指针变量引用【运行结果】程序运行结果如图所示。

提示此例中第4行和第6行都出现了“*p”,但意义是不同的。“intx=10,*p,y;”语句中的“*p”表示将变量p声明为指针变量,用“*”以区别于一般变量。而“y=*p;”中的“*p”表示使用指针变量p,此时“*”是运算符,表示取指针所指向的存储单元内容,即对p进行间接存取运算,取变量x的值。

8.2指针变量8.2.3

指针变量引用空指针1不指向任何对象的指针即为空指针,表示该指针没有指向任何内存单元。构造空指针有下面两种方法。(1)赋0值。例如:int*p=0;

名师点睛除0之外,一般不把其他整数作为初值赋给指针变量。程序运行期间,变量的地址是由计算机分配的,当用一个整数为一个指针变量赋初值后,可能会造成难以预料的后果。

8.2指针变量8.2.4

空指针与void指针(2)赋NULL值,NULL的值等于0,两者等价。例如:int*p=NULL;空指针常用来初始化指针,避免野指针的出现。对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的,否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量。void指针2C语言规定,指针变量也可以定义为void型,例如:void*p;这里p仍然是一个指针变量,有自己的内存空间。但是不指定p指向哪种类型的变量。在这种情况下,应该注意:

8.2指针变量8.2.4

空指针与void指针(1)任何指针都可以赋值给void指针。例如:intx=10;int*q=&x;p=q; /*不需要进行强制类型转换*/(2)使用void指针时必须对其进行强制类型转换,将void指针转换成它所指向单元的实际类型,然后才可以使用。因此,void指针赋值给其他类型的指针时要进行强制类型转换。例如:int*t=(int*)p; /*需要进行强制类型转换*/printf("*p=%d",*(int*)p); /*输出p指向的存储单元内容*/指针是内存单元的地址,指

温馨提示

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

最新文档

评论

0/150

提交评论