c语言的精髓是指针,C语言的精髓——指针详解

41528d3028836879cd698677c3999917.gifC语言的精髓——指针详解

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 并没有指向 a,指针链断线了,所以我们在使 用多级指针的时候,必须注意构建的指针链是否完整。当然这里因为是直接写的 比较好理解,如果多级指针链是通过传参的方式来构建的话,很容易出现断链的 情况,造成的影响就是,要么访问到是空指针,要么访问到了不该访问的地方, 导致严重错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值