指针是存储指向某一内存空间的地址的一个变量,指针是一个值这个值是一个地址这个地址指向另外一个内存空间,对指针的解引用操作就是通过地址去访问地址所指向的空间内的值。
内存 与 地址
当CPU处理数据时,便是从内存当中读取相应的数据,再将处理完的数据放回内存当中。内存则以字节作为单位管理这些数据。而能够在CPU需要的时候再到内存中相应的数据就是依靠地址,内存中每一单位即每一个字节的空间都有其相应的地址如图:
这是一段内存空间的示意图,颜色区每一格代表着一个单元的内存空间即1字节,左边的8位16进制数则代表着这个空间的地址,每一个空间的地址都是独立不会重复的,即每一个字节的空间都是被编码了的,就如同身份证的号码一样是唯一不可更改的。当你得到了这个地址就能随时访问这块空间得到里面的值。 可以简单的理解为指针==地址
指针变量 与 地址操作符
当我们在程序中创建一个变量的时候系统会分配一个内存空间给你,这个空间里存放着这个变量。
指针也是一样指针也是一个值他需要一个内存空间去存放指针(地址),当我们创建一个指针时也是会被分配到一个内存空间这个空间是固定大小的,当计算机是32位的时候就为4个字节,当计算机是64位时就是8个字节。计算机位数也决定着最多能有多少个地址的空间。
地址操作符&与*
地址操作符也就是指针操作符,是对地址或者空间进行一种调用的标识符
&接变量名就是对这个变量所在的空间进行取地址操作
图一:
图二:
我们可以看到图二中p的值和&a的值是完全相等的,所以当我们输入“&a”这个表达式的时候所代表的含义就是a这个变量所在的空间的地址,这个地址的接收理所当然也需要一个地址型的变量去接收也就是指针。
由图一我们可以看到最后接收a变量地址的是一个变量p,对变量p的类型的定义是 int* 其中的*代表着这个p是一个指针,int就代表着这个指针所指的空间里面的值的类型是int型即整型数据;
如图一所示printf打印中的值是10,这个值是存储在a这个变量中的,所以我们正常打印a的值是就是10。但是我们看到*p打印出来的值也是10,着就是*这个符号的作用,p这个变量存储的是a变量的地址,*这个符号就是通过p指针去访问到p所指的空间值,也叫解引用操作符,对一个地址进行解引用就能访问到这个地址所指的空间内的值。