1. 指针是什么
指针理解的 2 个要点:
1. 指针是内存中一个最小单元的编号,也就是地址
2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
- 每个内存都有一个唯一的编号,这个编号也被称为地址。
- 编号==地址==指针
指针变量
指针变量
我们可以通过&(取地址操作符)取出变量的内存起始地址,把地址可以存放到一个变量中,这个
变量就是指针变量
#include <stdio.h> int main() { int a = 10;//在内存中开辟一块空间 int *p = &a;//对变量a,取出它的地址,可以使用&操作符。 //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个之指针变量。 return 0; }
总结:
指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理),指针变量是用来存放地址的,地址是唯一标示一个内存单元的
指针的大小在 32 位平台是 4 个字节,在 64 位平台是 8 个字节。
2. 指针和指针类型
那我们先来看看各类型的指针大小都是多少吧!!!
其实指针的大小都是一样的,无论你是什么类型.
1.指针(+/-)整数
指针的类型决定了指针向前或者向后走一步有多大(距离)。
2. 指针的解引用
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
3. 野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
1.野指针成因
1.指针未初始化(在vs中会出现C4700的错误)
#include <stdio.h> int main() { int *p;//局部变量指针未初始化,默认为随机值 *p = 20; return 0; }
2.指针越界访问
#include <stdio.h> int main() { int arr[10] = {0}; int *p = arr; int i = 0; for(i=0; i<=11; i++) { //当指针指向的范围超出数组arr的范围时,p就是野指针 *(p++) = i; } return 0; }
2.如何规避野指针
- 指针初始化
- 小心指针越界
- 指针指向空间释放,及时置NULL(不知道指针初始化为什么值,暂时初始化为 NULL)
- 避免返回局部变量的地址
- 指针使用之前检查有效性
4.指针运算
1.指针+-整数
2.指针-指针
两个指针相减的前提:两个指针指向了同一块空间
3.指针的关系运算
#define N_VALUES 5 float values[N_VALUES]; float *vp; for(vp = &values[N_VALUES]; vp > &values[0];) { *--vp = 0; } //化简后: for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--) { *vp = 0; }
实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较。
5. 指针和数组
6. 二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
这就是 二级指针 。
7. 指针数组
指针数组是指针还是数组?
答案:是 数组 。是存放指针的数组。
这个是一个例子:
❤️结语:
本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,蜗牛必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!