| 概念 | 表达式 | 含义 | 比喻 |
|---|---|---|---|
| 普通变量的地址 | &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 列的地址
三者起始地址相同,但表示的范围(步长)不同。