第8章指针00002

上传人:s9****2 文档编号:584081019 上传时间:2024-08-30 格式:PPT 页数:20 大小:349.02KB
返回 下载 相关 举报
第8章指针00002_第1页
第1页 / 共20页
第8章指针00002_第2页
第2页 / 共20页
第8章指针00002_第3页
第3页 / 共20页
第8章指针00002_第4页
第4页 / 共20页
第8章指针00002_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《第8章指针00002》由会员分享,可在线阅读,更多相关《第8章指针00002(20页珍藏版)》请在金锄头文库上搜索。

1、本章要点本章要点:8.1 变量的地址和指针 8.2 指针变量的定义和指针变量的基类型 8.3 给指针变量赋值8.4 对指针变量的操作 8.5 函数之间地址值的传递 第8章 指针8.1 变量的地址和指针1变量及其地址在C的程序中要定义许多变量,用来保存程序中用到的数据,包括输入的原始数据、加工的中间结果及最终数据。C编译系统会根据定义中变量的类型,为其分配一定字节数的内存空间(如字符型占1个字节,整型占2字节,实型占4字节,双精度型占8字节等),此后这个变量的地址也就确定了。 例如有变量定义语句:char a, int b, float c; 编译系统给变量分配的存储空间如图8-1所示。图8.1

2、 变量分配的存储单元与地址C语言规定,当一个变量占用一个字节时,该字节的地址就是该变量的地址,如果变量占用连续的多个字节,那么第一个字节的地址就是该变量的地址。 变量的地址起到了寻找变量的作用,好象是一个指针指向了变量,所以常把变量的地址称为“指针”。2指针变量 若一个变量专用于存放另一个变量的地址(指针),则该变量称为指针变量。指针的对象:当把变量的地址存入指针变量后, 我们就可以说这个指针指向了该变量。变量的存取方法:直接存取和间接存取。 直接存取:直接存取:直接根据变量名存取数据。直接根据变量名存取数据。 间接存取:间接存取:通过指针变量存取相应变量的数据通过指针变量存取相应变量的数据。

3、 在C程序中,变量的地址可以通过运算符“&”来得到,该运算符称为“取地址”运算符,它的运算对象是变量或数组元素,得到的结果是变量或数组元素的地址。例如:int a,b10;&a: 得到的是变量a的地址&b5: 得到的是数组元素b5的地址在C语言中,指针被广泛应用,它和数组、字符串、函数间数据的传递等有着密不可分的联系。 8.2 指针变量的定义和指针变量的基类型1指针变量的定义与初始化定义指针变量的一般形式为: 类型名 *指针变量名1,*指针变量名2,;其功能是定义指向给定“数据类型”的变量或数组元素的指针变量,同时给该变量赋“初值”。存储类型指出该指针变量的存储类型。定义时也可以给其赋初值,格

4、式为:*指针变量名=初值;例如:int *pi, *pj=&a;2指针变量的基类型一个指针变量中存放的是一个存储单元的地址值。这里的“一”所代表的字节数是不同的:对整型而言,它代表2个字节;但对实型而言,它就代表4个字节。这即是不同基类型的含义。后面的章节中涉及到指针的移动,也就是要对地址进行增减运算,这时指针移动的最小单位是一个存储单元,而不是一个字节。因此对于基类型不同的指针变量,其内容增1、减1所“跨越”的字节数是不同的。8.3 给指针变量赋值8.3.1 给指针变量赋地址值一个指针变量可以通过以下三种方式获得一个确定的地址,从而指向一个具体的对象。(1)通过求地址运算(&)获得地址值一般

5、格式为: 指针变量名地址表达式例如:int k, *p, *q; q=&k;(&为求地址运算符)此时,变量k的地址赋予了q,也可以说p指向了k。 (2)通过指针变量获得地址值可以通过赋值运算,把一个指针变量中的地址值赋给另一个指针变量,从而使这两个指针变量指向同一地址。例如,若有以上定义,则语句:p=q;使指针变量p中也存放了变量k的地址,也就是说指针变量p和q都指向了变量k。注意:在赋值号两边指针变量的基类型必须相同。(3)通过标准函数获得地址值可以通过调用库函数malloc和calloc在内存中开辟动态存储单元,并把所开辟的动态存储单元的地址赋给指针变量。8.3.2 给指针变量赋“空”值除

6、了给指针变量赋地址值外,还可以给指针变量赋NULL值。例如:p=NULL;NULL是在stdio.h头文件中的预定义符。NULL的代码值为0,当p=NULL时,称p为空指针。因为NULL的代码值是0,所以上面语句等价于:p=0; 或 p=0;这时,指针p并不是指向地址为0的存储单元,而是具有一个确定的值“空”。企图通过一个空指针去访问一个存储单元时,将会得到一个出错信息。8.4 对指针变量的操作8.4.1 通过指针来引用一个存储单元1取地址运算符(&)和指针运算符(*)与指针有关的运算符主要有两个,分别是“取地址运算符(&)”和“指针运算符(*)”。(1)&运算符。为取地址运算符,其作用是返回

7、操作对象(变量或数组元素)的地址。例如,“&x;”返回变量x的地址,“&a5;”返回的是数组元素a5的地址。(2)*运算符。为指针运算符,其作用是返回以操作对象的值作为地址的变量(或内存单元)的内容。 它们都是单目运算符,优先级高于所有的双目运算符,它们的结合性均是自右向左。在使用这两个运算符需要注意以下几点:(1)如果已经执行了“p=&a;”语句,若有&*p由于“&”和“*”两个运算符的优先级别相同,但按自右向左方向结合,因此先运算*p,它就是变量a,再执行&运算。因此它等同于&a。(2)*&a的含义是a。因为先进行&a运算,得到a的地址,再进行*运算,即&a所向的变量,因此*&a等价于a。

8、(3)(*p)+相当于a+。注意括号是必要的,如果没有括号,就成为*(p+),这时使指针变量本身增1,并不是使p所指的存储单元的值增1。2通过指针引用存储单元例如: int *p, k=4, q; p=&i;则赋值语句q=*p;就是把p所指存储单元(k)的内容(整数4)赋予变量q,这里的*p代表p所指向的变量i。因此,上面的语句等价于q=k;间接访问运算符必须出现在运算对象的左边,其运算对象是地址或者是存放地址的指针变量。即*号右边也可以是地址值,如q=*(&k);表达式&i求出变量i的地址,以上赋值语句表示取地址&k中的内容赋给q。由于*和&的优先级相同,且自右向左结合,因此表达式中的括号可以省略,即q=*&k;下面的语句取指针变量p所指向的存储单元中的内容加1后赋给变量q。q=*p+1;8.4.2 移动指针移动指针就是指对指针变量进行加上或减去一个整数、或通过赋值运算,使指针变量指向相邻的存储单元。因此,只有当指针指向一串连续的存储单元时,指针的移动才有意义。当指针指向一串连续的存储单元时,还可以和指向同一串连续存储单元的指针进行相减的运算,除此之外,不可以对指针进行任何其他的算术运算。 8.4.3 指针比较在关系表达式中,可以对两个指针进行比较,即两个变量地址的比较。如:p,q是两个指针变量,if(p*j) return i; return j;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号