1.什么是指针?
指针是一个变量,用来存放地址,存放在指针中的值都被当成地址来处理
2.为什么存在指针?
从内存说起,计算机中的程序要运行起来首先要将程序加载到内存,那如何合理的分配时使用内存呢?
我们将内存分成多个小的单元,每个单元都对应一个独一无二的地址,这样就一个地址标识一块空间
经过仔细的计算和权衡我们定义每个小的单元是一个字节,对于32位机器,有32根地址线,那么假设没很地址线会产生一个电信号(0/1),那么32根地址线能产生的地址就是2的32次方个。每个地址便是一个字节,那么我们就可以对4g的空间进行编址。
总结:
- 指针式因为存放地址才出现的,地址就是为了标识一块地址空间的
- 指针让地址有地方存放,指针让内存的访问更加方便
- 指针在32位平台上式4个字节,在64位平台上式8字节
- 对于32位机器来说,地址线有32根,使用它的地址是由0/1组成的32位二进制效率,那地址就得用4个字节的空间来存储,所以一个指针变量的大小是4字节。而64位平台,有64根地址线,所以需要8个字节来存放
3.指针和指针类型
指针的类型是: type *
char * 类型的指针是为了存放char类型变量的地址,
int * 类型的指针是为了存放int类型变量的地址……以此类推
为什么指针要有类型呢?
- 有类型的区分,使得编码更加严谨
- 不同类型的指针指定了其解引用时可以访问内存的大小,char* 解引用只能访问一个字节,int *解引用可以访问4个字节
- 不同类型的指针+-整数时表示的意义不一样,指针的类型决定了指针向前或者向后走一步有多大(距离),char类型的指针+-向前或后移动1个字节,int类型指针+-向前或向后移动4字节的大小
4.二级指针:
指针变量也是变量,是变量就有地址,那么指针变量的地址存放在哪里呢——二级指针
int a = 10;
int* pa = &a;
int **ppa = &pa;
通过对ppa的解引用就可以得到pa的地址,*ppa其实访问的就是pa
int b = 20;
*ppa = &b;//等价于pa = &b;
通过对*ppa解引用就可以找到a,先通过*ppa找到pa,在对pa进行解引用操作找到a,即**ppa就是a;
**ppa = 30;
//等价于*pa = 30;
//等价于a= 30;
注:对二级指针+/-1,在32位平台下,移动四个字节,多个指针+/-1,都是+/-4个字节
5,指针的运算
- 指针+-整数
指针+/-n <==> n*sizeof(type)
- 指针-指针
在同一内存空间里(同一数组/同一字符串),指针相减,结果是俩个指针之间的元素个数,并不是字节数
int a[10];
int *p = &a[5];
int *q = &a[9];
printf("%d\n",q-p);
//输出是4
- 标准规定,允许指向数组元素的指针向数组最后一个元素后面的那个内存位置的指针比较,单数不允许与指向第一个元素之前的那个内存位置的指针进行比较