目录
内存
当提及指针就不得不提及内存,初识指针,给指针一个通俗的定义:
指针是用来访问内存的
为了有效的使用内存,就把内存分成一个一个小的内存单元,每个内存单元是1个字节。
为什么是划分是一个字节?
计算机也是有数据所占空间大小的,这有很多单位,例如bit,Byte,KB,MB,GB,TB,PB等,具体运算如下图:
编辑
而前面我们所学到了多种数据类型,int long short char......等,它们在创建时就会占用一定的空间,于是根据这些空间发现,定义一比特位显得过小,而定义1KB又显得过大,选择一字节正合适,因此计算机定义,每个内存单元是一字节。
回到什么是指针这个问题,为了有效的访问到内存的每个单元,把计算机内部的每个内存单元都有一个编号,这些编号被称为是内存单元的地址,而这个地址我们就可以把他理解为指针。
在计算机上,有地址线,这是物理上的电线,有高低电平的信号,用来转换数字信号(也就是0和1),其中,32位的机器上有32根地址线,每个地址线的代表着1或者0其中的一种,于是32根线就代表着2的32次方种可能结果,而每一种结果占用1个字节,于是总共就是2的32次方字节的空间(每一个都是一一对应的),程序运行起来要加载到内存中,同时也要申请内存空间的使用。
int main() { int a = 15; //定义int类型的变量 return 0; }
这是一个简单的定义int类型的变量,这个过程就是向内存申请了4个字节的存储空间(因为int占用4个字节) ,用来存放15这个数值。
地址存储
在vs编译器中,可以看到a的具体地址:
编辑
如图,0x后为其所在地址,而0f(十六进制)正代表着的是15。
在C语言中,编号==地址==指针。
那么如何定义指针变量呢?来看这段程序:
#include <stdio.h> int main() { int a = 15; int *pa = &a; printf("%p", &a); return 0; }
我们可以看到,在这里有一个*pa的字符出现,pa是存放a地址的一个变量,叫做指针变量,意思是存放指针的变量,而*是在说明pa是个指针变量,int是指pa指向的是int类型的变量。
简单使用
关于指针的最简单使用,可以看如下操作:
#include <stdio.h> int main() { int num = 10; int* p = # *p = 20; printf("%d\n", num); printf("%d", *p); return 0; }
运行结果如下:
编辑
这是个很神奇的现象,修改*p的值居然让num的值也改变了?由此引出指针的简单用途:
*p是解引用操作符,其中*p就是通过p找到了num,可以说*p就是num,提供了另外一种途径修改变量:通过修改*p就可以把num修改。
C语言中有这样一些专有名词需要区分:
指针-----地址-----编号
指针变量-----变量-----存放地址的变量
用图来解释会更清除一些:
编辑
指针变量的大小
指针变量的大小取决于地址的大小
32位平台下地址是32个bit位(4个字节)
64位平台下地址是64个bit位(8个字节)
总结
这些是对指针的初步认识,指针的功能远远比这些要多得多,但初步认识指针会对未来更深层次的理解有很大的帮助,需要多加理解。