《第8章指针00002.ppt》由会员分享,可在线阅读,更多相关《第8章指针00002.ppt(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指针变量 若一个变量专用于存放另一个变量的地址(指针),则该变量称为指针变量。,指针的对象:当把变量的地址存入指针变量后,我们就可以说这个指针指向了该变量。变量的存取方法:直接存取和间接存取。,在C程序中,变量的地址可以通过运算符“&a:得到的是变量a的地址&b5:得到的是数组元素b5的地址在C语言中,指针被广泛应用,它和数组、字符串、函数间数据的传递等有
3、着密不可分的联系。,8.2 指针变量的定义和指针变量的基类型1指针变量的定义与初始化定义指针变量的一般形式为:类型名*指针变量名1,*指针变量名2,;其功能是定义指向给定“数据类型”的变量或数组元素的指针变量,同时给该变量赋“初值”。存储类型指出该指针变量的存储类型。定义时也可以给其赋初值,格式为:*指针变量名=初值;例如:int*pi,*pj=,2指针变量的基类型一个指针变量中存放的是一个存储单元的地址值。这里的“一”所代表的字节数是不同的:对整型而言,它代表2个字节;但对实型而言,它就代表4个字节。这即是不同基类型的含义。后面的章节中涉及到指针的移动,也就是要对地址进行增减运算,这时指针移
4、动的最小单位是一个存储单元,而不是一个字节。因此对于基类型不同的指针变量,其内容增1、减1所“跨越”的字节数是不同的。,8.3 给指针变量赋值8.3.1 给指针变量赋地址值一个指针变量可以通过以下三种方式获得一个确定的地址,从而指向一个具体的对象。(1)通过求地址运算(&为求地址运算符)此时,变量k的地址赋予了q,也可以说p指向了k。,(2)通过指针变量获得地址值可以通过赋值运算,把一个指针变量中的地址值赋给另一个指针变量,从而使这两个指针变量指向同一地址。例如,若有以上定义,则语句:p=q;使指针变量p中也存放了变量k的地址,也就是说指针变量p和q都指向了变量k。注意:在赋值号两边指针变量的
5、基类型必须相同。(3)通过标准函数获得地址值可以通过调用库函数malloc和calloc在内存中开辟动态存储单元,并把所开辟的动态存储单元的地址赋给指针变量。,8.3.2 给指针变量赋“空”值除了给指针变量赋地址值外,还可以给指针变量赋NULL值。例如:p=NULL;NULL是在stdio.h头文件中的预定义符。NULL的代码值为0,当p=NULL时,称p为空指针。因为NULL的代码值是0,所以上面语句等价于:p=0;或 p=0;这时,指针p并不是指向地址为0的存储单元,而是具有一个确定的值“空”。企图通过一个空指针去访问一个存储单元时,将会得到一个出错信息。,8.4 对指针变量的操作8.4.
6、1 通过指针来引用一个存储单元1取地址运算符(”返回的是数组元素a5的地址。(2)*运算符。为指针运算符,其作用是返回以操作对象的值作为地址的变量(或内存单元)的内容。,它们都是单目运算符,优先级高于所有的双目运算符,它们的结合性均是自右向左。在使用这两个运算符需要注意以下几点:(1)如果已经执行了“p=&a;”语句,若有&*p由于“&”和“*”两个运算符的优先级别相同,但按自右向左方向结合,因此先运算*p,它就是变量a,再执行&运算。因此它等同于&a。(2)*&a的含义是a。因为先进行&a运算,得到a的地址,再进行*运算,即&a所向的变量,因此*&a等价于a。(3)(*p)+相当于a+。注意
7、括号是必要的,如果没有括号,就成为*(p+),这时使指针变量本身增1,并不是使p所指的存储单元的值增1。,2通过指针引用存储单元例如:int*p,k=4,q;p=,间接访问运算符必须出现在运算对象的左边,其运算对象是地址或者是存放地址的指针变量。即*号右边也可以是地址值,如q=*(,8.4.2 移动指针移动指针就是指对指针变量进行加上或减去一个整数、或通过赋值运算,使指针变量指向相邻的存储单元。因此,只有当指针指向一串连续的存储单元时,指针的移动才有意义。当指针指向一串连续的存储单元时,还可以和指向同一串连续存储单元的指针进行相减的运算,除此之外,不可以对指针进行任何其他的算术运算。,8.4.
8、3 指针比较在关系表达式中,可以对两个指针进行比较,即两个变量地址的比较。如:p,q是两个指针变量,if(pq)printf(“p points to lower than q.n”);通常,两个或两个以上的指针指向同一目标时比较才有意义。,8.5 函数之间地址值的传递8.5.1 形参为指针变量时,实参和形参之间的数据传递指针可以作为参数在主调函数和被调函数之间传递数据 8.5.2 通过传送地址值,在被调用函数中直接改变调用函数中的变量的值,8.5.3 函数返回地址值函数值的类型不仅可以是简单的数据类型,而且还可以是指针类型。其一般形式为:类型名*函数名(形式参数说明列表)以下是几点说明:(1)存储类型有两种,static和extern,默认为extern.(2)“*函数名”不能写成“(*函数名)”,否则就成了指向函数的指针。(3)此类函数的调用形式通常是:p=函数名(实际参数列表),其中p通常是调用函数中定义的一个指针变量。,例:以下函数把两个整数形参中较大的那个数的地址作为函数值传回。int*f(int*,int*);main()int*p,a,b;printf(“enter a number:“);scanf(“%d%d”,