一、指针是什么
指针理解的2个要点:
1.指针是内存中最小单元的编号,也就是地址。
2.平时口语中说的指针,通常指的是指针变量,是用来存放地址的变量。
那么内存与地址之间的关系呢?
简单来说就是一个字节大小的空间对了一个地址(指针变量)。
二、一个指针变量的大小
那么一个指针变量是多大呢? 我们可以通过下面的代码来测试。
由图片可知对于64位机器一个指针变量大小为8个字节,那么这是为什么呢?
其实分析地址编号就能明白。在64位机器上,地址是由64个0或1组成的二进制序列,一个二进制序列大小为1个比特位,而一个字节大小是8个比特位,所以一个指针变量的大小是8个字节。
同理对于32位机器,一个指针变量的大小是4个字节。
三、内存数据与内存地址
那么内存数据与地址是个什么样的对应关系呢?
且用一个整形变量a来举例吧。
其实我们可以看到&a得到的地址其实是01的地址即4个字节中第一个字节的地址。那么问题来了,为什么是01的地址呢?而不是00的地址,明明00才是变量a的一个字节呀。这里面涉及到大小端存储问题,后面在数据存储中我会写清楚。
四、指针和指针类型
指针的定义方式是:type + *。
举例:
char * 类型指针是为了存放char类型变量的地址。
short * 类型的指针是为了存放short类型变量的地址。
char * pc=NULL:
int * pi=NULL;
short *ps=NULL;
long * pl=NULL;
float * pf=NULL;
double * pd=NULL:
4.1指针±整数
通过图片代码可知,当指针类型为char* 时pc+1比pc大了1;而指针类型为int* 时pi+1比pi大了4。
总结:指针的类型决定了指针向前或向后走一步多大(距离)。
4.2指针的解引用
观察下面图片代码区别
简单来说指针类型决定了,对指针解引用的时候能有多大的权限(能操作几个字节)。
比如:char* 的指针解引用就只能访问一个字节,而int* 的指针的解引用就能访问四个字节。
五、指针和数组
我们可以举个例子。
可见数组名跟数组首元素地址是一样的。
结论:数组名表示数组首元素地址。
既然数组名是地址,那么我们可以用个指针变量来接收它,也可以通过指针来遍历数组内容。
六、二级指针
既然指针是变量,变量就有地址,那指针的地址存在哪呢?
七、指针数组
指针数组是指针呢?还是数组呢? 是数组,准确来说是用来存放指针的数组。
我们已知的数组有整形数组,和字符数组。
int arr1[5];
char arr2[5];
那指针数组是什么样呢?
int *arr[5];