深入理解指针(1)

1.什么是指针

在深入理解指针之前我们要先搞明白什么是指针。

所谓指针就是“地址”那什么是地址呢?地址就是“内存单元的编号”?那怎么理解内存单元编号

.这里引用鹏哥的例子容易理解  :有一栋宿舍楼,那么这栋宿舍就是内存   而这栋宿舍楼中的每一个房间就是一个个的单元,但是光有房子还不行查找起来非常麻烦,所以还要给房间编上号码,这样就形成了这栋楼的房间单元编号,而这就是“内存单元编号” 也就是“地址”,地址的名字就是“指针”。

so,内存单元编号 =地址 = 指针。但是这里的指针不是我们口头上的指针,我们口头上的指针其实是“指针变量” 。那什么是指针变量呢?这里先存疑下面会说明白。

这里要给大家补充几点关于内存的知识点:

内存其实是被划分为分为不同的内存单元,每一个内存单元大小是一个字节,而一个字节又划分为八个比特位,而一个比特位可以存放一个二进制的0或1。

2.指针变量和地址

2.1.取地址操作符

在c语言中创建变量就是在向内存申请空间。比如:

 就像是最右边那样,创建了一个变量就向内存申请了4个字节的空间,而每一个字节都有自己的一个空间   所以我们该如何找出a的空间呢?当然是   &     这个符号,“取地址操作符”就是之前scanf函数一直在用的。    

那这个操作符怎么用呢?别急,给个例子 :  

这里有个知识点:  &(取地址操作符)   它的占位符是%p。按照这个图打印出来就是012FF994  

所以&a取的地址就是四个字节中所占最小的那个字节的地址,下面我在把图放过来看一下。

2.2.指针变量和解引用操作符(*)

2.2.1指针变量

ok了存疑的指针变量来了

假如说,我们通过 & 知道了a的地址012FF994我们又想把它存起来怎么办?这时候就要用到指针变量

举个例子:

这里的p就是指针变量,指针变量也是变量,这种变量就是用来存放地址的,存放在指针变量里的值都会被理解为地址。“指针变量”  这就是我们口头所说的指针。 

2.2.2如何拆解指针类型

了解了指针变量我们是否对int *p = &a这个表达式感到疑惑?那就来解答一下:

“*p”通俗的讲是指针指向的对象a,专业一点“*p”表示指针指向的内存地址中存放的内容;“p”表示地址;“&a”表示取a的地址;p就是用来存地址的所以p =&a“*” 是在说明p是指针变量,而前面的int则是表明p指向整型(int)类型的对象。

如果是char类型的变量ch,ch的地址要放在什么类型的指针变量中呢?

char ch = 'w';

pa = &ch;

char *pa = &ch;

2.2.3解引用操作符(*)

我们了解了指针,也知道指针要保存在指针变量中但是怎么去使用呢?

嘎嘎重点:解引用操作符(*)它的作用是获取指针指向的值。指针是一个变量,他储存了另一个变量的内存地址。可以使用解引用操作符来获取(访问)或者修改该指针指向内存空间的值。这里就是用解引用操作符来修改的,之后会用到访问,在这里先提一嘴。

这里我们可以看一下*p的操作*p就是*通过p中存放的地址,找到指定的空间,这块空间可不是地址而是值。*p其实就是a的变量,所以*p = 20;这个操作符就是把a的值改成20,这就是解引用的作用。

但是把a改成20可以直接给a在赋值就行了那为什么还要用指针,其实这里只是表达的一种方法多了一种途径以后会就用到的。

 2.3指针变量大小 

 指针变量的大小取决于地址的大小

32位平台下地址是32个比特就是四个字节

64位平台下地址是64个比特就是八个字节

为什么上面说的是指针变量的大小会随平台变换而变换,但是上面代码图片测的是int*   char *的字节? 这三段就是解释

int *p = &a为什么sizeof(p)和sizeof(int *)同一个意思 一样

在C语言中,`sizeof(p)` 和 `sizeof(int *)` 确实会返回相同大小的结果,前提是这里的 `a` 是一个 `int` 类型的变量。这是因为 `p` 是一个指向 `int` 的指针,无论它指向的是哪个具体的 `int` 类型的变量,指针本身的大小都保持不变。

在32位系统中,指针的大小通常是4个字节。在64位系统中,指针的大小通常是8个字节。这取决于操作系统和编译器的具体实现。

                                          x86就是32位的环境 x64就是64位的环境

下面是重点!!!

那既然指针变量的大小和类型无关,只要是指针变量,在同一个平台下,大小都是一样的,那为什么还还有各种各样的的指针类型呢?接下来要重点说说这个知识了。

                                 3.指针变量类型意义 

3.1指针的解引用

                                                                                                                            

上面这些代码将n的4个字节全部改成了0。但是下面的那些代码只是将n的第一个字符改成0 

         3.2指针+-整数     
   

                          
3.3void指针 

void这个函数可以理解为无类型的函数,可以接受任意类型的地址但是有个局限性就是不能加减不能解引用。为什么呢?

如果是int *类型的指针变量的话+1是跳过4个字节但是你都无类型了怎么去跳过字节,解引用也是一样的int *类型的指针能访问4个字节无类型就访问不了呗。

                              4.const修饰指针

4.1const修饰变量

变量可以通过指针被修改如:这只是个例子

变量可以被修改,但是如果不想被修改怎么办?这时候就要用到const

但是我们绕过n,使用n的地址去修改n就能做到,虽然是在打破规则

那怎么才能让p拿到n的地址也不能修改n呢?接下来就涉及到const修饰指针变量 

4.2 const修饰指针变量 

 

上图是指针要了解的知识

int * p;                                    
int const * p;                             const可以放到*的左右两边,表示的意义不同
*
int * const p;
   

这个就是const修饰*p使得*p不能修改n的值,但是p 本身可以变

这个就是const修饰p使得p不改变,但是p 可以修改n的值

所以得此结论:

 总结:

这便是今天所学内容,有些截图是自己敲的,有些则是借鉴。但是自己梳理了一遍发现,光看完视频是没有用的,还忒自己在搞一边,这些只是一部分等后续再学完会一一总结出来,这里面也有很多不足之处,希望大家多多发现,多多提问题,这样才能我才能更加进步,才会写的博客一篇比一篇好,谢谢!

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值