目录
1. 内存和地址(指针)
1.1内存
你住在万国大酒店的3楼342房间,你告知你的朋友来万国大酒店耍耍,但是你并没告诉他具体位置。你的朋友只能挨个房间找,这样的效率很低。
但如果你告诉了他具体位置,他就能很快找到你的位置,提升效率。
我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那这些内存空间如何高效的管理呢?
内存划分为⼀个个的内存单元,并且每个内存单元的大小取1个字节。

每个内存单元(1字节对应8比特位)都有对应的编号,cpu就可以快速找到一个内存空间。
所以我们可以理解为:内存单元的编号 = 地址 = 指针
1.2知识引入— —如何理解编制
那么,cpu是如何访问内存中的某个字节空间呢?
其实,硬件设计的时候地址编号已经设计好了

地址总线:若是32位机器则有32根地址总线,每根线只有两态,表示0,1【电脉冲有无】,那么⼀根线,就能表示2种含义,2根线就能表示4种含义,依次类推。32根地址线,就能表示2^32种含义,每⼀种含义都代表⼀个地址。
cpu访问内存:若创建了一个变量a,那么会向内存申请空间,当cpu要访问内存时,需要先通过控制总线读取内存中对应的编址,再通过数据总线传输回来。
2. 指针变量和地址
2.1&和*的引入
& --> 取地址操作符:拿到一个元素的地址
* --> 解引用操作符:通过存放的地址,找到指向的空间


疑问:如果目的只是改变a的值,那么为何不直接改变a的值,而要通过指针大费周章地交给p来操作呢?
其实这里是把a的修改交给了pa来操作,这样对a的修改,就多了一种的途径,写代码就会更加灵活,后期慢慢就能理解了。(有种老大哥把事情交给小弟做的感觉)
2.2指针变量的大小
32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,一个地址就是32个bit位,需要4个字节才能存储。
同理,64位机器需要8个字节才能存储。
为了验证我们的想法,我们可以写以下代码


3. 指针变量类型的意义
指针变量的大小和类型无关,只要是指针变量,在同一个平台下,大小都是一
样的,那为什么还要有各种各样的指针类型呢?其实指针类型是有特殊意义的。
3.1指针的解引用

调试我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节改为0。
结论:指针的类型决定了,对指针解引用的时候有多大的权限(⼀次能操作几个字节)。
比如:char* 的指针解引用就只能访问一个字节,
int* 的指针的解引用就能访问四个字节。
3.2指针±整数



可以发现对pa+1一次能跳过四个字节,而对pc+1一次只能跳过一个字节。
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。
比如:char* 的指针解引用就只能跳过一个字节,
int* 的指针的解引用就能跳过四个字节。
3.3void*指针
⼀种特殊的类型是void * 类型的,可以理解为无具体类型的指针
(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址。

局限性
想通过*void指向的值并不能被改变,无法直接进行指针运算

4. const修饰指针
变量是可以修改的,但如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?就需要使用到const
4.1const修饰变量
const修饰的变量是常量还是变量?
在C语言中,这里的n是常变量,num的本质还是变量,因为有const修饰,编译器在语法上不允许修改这个变量。
在C++中,这里的n就是常量。
C语言环境中

C++环境中
我们知道数组里的值必须为常量,而这里为何可以放变量n呢?这是由于n被const修饰而不能被修改,n就为常量了,这是在C++中规定的。

漏洞
我们发现不能直接改变这个被const修饰的值,那是否有别的办法间接改变这个变量的值呢?
答案是肯定的,我们可以通过指针的方式改变变量的值(相当于你这个老大不想做,把这件事交给你的小弟做)。

4.2const修饰指针变量
⼀般来讲const修饰指针变量,可以放在*的左边,也可以放在*的右边,意义是不⼀样的。
const修饰在*左边
当const修饰的是指针指向的内容(*p),不能通过指针来改变。但是指针变量本⾝的内容可变。


const修饰在*右边
const如果放在*的右边,修饰的是指针变量本⾝,指针变量的内容不能修改。但是指针指
向的内容,可以通过指针改变。


结论
1.const如果放在*的左边,修饰的是指针指向的内容,保证指针
指向的内容不能通过指针来改变。但是指针变量本⾝的内容可变。
2.const如果放在*的右边,修饰的是指针变量本⾝,保证了指针
变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
28万+





