数组与指针

原创 2016年06月02日 10:41:25

随便定义一个数组   int arr[5];

arr现在就是数组名, arr 代表的是该数组整块内存,即sizeof(arr) == 20 (假设sizeof(int) == 4), arr 里的内容是该块内存的首地址,即 arr == &arr[0]  。 arr可以看做是一个常量,也就不可以使用 arr++ 之类的运算。

     int *p;  p = arr;

     p是一个指向int类型的指针,p  = arr,就是把数组的首地址(arr的内容就是数组的首地址,这个前面有分析)赋给p,即 p 现在就是指向数组的首地址,通过 p 就可以访问整个数组,但是 p 这里只是是个指针变量,也就是 p 的本质没有改变,p 不能和 arr 一样代表整个数组的内存, 所以 sizeof(p) == sizeof(int*)  != sizeof(arr)。

     把数组的首地址赋给 p,但 p 的本质一个int类型的指针变量,所以也就可以对 p 进行 ++ 之类的运算。

 

     我们可以通过对 p ,arr 的偏移(int类型的指针 +1 或 -1, 是向上或向下偏移 sizeof(int) 个byte)来访问数组里的元素,         *( p + i ) ,*(arr + i),也可以通过传统的 arr[i] 访问数组。 

     举个例子:

     int a[5]  = {1, 2, 3, 4, 5};

     int *ptr = (int*)(&a + 1);

     printf("%d, %d", *(a + 1), *(ptr - 1));

     这里的输出的值应该是?

     a 是 代表(不是指向)的是整个数组内存,a 的值是该数组内存的首地址, 对 a 取地址(&a),即......,所以这里的 &a 是指向整个数组的内存块,所以 a 的值与 &a 的值是一样的,都是该数组的首地址,但他们的含义是不一样的。

     这里 &a 的每次偏移是移动整个内存块的大小,这里就是移动 sizeof(a),即40 byte,所以这里的 &a + 1, 是指针向下移动个40byte(数组内存块的大小),&a+1的指向 是下个 sizeof(a)大小的内存块。

下面是内存分配图:

        &a   ---> ==========  假设这里的地址值是 0x11111111          &a 和 a 的值都是 0x11111111

                      ||        1        ||

                      ==========

                      ||        2        ||

                      ==========

                      ||        3        ||

                      ==========

                      ||        4        ||

                      ========== <-----ptr-1  int类型的指针每偏移是 sizeof(int) 个 字节

                      ||        5        ||

    &a +1 ---> ==========  <-----ptr    上面的题目中 让 int 类型的指针 ptr 也指向了这里

                      ||        ?        ||

                      ==========

                      ||        ?        ||

                      ==========

                      ||        ?        ||

                      ==========

                      ||        ?        ||

                      ==========

                      ||        ?        ||

     &a+2 ---->==========

                      ||        ?        ||

                      ==========

                             """"""

                             """"""

                             """"""

     所以上面题目的输出结果 是 :                     

                         2,5

版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言中指针与数组的区别与联系

好久不写东西了,从毕业以来,整个人都懒散了很多。今天终于鼓起勇气,来写一点儿东西…… 指针与数组对于C语言程序员来说肯定不会陌生,一说起这个话题,我就想起了曾经被内存、地址、地址里的内容这些概念狂虐时...
  • cyfcsd
  • cyfcsd
  • 2017年02月03日 17:29
  • 4555

数组与指针关系

1
  • App_12062011
  • App_12062011
  • 2013年09月15日 20:25
  • 3341

C中数组与指针

     在这里随便定义一个数组     int arr[5];     arr现在就是数组名, arr 代表的是该数组整块内存,即sizeof(arr) == 20 (假设sizeof(int) =...
  • hui_love2046
  • hui_love2046
  • 2010年07月19日 20:10
  • 18927

C语言指针与数组易混淆知识点(一)

一指针与数组 二指针与函数 三指针数组数组指针指向指针的指针 四程序陷阱 一、指针与数组指针:指针本身也是一个变量,它的内容是指向的内容的地址。指针同样有类型的区分,char 的指针只能指向char型...
  • woshimalingyi
  • woshimalingyi
  • 2016年03月25日 15:59
  • 3077

探讨下C++中的数组和指针的区别

最近一段时间在研究虚拟现实方面的内容,有一段时间没写代码,重拾C++,顺便记录下C++中容易出错的内容,数组和指针的区别。很多新手都抱怨说C++难,尤其是指针和数组,傻傻分不清楚,那么我就从我对数组和...
  • transferli
  • transferli
  • 2016年03月24日 13:04
  • 314

C语言:数组和指针的区别

实际上关于数组与指针的区别这个问题在《C专家编程》已经有很详细的阐释,但我想用自己的语言说一说我的理解。数组是指针?最近在做数据结构课设,其中一个函数发生了令人费解的错误,简化后的代码如下:#incl...
  • imred
  • imred
  • 2015年05月02日 19:08
  • 14006

C/C++数组和指针详解

/****************************************************************/ /*            学习是合作和分享式的! /* Au...
  • wdzxl198
  • wdzxl198
  • 2013年06月13日 16:16
  • 7068

【C++】有关c++中数组与指针的关系

下图是代码与运行结果: 1.简单数组与指针的关系(int型数组为例): 解释: 第二句相当于int型指针cp指向了数组的第一个元素,所以,打印出的cp是第一个元素的地址;&cp[0]与...
  • wendongxia
  • wendongxia
  • 2017年02月26日 15:39
  • 1003

数组和指针的联系

1.数组的本质是一段连续的内存空间2.数组的空间大小为sizeof(array_type)*array_size3.数组名可看做指向数组第一个元素的常量指针4.指针是一种特殊的变量,与整数的运算规则为...
  • qq_31208451
  • qq_31208451
  • 2017年08月20日 17:15
  • 129

数组和指针表示法

 关键词: 数组                                                                      ...
  • xzdwfwt111
  • xzdwfwt111
  • 2008年01月15日 11:55
  • 519
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组与指针
举报原因:
原因补充:

(最多只允许输入30个字)