数组相关的指针

来源:互联网 发布:下载流星vpn软件 编辑:程序博客网 时间:2024/05/02 10:01

二维数组指针 分析 :

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 123Array[1] 4 567Array[2] 8 91011

上图表示了二维数组的存储方法 , 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]是行级指针.  

原创粉丝点击