1.什么是指针?
这个问题我们通常解释为两种情况:
1.指针本质:指针是内存中一个最小单元编号,也就是地址;
2.我们通常说的指针,其实是表示指针变量,是用来存放地址的变量工具;
总结:指针是指针变量用于存放变量地址的变量工具,本质是地址
2.指针的大小
指针大小这里就直接给出答案:
在32位平台,指针(地址)大小为4个字节;
在64位平台,指针(地址)大小为8个字节;
3.指针的分类
指针分类还是比较多,也相对来说比较丰富,接下来我们就一个个来了解指针的类型吧!
3.1比较常规的指针类型
char *p = NULL; short *p = NULL; int *p = NULL; long *p = NULL; float *p = NULL; double*p = NULL;
有上面的比较常见的指针类型,不难得出:指针的定义方式为---->type + *
而且这里还有个性质:
定义的type为什么类型,那么指针变量存储的相应类型的变量地址。
举个例子:
比如char*类型的指针,是为了存放char类型变量的地址
char ch='w'; char *p=&ch; //这里&(取地址符号),是为了取出ch变量的地址;
提出疑问,指针这么多类型有什么意义呢?
回答:不同类型的指针也就有着不同的“步长”,也就是一次性访问的字节大小,比如char指针一次访问1个字节,而int类型的指针一次性就可以访问4个字节。这在C语言的底层 ,意义重大。
说道“步长”就有必要说一下指针加减整数:
这里就可以看见char类型的指针加整数1,地址变化了1个字节,而int类型的指针加1,地址变化了4个字节
3.2指针的解引用操作
#include <stdio.h> int main() { int n = 0x11223344; char *pc = (char *)&n; int *pi = &n; *pc = 0; //重点在调试的过程中观察内存的变化。 *pi = 0; //重点在调试的过程中观察内存的变化。 return 0; }
这里我们可以看到char类型的pc指针,只改变了n的第一个字节;接着往下运行
我们也容易的发现:int类型的pi指针,直接把n的4个字节都变成了0;
在个例子中,pc或者是pi如果都按整形打印,那么他们完全就是整形n的值,* +变量指针就是访问变量指针地址,若打印规定%d整形打印,他就会往后把4个字节都翻译了(翻译过程就是补码到原码的过程)
这里也是表明不同类型解引用访问的内存大小不同;
3.3野指针
概念:野指针就是指针指向的位置是不可知道的(随机的、不正确的、没有明确限制的)
野指针的成因:
1.指针未初始化;
2.指针越界访问;
3.指针指向空间释放;
4.指针运算
4.1指针加减整数
指针加减整数,也就是在原指针的基础上,增加或者减少 整数 * sizeof(type)
例如:
#include<stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p1 = arr; int* p2 = arr + 4; printf("p1=%p\np2=%p", p1, p2); return 0; }
我们可以发现p2=p1+4,相当于增加4*sizeof(int)也就是16;
4.2指针-指针
指针减指针代表的是两个地址之间的距离(两地址之间相差的元素个数(int)类型),返回的是int数据。指针和指针之间是没有相加的,相加没有意义;
总有浪漫值得奔赴!