浅谈对指针的理解
指针
- 指针是什么
- 指针
- 指针的大小
- 指针和指针的类型
- 指针+-整数
- 指针的解引用
- 野指针
- 野指针原因
- 规避野指针
- 注意
- 指针运算
- 指针-指针
- 二级指针
指针是什么
在计算机科学中,指针(pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能够找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为指针。意思是通过它能找到以它为地址的内存单元。
指针
指针是一个变量,存放内存单元的地址
#include <stdio.h>
int main()
{
int num = 10;
int* p = #//对于变量num,取地址将它存放在指针变量p中。
return 0;
}
总结:
指针就是一个变量,用来存放地址的变量(存在指针中的数据都被当做地址来处理)
指针的大小
#include <stdio.h>
int main()
{
int num = 10;
int* p = #//对于变量num,取地址将它存放在指针变量p中。
printf("%d\n", sizeof(p));//打印指针的大小
return 0;
}
总结:
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台上是4个字节,在64位平台上是8个字节。
指针和指针的类型
指针的类型有:
char*
int *
short*
long*
float*
double*
…
总结:
可以看出,指针的定义方式是:type+*。
不管什么类型的指针,在32位平台上是4个字节,在64位平台上是8个字节
指针±整数
实例:
#include <stdio.h>
int main()
{
int n = 10;
char* p1 = (char*)&n; //int的n强制转换为char型
int* p2 = &n;
printf("%p\n", &n);//%p打印地址
printf("%p\n", p1);
printf("%p\n", p1+1);
printf("%p\n", p2);
printf("%p\n", p2+1);
return 0;
}
如图:n和p1、p2的地址是一样的。而char型的 p1+1,地址向后走了1个字节。int型的p2+1,地址向后走了4个字节。
总结:
指针的类型决定了指针向前或者向后走一步有多大距离
指针的解引用
//指针解应用
#include <stdio.h>
int main()
{
int n = 0x11223344;
char* pc = (char*)&n;
int * pi = &n;
*pc = 0;//解引用
*pi = 0;
return 0;
}
如上图:
char * 的指针解引用就只能访问1个字节,而 int *的指针的解引用就可以访问4个字节。
总结:
指针的类型决定了,对指针的解引用的时候有多大的权限(即:一次能访问多少字节)
野指针
野指针就是指针的指向方向的位置是不可知的(随机的、不正确的、,没有明确限制的)
野指针原因
1、指针未初始化
#include <stdio.h>
int main()
{
int * p;//局部变量未初始化,默认随机值
*p = 20;
return 0;
}
2、指针访问越界
#include <stdio.h>
int main()
{
int arr[] = { 0 };
int *p = arr;
for (int i = 0; i <= 11; i++)
{
//当指针指向范围外,p就是野指针
*(p + i) = i;
}
return 0;
}
注意:
虽然有的时候越界也不一定报错,因为系统对越界是抽查
规避野指针
1、指针初始化
2、小心指针越界
3、指针指向空间释放即使置NULL
4、使用前检查有效性
注意
在内存中,第一个字节空出来不使用,否则无法区分指针变量的有效位置还是初始化。
全局变量和静态变量是会初始化的,默认初始化为0;其他变量不会初始化。
指针运算
指针-指针
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,打但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
二级指针
指针变量也是变量,是变量就有地址,指针变量的地址就可以存放在二级指针中。
当然也存在三级指针、四级指针…
//二级指针
#include <stdio.h>
int main()
{
int a = 120;
int *p = &a;//存放a的地址
int ** pp = &p;//存放一级指针p的地址
int *** ppp = &pp;//存放二级指针pp的地址
return 0;
}
如图:
一级指针的地址存放在二级指针中,二级指针的地址放在三级指针中,使用的时候,三级指针解引用找到二级指针。二级指针解引用找到一级指针,一级指针解引用找到这个数。
还没有评论,来说两句吧...