c语言学习文档之指针培训.ppt

上传人:F****n 文档编号:97201951 上传时间:2019-09-02 格式:PPT 页数:29 大小:191.50KB
返回 下载 相关 举报
c语言学习文档之指针培训.ppt_第1页
第1页 / 共29页
c语言学习文档之指针培训.ppt_第2页
第2页 / 共29页
c语言学习文档之指针培训.ppt_第3页
第3页 / 共29页
c语言学习文档之指针培训.ppt_第4页
第4页 / 共29页
c语言学习文档之指针培训.ppt_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《c语言学习文档之指针培训.ppt》由会员分享,可在线阅读,更多相关《c语言学习文档之指针培训.ppt(29页珍藏版)》请在金锄头文库上搜索。

1、第8章 指针,8.1 变量的地址和指针,2.数据在内存中的存储方式: 按数据类型在内存为其分配一定数量的存储单元(字节)。,1.内存单元的地址: 计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就称为内存地址,3.内存单元的内容: 即变量的值。,例如有定义: short int a,b; char c; float x; 变量a,b,c,x的内存分配情况:,每个变量的地址是指该变量所占存储单元的 第一个字节的地址,称为指针。,4. 计算机中数据存取方式 A、变量的“直接访问”方式: 按变量的地址存取变量值的方式。(见下图),编译器自动完成,间接访问方式示意图:,

2、将变量的地址放在另一个特殊的变量中,先到另一个变量所表示的存储单元中取得变量的地址,再由变量的地址找到变量并进行数据存取(见下图)。,b.变量的“间接访问”方式,变量pointer为指针变量,存放的是变量i的内存地址,我们说pointer指向 i。,6.指针的概念: 一个变量的首地址称为该变量的指针。 用来专门存储变量指针的变量称为指针变量。,8.2 指针与变量,一. 指针变量的定义,1. 定义方式: 类型标识符 *指针变量名1,*指针变量名2 ;,例:float *p1; (定义了p1为指向实型变量的指针变量) char *p2; (定义了p2为指向字符型变量的指针变量),标识符前面的“*”

3、,表示该变量为指针 变量。但指针变量名是*后面的名字(不包括“*”)。,3.说明,2. 指针变量的三要素: 指针变量的基类型: 和其所指变量的类型一致; 指针变量的值:另一个变量在内存的地址; 指针变量的名字:符合用户标识符规则。,指针变量名=某一地址;,8.3.指针变量的赋值,方式1: 指针变量名=,方式2: 指针变量名=另一已经赋值的指针变量;,方式3: 通过标准的库函数(malloc和calloc在内存中开辟动态存储 单元),例如: int i,*p,*q; p= /*方式2*/,示意图,说明:给指针变量赋“空”值 除了给指针变量赋地址值外,还可以给指针变量赋NULL 值。 如:p=Nu

4、ll; Null是在stdio.h头文件中定义的预定义符。在使用前必须 使用预定义行:#include 。Null的代码值为0, 当执行以上赋值语句后,称p为空指针。等价于: p=0 ; 或 p=0 注意:这时指针p不是指向地址为0的存储单元,而是一个 具有一个确定的值“空”。企图通过一个空指针去访问一 个存储单元,将会得到一个出错信息。,国家等级考试练习,1.已知 int a=3, a的地址为1001,则&a= ?,1001,2.设有定义:float x; 则以下对指针变量p进行定义且赋初值的语句中正确的是: a) float *p=1024; b) int *p=(float)x; c)

5、float p=&x d) float *p=&x,D,4.有以下程序段 #include main() int n,*p=NULL; *p=,A,8.4.对指针变量的操作,1.通过指针来引用一个存储单元 C语言提供了一个称作“间接访问运算符”(间接运算符)的单目 运算符:“*”,当指针变量有确切的地址值时,就可以通过间接 访问运算符引用该地址指向的存储单元。 如: int *p,i=10,j; p=,说明:把p所指向的存储单元(i)的值赋给j,*p代表p所指向的 变量i,以上语句等价于: j=i;,分析以下表达式的含义:,j=*(,int *p,i=10,j; p=,例子:例8.1,2.算术

6、运算(移动指针) 例如: int *p,i; char *q , c; p=,/*运算示例*/ p+;q+;,对指针进行加减运算时,数字“1”不代表十进制整数“1”, 即不是移动一个字节,而是移动一个存储单元长度。,例如:右图1 pq为假。,例如:右图2 int a10; int *p,*q; p=*/ 求pq为真为假?,2.比较运算,例 main() int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1= ,程序运行结果: 100,10 100,10,思考: 1.若已执行了“pointer_1=&a”,则: “&*pointer_

7、1”的含意是什么? (答:相当于&a ),2. *&a的含意是什么? (答:a ),3. (*pointer_1)+相当于什么? (答:a+ ),例对输入的两个整数按大小顺序输出 main() int *p1,*p2,*p,a,b; a=5;b=9; p1= ,if (ab) p=p1; ,p1=p2; ,p2=p; ,printf(“a=%d,b=%dn“,a,b); printf(“max=%d,min=%dn“,*p1,*p2);,-指向指针变量的指针. 定义形式: 类型 *变量名; 例如: int i,*p,*q; i=30; p=,指针的指针,国家等级考试练习:,1.设有定义:int

8、 n1=0,n2,*p= b.p=q c.*p=&n1 d. p=*q,A,2.若有说明语句:double *p,a;则能通过scanf语句正确给输入 项读入数据的程序段是: a.*p=,D,3.已定义以下函数 int fun(int *p) return *p; fun函数的返回值是: a.不确定的值 b.一个整数 c.形参p中存放的值 d.形参p的地址值,B,8.5 函数之间的地址值传递,1.形参为指针变量时实参和形参之间的数据传递 若函数的形参为指针类型,调用该函数时,对应的实参必须是 基类型相同的地址值或者是已指向某个存储单元的指针变量。,例.编写函数myadd(int *a,int

9、*b),函数中把指针a和b所指向的存储 单元中两个值相加,然后将和的值作为函数值返回。,#include int myadd( int *a,int *b) int sum; sum=*a+*b; return sum; ,main() int x,y,z; printf(“enter x,y:”); scanf(“%d%d”, ,思考:如果在被调函数中改变形参的值将如何呢?,2.通过传送地址值在被调用函数中直接改变调用函数中变量的值,#include “stdio.h” Void swap(int *,int *); Void main() int x=30,y=20; printf(“(1

10、) x=%d y=%dn”,x,y); Swap( ,输出结果: x=30 y=20 a=30 b=20 a=20 b=30 (4) x=20 y=30,例:8.4,void swap(int *x1,int *x2) void order(int *a,int *b),3. 指针函数(函数返回地址值),1. 一个函数可以带回整型值、实型值、字符 型值,也可以带回指针类型的数据,即地址。 返回值是指针类型的函数,称为指针函数。,2. 一般定义形式为: 类型标识符 *函数名(参数表); 例如: int *a(int x,float y) ,3.说明,对于定义: int *a(int x, float y) a是函数名,调用它后能得到一个指向整型数据的指针(地址)。 x,y是函数a的形参。 这个函数前面有一个*,表示此函数是指针类型函数(函数值是指针)。,main() int a,b,*p; int *max( ); scanf(“%d,%d”, ,指针函数应用举例,int *max(int x,int y) if(xy) return( ,国家等级考试练习:,1.以下叙述中错误的是: a.改变函数形参的值,不会改变对应的实参 b.函数可以返回地址值 c.可以给指针变量赋一个整数作为地址值 d.当在函数的开头中包括头文件stdio.h时,可以给变量赋NULL,C,

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

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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