浅谈对指针的理解

àì夳堔傛蜴生んèń 2022-12-28 14:22 275阅读 0赞

指针

  • 指针是什么
      • 指针
      • 指针的大小
  • 指针和指针的类型
      • 指针+-整数
      • 指针的解引用
  • 野指针
      • 野指针原因
      • 规避野指针
  • 注意
  • 指针运算
      • 指针-指针
  • 二级指针

指针是什么

在计算机科学中,指针(pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能够找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为指针。意思是通过它能找到以它为地址的内存单元。

指针

指针是一个变量,存放内存单元的地址

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int num = 10;
  5. int* p = &num;//对于变量num,取地址将它存放在指针变量p中。
  6. return 0;
  7. }

总结:
指针就是一个变量,用来存放地址的变量(存在指针中的数据都被当做地址来处理)

指针的大小

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int num = 10;
  5. int* p = &num;//对于变量num,取地址将它存放在指针变量p中。
  6. printf("%d\n", sizeof(p));//打印指针的大小
  7. return 0;
  8. }

在这里插入图片描述
总结:
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台上是4个字节,在64位平台上是8个字节。

指针和指针的类型

指针的类型有:

char*
int *
short*
long*
float*
double*

总结:

可以看出,指针的定义方式是:type+*。

不管什么类型的指针,在32位平台上是4个字节,在64位平台上是8个字节

指针±整数

实例:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 10;
  5. char* p1 = (char*)&n; //int的n强制转换为char型
  6. int* p2 = &n;
  7. printf("%p\n", &n);//%p打印地址
  8. printf("%p\n", p1);
  9. printf("%p\n", p1+1);
  10. printf("%p\n", p2);
  11. printf("%p\n", p2+1);
  12. return 0;
  13. }

在这里插入图片描述
如图:n和p1、p2的地址是一样的。而char型的 p1+1,地址向后走了1个字节。int型的p2+1,地址向后走了4个字节。
总结:
指针的类型决定了指针向前或者向后走一步有多大距离

指针的解引用

  1. //指针解应用
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int n = 0x11223344;
  6. char* pc = (char*)&n;
  7. int * pi = &n;
  8. *pc = 0;//解引用
  9. *pi = 0;
  10. return 0;
  11. }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上图:
char * 的指针解引用就只能访问1个字节,而 int *的指针的解引用就可以访问4个字节。

总结:
指针的类型决定了,对指针的解引用的时候有多大的权限(即:一次能访问多少字节)

野指针

野指针就是指针的指向方向的位置是不可知的(随机的、不正确的、,没有明确限制的)

野指针原因

1、指针未初始化

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int * p;//局部变量未初始化,默认随机值
  5. *p = 20;
  6. return 0;
  7. }

在这里插入图片描述
2、指针访问越界

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[] = { 0 };
  5. int *p = arr;
  6. for (int i = 0; i <= 11; i++)
  7. {
  8. //当指针指向范围外,p就是野指针
  9. *(p + i) = i;
  10. }
  11. return 0;
  12. }

在这里插入图片描述
注意:
虽然有的时候越界也不一定报错,因为系统对越界是抽查

规避野指针

1、指针初始化
2、小心指针越界
3、指针指向空间释放即使置NULL
4、使用前检查有效性

注意

在内存中,第一个字节空出来不使用,否则无法区分指针变量的有效位置还是初始化。
全局变量和静态变量是会初始化的,默认初始化为0;其他变量不会初始化。

指针运算

指针-指针

允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,打但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

在这里插入图片描述

二级指针

指针变量也是变量,是变量就有地址,指针变量的地址就可以存放在二级指针中。
当然也存在三级指针、四级指针…

  1. //二级指针
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int a = 120;
  6. int *p = &a;//存放a的地址
  7. int ** pp = &p;//存放一级指针p的地址
  8. int *** ppp = &pp;//存放二级指针pp的地址
  9. return 0;
  10. }

在这里插入图片描述
如图:

一级指针的地址存放在二级指针中,二级指针的地址放在三级指针中,使用的时候,三级指针解引用找到二级指针。二级指针解引用找到一级指针,一级指针解引用找到这个数。

发表评论

表情:
评论列表 (有 0 条评论,275人围观)

还没有评论,来说两句吧...

相关阅读

    相关 指针

    首谭浩强《C++程序设计》,第二篇,来说下指针。 主要介绍的是:①指针与引用在函数参数传递时的比较。②指针与数组的关系。 ⑴函数可以说是任何程序设计语言必不可少的组成...

    相关 面向对象理解

    什么是面向对象 ? 对比面向过程,是两种不同的问题的角度 面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者(对象)、及各自需要做什么 例如:用洗

    相关 101-指针

    指针是什么? 在计算机科学中,指针(pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能够

    相关 协程理解

    一句话说明什么是线程:协程是一种用户态的轻量级线程。 一句话并不能完全概括协程的全部,但是起码能让我们对协程这个概念有一个基本的印象。 从硬件发展来看,从最初的单核单CP

    相关 Socket和Server理解

    我试着运用java基础知识和eclipse编程工具来实现聊天室的设计。 首先,我们得先明白聊天室是一个你说我听,我说你听的过程。它由服务器和客户端组成,我们通过客户端写入我们