第5章指针.ppt
《第5章指针.ppt》由会员分享,可在线阅读,更多相关《第5章指针.ppt(51页珍藏版)》请在三一文库上搜索。
1、2019/4/9,1,第5章 指针的应用,5.1、指针概述 一、内存地址的概念 地址编码的基本单位是字节,每个字节是一个基本内存单元。 二、从内存单元中存取数据的 方法 1、通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。,2019/4/9,2,2、通过地址,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。 C+拥有在运行时获得变量的地址和操纵地址的能力。
2、变量的地址可以使用地址运算符&求得,在某一变量前加上地址运算符&,则为该变量的地址,如: &x 表示变量x的地址 数组名表示数组的首地址;函数的地址用函数名表示。 用来存放地址的变量就叫做指针型变量,简称指针。,2019/4/9,3,假设ptr为一指针,则语句: ptr= /将x的值赋给y,2019/4/9,4,例5.1、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int a; int *p; a=10; p= ,2019/4/9,5,5.2、指针变量的定义、赋值及使用 一、指针变量的定义 指针本身也是一种变量,须先声明后
3、使用。 声明指针类型的变量是在声明变量的同时加上*来完成的。对应于各种类型的数据都有相应的指针类型。 *放在指针定义中时,被称为指针定义符。 放在可执行语句中的指针前被称为指针运算符,也称为“间接访问”运算符。,2019/4/9,6,指针变量的声明语句,由数据类型后跟星号,再跟随指针变量名组成。 数据类型 *指针变量名; 如: int* iptr; int *iptr; int * iptr; int*iptr; 在指针定义中,一个*只能表示一个指针。 int * iptr1,iptr2; /iptr1指针变量,iptr2整型变量 int * iptr1, * iptr2; /两个指针变量,2
4、019/4/9,7,地址和指针的关系 int x,*ptr ; x=3; ptr= /x=11 ,2019/4/9,8,二、指针变量的赋值 与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为0、NULL或一个地址。数值为0或者NULL的指针不指任何内容。数值0是可以直接赋给指针变量的唯一整数值。 1.在定义指针变量的同时进行初始化赋值,一般格式如下: 数据类型 *指针名初始地址;,2019/4/9,9,2.定义指针变量后,用赋值语句将其初始化。 指针变量名=地址; 可以是变量的地址、数组名、函数名等。 用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。 不能把
5、常量或表达式的地址赋给指针变量。 不能将一个非0整数直接赋给指针变量,但可以赋整数值0,表示该指针为空指针。 例如:int *p; p=0; p为空指针,不指向任何地址。,2019/4/9,10,3.允许声明指向 void 类型的指针,该指针可以被赋予任何类型对象的地址。 例如: void *general; int *point; int i; general=,2019/4/9,11,例5.2、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int x; int *p; int *q; int a=3; int *pa=
6、,2019/4/9,12,#include using namespace std; void main() int x=3,*ptr= /变量x的地址 ,2019/4/9,13,三、指针变量的使用 例5.3、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int x,*p; p= ,2019/4/9,14,指针在使用前要进行初始化或赋值,指针未赋值将非常危险。 #include using namespace std; void main() int x=26; int *ptr; *ptr=58; /此时ptr是一个随机地
7、址 coutxendl; 很可能已经破坏了另一变量的值,甚至修改了函数的返回地址等。,2019/4/9,15,5.3、简单变量与指针 指针的类型是它所指向变量的类型。指针值不是整型数,在使用中必须类型匹配。如: int x=26; int *ptr= 表示将变量x的地址值作为一个整型数赋给变量*ptr,即变量x。,2019/4/9,16,因为指针是有类型的,所以给指针赋值不但要是一个地址,而且应该是一个与该指针类型相符的变量的地址。或者说指针的类型是它所指向变量的类型。 float f=34.5, *fptr= /error:浮点指针赋给整型指针 将一个指针赋值给另一个指针,结果是两个指针指向
8、一个相 同的地址单元。,2019/4/9,17,例5.4、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int x,*p; x=3; p= ,2019/4/9,18,例5.5、输入a和b两个整数,运用指针技术按先大后小的顺序输出a和b。 源程序清单: #include #include using namespace std; void main(void) /利用间接访问方式来操作,2019/4/9,19,int a,b; int *p1= ,2019/4/9,20,指针变量的运算 指针的算术运算 指针加一,减一运算 是指
9、向下一个或前一个数据。 如:y=*px+ 相当于y=*(px+) /px为一指针 指针与整数的加减运算 指针 p 加上或减去 n ,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。 这种运算的结果值取决于指针指向的数据类型。,2019/4/9,21,2019/4/9,22,pb-1,pb,pb+1,pb+2,*(pb-1),*pb,*(pb+1),*(pb+2),int *pb,2019/4/9,23,#include using namespace std; void main() int n=20,*ptr= ,2019/4/9,24,关系运算 表示所指变量在内存中的位置关系 如
10、:两个指针变量指向同一个数组中的元素时,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系 char a10; char *p1,*p2; p1=a+2; p2=a+4; p1+;p2-; 指针可以和零之间进行等于或不等于的关系运算。 例如:p=0; /表示空指针,2019/4/9,25,例5.5、编写一交换两个整型变量值的函数,并写一主函数测试。 #include using namespace std; void swap(int*x,int*y) int t; t=*x,*x=*y,*y=t; void main() int a=1,b=2; cout“交换前: a=“a“,
11、b=“bendl; swap( ,2019/4/9,26,5.4、一维数组与指针 数组名可以拿来初始化指针,数组名就是数组第一个元素的地址,即对于数组a,有a= 对第i个元素可表示成以下四种: ai 、*(a+i) 、iptri 、*(iptr+i) 这四个等价关系使得数组与指针相互转换非常灵活。,2019/4/9,27,与上面相对应的有下面四个地址等价关系: &ai a+i iptr+i &iptri a+i表示第i个数组元素的地址,iptr+i也同样是指向数组a的第i个数组元素。,相互等价,2019/4/9,28,例5.6、求数组元素的和 #include using namespace
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针
链接地址:https://www.31doc.com/p-2566883.html