C语言指针的心得体会~

C语言学了这么些天数,果然遇到的第一个难点就是指针~

指针学习就要结束了,先记录并梳理一下来自己初步理解的内容:

在梳理指针之前;

首先要明白虚拟内存中,是存在连续的,线性排列的内存块,每个内存地址代表一内存块,每一内存块占用一字节。每个内存块都拥有自己的地址,都可以存储一字节即八位的二进制数据。

然后是有关指针的内容:

1,指针一般在内存中定义为四个字节,和数据变量一样,它也具有地址,和数据变量不同,他存放的只能为其他变量的地址。

2,指针是也是一种数据类型,它不是单独存在的类型,它是由其他类型派生而来的。(例如类型可以是:指向int的指针类型)

3,一般我们称为的指针具有的属性为三,一为指针类型,二为指针类型的名称即变量,三为指针的内容即指针地址。

举例:int *p = #  那么,int* 为指针类型,p为指针类型的变量,&num为指针类型的值即一个内存地址。

4,一般我们把指针类型的值即指针存储了地址称之为指向,譬如指针A指向变量a就是指针A存储了变量a的地址。

5,指针类型的值仅仅是一段连续内存的首个地址,就是它只能存储一个内存块的地址。

6,数据一般由多个字节组成即占用多个内存块,而指针只能存储一个内存块的的地址,这导致我们解引用时只能读取到一块内存的数据,读取char类型数据还好,可一旦读取长字节数据,就会出现问题。为了避免出现这种问题,就有了指针类型的出现,当我们定义指针类型为int型时,这就导致指针解引用时在对应的内存块依次读取(四个内存块)四个字节的内容。

7,指针类型的定义一定要看指针所指变量的数据类型,指针的类型一定要和所指变量的数据类型一致,原理如上一条。

8,指针p指向存放数据的变量,那么p就是一级指针。若指针p指向另一指针变量,那么它就是二级指针,若p指向指向指针的指针,那么p就是三级指针,可以依次类推。

9,指针的赋值就是取得变量的地址,取址符&。指针可以直接取得数据变量的地址,那么此此指针就是一级指针。

10,指针的赋值非常讲究,编译器只可将两边等级相同的指针着完成赋值。倘若我希望定义指针p为三级指针来操控二级指针q所操控的数据,那么我需要取得二级指针q的地址来赋值给p。所以在很多地方,尤其是存放字符串的指针数组这里,想要输出字符串一定要考量好了该定义几级指针来存放指针数组的指针地址,因为字符串指针为一级,指针数组内的指针元素为二级,指针数组的指针为三级指针,你至少需要定义一个四级指针才能存放指针数组内嵌的指针的地址。

11,用指针输出数据时,需要用到解引用,字符为*,它的功能就是按地址寻此地址对应的变量并获取变量存储的内容,可以获取数据,也可以获取地址,当获取了地址时,倘若为print函数用f%d做输出,是不能立即输出的,需要再次解引用,知道拿到数据为止,倘若输出为%s,是可以直接取出字符串地址给printf输出的。

12,有一规律就是定义几级指针,输出时就解引用几次。

13,数组具有内嵌的指针,可以用数组名来表示,这个内嵌指针的地址为数组首元素地址,这个指针存放的数据为数组首元素的地址。即对与这个内嵌指针来讲,它的地址 = 它的数据 。

14,指针数组*p[5]为长度为5元素均为指针的数组,数组名为p,数组具有内嵌指针就是p,算上数组元素是指针,p为二级指针。数组名p就是数组的指针,进行指针运算时每对p进行+1,就得到了数组下个元素的地址,p的步长为1。

15,数组指针(*p)[5]为指向长度为5没有名字的数组的指针,p是一个指针,是单独的指针,它所指向的数组没有名字,所以数组的内嵌指针不好表示,但是也是存在的,数组内嵌的指针就是一级指针。那么指向这个数组的指针p同样也就是二级指针,但对p运算时p的步长为5,这是由于p为单独的,指向整个数组的地址有关,p每加一跨度都是整个数组。

16,前面说过,数组的内嵌的指针本身的地址等于数组首元素的地址,所以,当数组指针解引用的时候,根据地址寻到的就是数组内嵌指针存储的地址,也是数组首元素的地址,不过这次对地址进行运算,一级指针的运算,跨度就不是整个数组的跨度了,而是1。

17,***p与*(*p)[5]为同级指针(均为三级),只是进行指针运算时解引用之后的指针步长不同。

以后遇到有关指针新的心得体会,可以回来修正或者增添。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值