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修饰指针变量
上图是指针要了解的知识
这个就是const修饰*p使得*p不能修改n的值,但是p 本身可以变
这个就是const修饰p使得p不改变,但是p 可以修改n的值
所以得此结论:
总结:
这便是今天所学内容,有些截图是自己敲的,有些则是借鉴。但是自己梳理了一遍发现,光看完视频是没有用的,还忒自己在搞一边,这些只是一部分等后续再学完会一一总结出来,这里面也有很多不足之处,希望大家多多发现,多多提问题,这样才能我才能更加进步,才会写的博客一篇比一篇好,谢谢!