目录
前言
在学习指针之前,我们先浅了解一下指针是个什么东西,指针其实是一种数据类型,用于存储变量的内存地址。简单来说,可以将指针想象成一个指向内存中某个存储单元的箭头,通过这个箭头可以找到存储单元中实际存储的值。
1.内存和地址
对于指针,我们将它理解为地址,生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。每个内存单元也都有⼀个编号(这个编号就相当于宿舍房间的门牌号),有了这个内存单元的编号,CPU就可以快速找到⼀个内存空间,C语言中给地址起了新的名字叫:指针
内存单元的编号 == 地址 == 指针
2.指针变量和地址
2.1取地址操作符(&)
在C语⾔中创建变量其实就是向内存申请空间
⽐如,上述的代码就是创建了整型变量a,内存中申请4个字节,⽤于存放整数10,其中每个字节都有地址。
那如何才能得到a的地址呢?
现在就学习了一个操作符——(&)取地址操作符
按照我画图的例子,会打印出:0137FCEC
&a取出的是a所占4个字节中地址较⼩的字节的地址。
虽然整型变量占⽤4个字节,我们只要知道了第⼀个字节地址,顺藤摸⽠访问到4个字节的数据也是可行的。
2.2指针变量和解引用操作符(*)
2.2.1指针变量
那我们通过取地址操作符(&)拿到的地址是⼀个数值,比如:0x0137FCEC,这个数值有时候也是需要存储起来,方便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。
#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;//取出a的地址并存储到指针变量p中
return 0;
}
指针变量也是⼀种变量,这种变量就是用来存放地址的,存放在指针变量中的值都会理解为地址。
我们看到 p 的类型是 int*,那该如何去理解这个指针的类型呢?
int a = 10;
int* p = &a;
这⾥ p 左边写的是类型的对象 int* ,* 是在说明p是指针变量,而前⾯的 int 是在说明 p 指向的是整型 (int) 类型的对象。
在指针眼里只要放在指针变量里面,什么东西都是地址,很好的类比,在锤子眼里什么都是钉子。
2.2.2解引用操作符
C语言中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针) 指向的对象,这⾥必须学习⼀个操作符叫解引用操作符(*)。
int main()
{
int a = 100;
int* p = &a;
*p = 0;
return 0;
}
上面代码中 *p = 0 就使⽤了解引用操作符, *p 的意思就是通过 p 中存放的地址,找到指向的空间, *p 其实就是 a 变量了;所以 *p = 0,这个操作符是把 a 改成了0。
学到这大家可能会有疑问,指针有什么用呢?这里如果目的就是把a改成0的话,写成 a = 0;不就行了,为啥非要使用指针呢? 其实这里是把 a 的修改交给了 p 来操作,这样对 a 的修改,就多了⼀种的途径,写代码就会更加灵活,下面我举一个例子来帮助大家理解。
相信大家都看过最近一个很火的电视剧《狂飙》,在电视剧中有个人叫强哥,他是个黑社会,在早期他想做一件事都是自己直接动手,而后面他有了老莫后,他有不方便动手的事情,他就会跟老莫说他想吃鱼了,然后老莫就会动手帮他摆平这件事了。
而放到指针中这也很适用,a = 0就相当于强哥亲自动手了,p 就相当于老莫,&a后就相当于把事情的经过告诉了老莫,然后老莫搞定了这件事。相信大家通过这个例子,也对指针有了更多的了解。
2.3指针变量的大小
指针变量的大小取决于地址的大小
32位平台下地址是32个bit位(4个字节)
64位平台下地址是64个bit位(8个字节)
结论:指针变量的大小和类型无关,只要指针类型的变量,在相同的平台下,大小都是相同的。