二维数组指针 分析 :
int (*p)[5] ; / *这里的 int (*p)[5] 是一个行级指针, 指向一行5个元素 , 但是P本身也是一个内存地址 , 只站用 int 型内存单元 */
/* p 是一个行级指针 , p++ 指的是下一行 , *p是元素级别指针 , (*p)++ 指的是下一个元素 , 但是*p也是一个指针 , *((*p)++) 才是下一个元素的值 */
/* p 和 *p 在C中有可能值是相同的( 都是第一个元素的地址 ) , 但是 是完全不同的两个方面 */
1. (*p)[4] 和 *p[4] 的区别 :
(*p)[4]是定义一个指向一维数组的行级指针 , 这个一维数组有4个元素 , 而 *p[4] 是定义了一个包含4个指针元素的指针数组 . 用sizeof()计算两个p , 发现第一个 p 的大小是 4,
即 它是一个指针 , 第二个p的大小是16 , 因为它是一个包含 4 个指针的数组 . ( 本质上 : 第一个 p 是指针 , 第二个 p 是数组 )
2.
Array[0] | 0 | 1 | 2 | 3 |
Array[1] | 4 | 5 | 6 | 7 |
Array[2] | 8 | 9 | 10 | 11 |
上图表示了二维数组的存储方法 , Array[0] ~ Array[2] 表示各一维数组的首地址 , 二维数组名 Array 表示整个二维数组的首地址 , 它和 Array[0] , Array[0][0] 是同一个地址 .
但是它们表示的级别是不同的 , 因此不能混用 . ( 特别是 p++ 操作 )
另外 : Array[1] 与 &Array[1] 输出的内容是相同的 , 都是第一行的首地址 , 但是它们的含义是不同的 , Array[1] 是元素级别的 , 是 int * , 而 &Array[1]是行级别的 ( C 中可能没有这么使用 ) , 是 int (*p)[4]
也就是 , Array[1] + 1 , 指针移动到下个元素位置 , &Array[1] + 1 , 指针移动到下一行的位置 .
理解 : 首先二维数组可以当作一维数组 , 而每一维又是包含4个元素的数组 , 而 &Array[1] , 操作符是取地址的意思 , 而 Array[1] 本就是地址 , 所以...&Array[1]是行级指针.