C语言 —— 指针 ( ※ 入门 ※ )(中)

简介: C语言 —— 指针 ( ※ 入门 ※ )(中)

3.野指针

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

野指针成因:

1.指针未初始化

  #include<stdio.h>
  int main()
  {
    int a;//局部变量不初始化,默认是随机值
    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 < 12; i++)
    {
      //当指针指向的范围超出数组arr的范围时,就越界访问了,此时p就是野指针
      *(p++)=1;
    } 
    return 0;
  }

3.指针指向的空间释放

    #include<stdio.h>
  int* test()
  {
    int a = 10;
    return &a;
  }
  //1.a 创建的空间在函数结束的时候返回给系统了,不属于当前程序的内容
  int main()
  {
    int* p = test();
    //2.这时候通过*p 去访问一个返还系统的空间,该空间有可能已经存放其它内容了
    //3.所以p是一个野指针
        *p = 20;
    return 0;
  }

image.png


那么我们如何能够避免野指针呢?

1.指针初始化

2.小心指针越界

3.指针指向空间释放,即置为NULL

int*pa=NULL; //空指针

   4.指针使用之前检查有效性


4.指针运算

指针运算有三种,分别为:

①指针 + -整数

②指针 - 指针

③指针的关系运算

下面对这三种运算进行详细的讲解:


①指针 + - 整数

    #include<stdio.h>
  int main()
  {
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    int* p = arr;
    for (i = 0; i < sz; i++)
    {
      printf("%d  ", *p);
      //p = p + 1; //指针 + 整数 
      p++;
    }
    return 0;
  }

image.png


这里我们使用的时指针 + 1,那么指针 + 2或指针 + 3是什么样子的呢?请看下面的举例;


image.png


指针除了可以 + 整数,也可以 - 整数,比如:

int*p=arr[sz-1]–>访问下标


image.png    

练习:

image.png


解析:

image.png


②指针 - 指针

我们知道指针变量是用于存放地址的,那么指针 - 指针 就是 地址 - 地址,那指针 - 指针的结果又是什么呢?请看下面的例子:


image.png


打印 & arr[9] - &arr[0] 结果为9,代表从arr[0]到arr[9], 其中间有9个元素。


总结:指针 - 指针得到的结果是中间元素的个数

当然如果我们将 & arr[9] - &arr[0] 的顺序调换以下,变成 & arr[0] - &arr[9],得到的又是什么呢?

目录
相关文章
|
26天前
|
C语言
王桂林C语言从放弃到入门课程
课程目标16天,每天6节课,每节40分钟课堂实录,带你征服C语言,让所有学过和没有学过C语言的人,或是正准备学习C语言的人,找到学习C语言的不二法门。适用人群所有学过和没有学过C语言的人,或是正准备学习C语言的人!
25 2
王桂林C语言从放弃到入门课程
|
9天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
18 0
|
9天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
9 0
|
15天前
|
存储 程序员 C语言
C语言指针的概念、语法和实现
在C语言中,指针是其最重要的概念之一。 本文将介绍C语言指针的概念、语法和实现,以及如何使用它们来编写高效的代码。
13 0
|
16天前
|
存储 C语言
【C语言】深入解开指针(三)2
【C语言】深入解开指针(三)
|
16天前
|
存储 程序员 C语言
【C语言】深入解开指针(二)2
【C语言】深入解开指针(二)
【C语言】深入解开指针(二)2
|
16天前
|
存储 C语言
【C语言】深入解开指针(一)1
【C语言】深入解开指针(一)
|
17天前
|
C语言 索引
基于C语言的函数指针应用-消息命令处理框架
基于C语言的函数指针应用-消息命令处理框架
11 0
|
22天前
|
Java C语言 C++
C语言由入门到精通(1)介绍与数据类型
C语言由入门到精通(1)介绍与数据类型
|
24天前
|
存储 人工智能 编译器
C语言指针详解
指针运算,指针和数组,二级指针
C语言指针详解