大家一提到指针,就觉得非常难,说的都是什么呀。其实静下心来,我们可以发现,他也没多少东西。首先要相信自己,有些面试题,画完图就清楚很多。
指针的定义
指针就是地址,我们口头上说的指针其实指的是指针变量。
指针变量
指针变量就是存放地址的变量
eg.int a = 0; int* p = &a;
指针类型
int char float 这些类型我们肯定不陌生,但是如果要存储不同类型的变量的地址,我们应该怎么存呢?这时指针类型,因运而生。
存放int类型的变量 利用int*
存放char类型的变量 利用char*
其他类似。但是数组指针 指针数组 函数指针不相同,在后面的文章会提到。
eg。
int a = 0;
char ch = 's';
int *p= &a;
char *ptr=&ch;
指针的计算
- 指针加减整数
指针的加减整数类似于指针移动,并且指针的类型决定了指针向前或者向后走一步有多大(距离)。
eg.
#include <stdio.h>
//演示实例
int main()
{
int n = 10;
char *pc = (char*)&n;//将int*类型的指针强制转换成char*
int *pi = &n;
printf("%p\n", &n);//
printf("%p\n", pc);//
printf("%p\n", pc+1);//
printf("%p\n", pi);//
printf("%p\n", pi+1);//
return 0;
}
结合运行结果可知, printf("%p\n", &n);printf("%p\n", pc); printf("%p\n", pi); 输出都是00CFF940,pc和pi+1后全完全不同,pc是char所以只移动一个字节,而pi是int 所以移动了4个字节。
- 指针-指针
其实就是两个地址之间相差多少个元素。 - 指针的解引用
指针变量中存放是地址,指针解引用就是根据保存的地址查找到那段空间,并进行操作。
int main()
{
int n = 0x11223344;//存了一个16进制的数
char *pc = (char *)&n;
int *pi = &n;
*pc = 0; //n中现在就保存0啦
*pi = 0;
return 0;
}
将这段代码放进vs中运行,我们在调试的过程中我们可以发现,指针类型不一样,解引用的权限也不一样。比如char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
n 在内存中是· 44 33 22 11存储(小端存储),pc=0;在内存中的表现为 00 33 22 11,而pi=0;在内存中的表现为 00 00 00 00
野指针
何为野指针呢·?
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
什么时候会出现野指针呢?
- 指针未初始化
- 指针越界访问
- 指针指向的空间释放