C语言的精髓——指针详解_第1页
C语言的精髓——指针详解_第2页
C语言的精髓——指针详解_第3页
C语言的精髓——指针详解_第4页
C语言的精髓——指针详解_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

C 语言的精髓语言的精髓指针详解指针详解 朱有鹏 1.2、指针变量的类型作用、指针变量的类型作用 对于普通变量的来说,其类型的作用主要有这么几个方面: (1)程序员写代码时识别用:不涉及强制转换时,知道该变量中应该存放 什么类型的数值。 (2)空间大小的说明:比如 int 为 4 个字节空间 (3)存储结构说明:float 和 int 虽然空间大小都是 4 字节,但是其存储结构 完全不同 对于指针变量来说,其类型的作用与上面基本一致,只是其类型是由普通类 型+*构成,*个数表明了指针变量的级数,指针变量用来存放地址。当不涉及强 制转换时,其对应关系为: 某类型一级指针变量 = 该类型一级地址 某类型二级指针变量 = /初始化一下,防止野指针 (2)关联 例: int a= 10; p = *靠前靠后都没关系,这时的*与 p 是两个不同的东西,星号表明 p 是一个一 级指针变量,用于存放一个一级地址。但是需要注意下面的情况: int *p1,*p2;/p1 和 p2 都是 int 型的一级指针变量。 int *p1,p2;/p1 是 int 型的一级指针变量,p2 只是一个普通的 int 型变量。 第二种就是解引用,解引用时,*p 表示的就是 p 所指向的空间,这时的*也 称为取空间操作,找到 p 所指向的空间,必须强调的是,这时的*p 是一个整体, 不能割裂来看,比如: int *p = &a; *p = 10;/等价于 a=10;但是写成*p = 10;就不对了 *作为解引用时(也就是取空间操作时) ,得到 p 所指向的空间后,我们的用 途有两种,一个是读空间内容,还 有就是向空间写入新的内容。 2.2、取地址符、取地址符&的理解的理解 取地址符使用时,直接写在变量名称的前面,然后&和变量一起构成了一个 新的符号,表示变量空间的首地址,准确讲是变量的首字节地址。比如 int a;int *p = &a;这里必须注意,&a 是一个完整的不可分割的整体,之所以用这种方式 来表示空间的地址,是因为我们没有办法直接得到变量 a 的地址,只能是使用 &a 来表示,当编译时会将&a 变成 a 空间的地址赋值给 p; 2.3、指针变量的初始化和指针变量赋值之间的区别、指针变量的初始化和指针变量赋值之间的区别 首先必须强调,指针变量的初始化与普通变量的初始化没有任何区别,只是 指针变量里面的存放的是一个特殊的值“地址” ,这个值具有指向作用,可以用 来访问它所指向的空间,如果你刨去它地址的含义,实际上变量中存放的不过就 是一个普通值。 (1)指针变量的初始化 Int a=10; Int *p=&a; 此时的*,只是说明 p 是一个一级指针变量,不能把这时的*当成了解引 用。 (2)指针变量的赋值 Int a=10; Int *p=NULL; p=&a;/将 a 空间地址的赋值给 p 不少同学可能一直觉得 p=&a,应该写成*p=&a;这是错误的理解,这时的* 是取空间操作, 如果写成*p=&a, 就表示将 a 的空间地址存放到 p 所指向的空间, p 所指向的空间其实就是 a,*p=&a 的等价写法就是 a=&a;相当于把地址给了 a 自己,显然是不对的。 (3)初始化和赋值注意点 从形式上看,我们已经知道了初始化和赋值的区别,同时要知道初始化只能 有一次,但是赋值可以有多次。 2.4、左值与右值、左值与右值 (1)什么是左值和右值 比如:int a=10;等式的左边称为左值,右边称为右值。 (2)左值 在 c 语言中,左值指的都是变量空间。对左值执行的操作都是写空间操作。 (3)右值 在 c 中,右值有两种形态,一种是直接写一个数值,比如 int a=10;就是典 型的这种情况。 那么另外的一种情况就是, 右值可能也是一个变量, 比如 int b=10; int a=b;这个时候右值就是一个变量。当变量作为左值是,对变量实现的是写操 作,如果变量作为右值时,对变量实现的是读操作,读出后赋给右值,这一点要 了解。 2.5、定义指针后,需要会关心的一些内容、定义指针后,需要会关心的一些内容 (1)例子 1 Int a =10; Int *p=&a; 合理我们必须了解与指针变量 p 相关的一些内容。 p:表示 int*型的一级指针变量空间,里面存放的是变量 a 的地址。 *p:表示 p 所指向的空间,指的就是 a 的空间,只不过是通过地址找到的。 &p:表示指针变量 p 自己的空间地址,它需要是 int *的二级指针变量来存 放。 思考一下,*p=20 可不可以? 回答:不可以,*p 改写成等价形式*(*p) ,里面的*p 等价于 a,最后变成 了*a,由于 a 的值等于 10,*a 就是*10,引用地址 10 所指向的空间,显然 10 这个地址指向的空间是不存在的,所以错误。 (2)例子 2: Int a =10; Int *p=&a; Int *p1=&p; 对于指针变量 p,需要关心 p、*p、&p,但是在上例中已经描述过了,不再 赘述。 对于指针变量 p1 来说,需要如下几个方面的问题: p1:一个 int *型的二级指针变量空间,用于存放一个二级地址,恰好*p 的 地址就是二级地址。 *p1:引用取空间操作,找到 p1 所指向的空间,指的就是 p 的空间。 *p1:将其中的*p1 替换成为 p,*p1 就变成了*p,指的就是 a 的空间。 &p1:指的是二级指针变量 p1 的空间地址,是一个三级地址。 只要大家理解前面的例子 1 和例子 2, 对于三级指针的情况, 道理是类似的, 但是我们前面就说过,构建三级以上的指针实际上没有太大的意义,除了某些极 少数的情况外,并不会为我们的程序带来多少好处。 思考一下:*p1 可不可以? 答:不可以,根据取空间操作,*p1 最终变成了*10,显然也是错误的。 (3)多级指针链断线的问题 Int a =10; Int *p; Int *p1=&p; Int b=*p1; *p1,原是想通过*p1 访问到 a 的空间,将 a 空间的内容赋给 b,但是这里 是不对的,因为中间的指针变量 p 并没有

温馨提示

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

评论

0/150

提交评论