零基础C语言:第八讲(数组指针与二维数组、void指针和NULL指针、指向指针的指针)

241 阅读2分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

数组指针与二维数组

  • 初始化二维数组是可以偷懒的

    • int array[2][3]={{0,1,2},{3,4,5}};
    • 或者:int array[][3]={{0,1,2},{3,4,5}};
  • 定义一个数组指针是这样的:int (*p)[3];

  • 如何解释如下语句:int (*p)[3]=array;

  • 举例

  • 结果

void指针和NULL指针

  • void指针

    • 因为定义变量时会分配内存空间大小,当变量定义为void类型时编译器会报错。

      • 举例
      • 结果(编译出错)
    • void指针称为通用指针,就是可以指向任意类型的数组。即任意类型的指针都可以赋值给void指针。
    • 举例
    • 结果
    • 注意\

      • 字符串在C语言中有个特殊的约定:只需要指向字符串的起始地址,然后一个字节一个字节的读下去,读到/0这个特殊的空字符为止表示字符串结束。
  • NULL指针

    • 指针不指向任何数据,#define NULL ((void *)0)
    • 当不清楚要将指针初始化为什么地址时,将其初始化为NULL;在对指针进行解引用时,先检查该指针是否为NULL。这种策略可以节省大量的调试时间。
    • 举例
    • 结果
  • NULL不是NUL

    • NULL用于指针和对象,表示控制,指向一个不被使用的地址;而‘\0’表示字符串的结尾。

指向指针的指针

  • 指向指针的指针

    • 演示
    • 举例
    • 结果
    • 当然可以一直向下引用:指向指针的指针的指针的……
  • 指针数组和指向指针的指针

    • 至少有两大好处

      • 避免重复分配内存
      • 只需要进行一处修改
    • 举例
    • 结果
  • 数组指针和二维数组

    • 举例
    • 结果
  • 注意

    • 不能使用指针直接指向多维数组,因为跨度加1和减1不一样,要使用数组指针才能同步
    • 举例
    • 结果