【指针与数组】笔记+理解ㄟ(≧◇≦)ㄏ
概念表达式含义比喻
普通变量的地址&a变量a在内存中的门牌号你家房子的地址
普通变量的值a变量a里面存的内容(10)你家里住的人
指针变量的地址&p指针变量p自己的门牌号便利贴本子所在的抽屉
指针变量的值p指针p里面存的地址(即&a便利贴上写的地址(你家地址)
指针指向的值*p通过p存的地址去访问那个变量(即a拿着便利贴上的地址去找,家里住的人(10)

给指针“存地址”(改变指向)的正确写法

场景写法*的使用
声明时同时初始化int *p = &a;声明时加*
已声明,后赋值p = &a;不加*
  • 声明时的*是类型的一部分,表示“这是一个指针变量”

  • 使用时的*是解引用运算符,表示“访问指针指向的变量”

  • 给指针赋值地址时,用的是指针变量名本身(不加*


二维数组arr[][]地址与指针解析

  • arr[0]的本意:它是一个一维数组(即第 0 行)

  • 数组名退化规则
    在大多数表达式中(如赋值、传参、算术运算),数组名会退化(隐式转换)为指向其首元素的指针。

    • arr的首元素是第 0 行

    • arr[0]的首元素是第 0 行第 0 列

    • 退化规则

    • 表达式原始类型退化后类型退化结果说明
      arrint [][]int (*)[]&arr[0]指向行数组的指针(行指针)
      arr[0]int []int *&arr[0][0]指向第0行第0个元素的指针
      arr[0][0]int无退化无退化基本类型,不退化

    注意:取地址符&可以得到“本体”的地址,不会引发退化。

  • 三种地址的区别

    • &arr→ 整个数组的地址

    • &arr[0]→ 第 0 行的地址

    • &arr[0][0]→ 第 0 行第 0 列的地址

    三者起始地址相同,但表示的范围(步长)不同