101-浅谈指针

川长思鸟来 2022-12-29 01:47 194阅读 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*

不管什么类型的指针,在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[] = {
  5. 0 };
  6. int *p = arr;
  7. for (int i = 0; i <= 11; i++)
  8. {
  9. //当指针指向范围外,p就是野指针
  10. *(p + i) = i;
  11. }
  12. return 0;
  13. }

在这里插入图片描述
虽然有的时候越界也不一定报错,因为系统对越界是抽查
规避野指针
1、指针初始化
2、小心指针越界
3、指针指向空间释放即使置NULL
4、使用前检查有效性
注意
在内存中,第一个字节空出来不使用,否则无法区分指针变量的有效位置还是初始化。全局变量和静态变量是会初始化的,默认初始化为0;其他变量不会初始化
二级指针
指针变量也是变量,是变量就有地址,指针变量的地址就可以存放在二级指针中。当然也存在三级指针、四级指针…

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

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

发表评论

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

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

相关阅读

    相关 指针

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

    相关 101-指针

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