• C中数组与指针【转】


    在这里随便定义一个数组

         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中指针与数组的理解,若有什么不对的地方,欢迎指出!

  • 相关阅读:
    ab 性能测试工具的使用(Web并发测试)
    java 读取文件——按照行取出(使用BufferedReader和一次将数据保存到内存两种实现方式)
    java 判断两个时间相差的天数
    java 正则表达式的应用:读取文件,获取其中的电话号码
    mybatis 插入数据时返回主键
    CodeForces 493B Vasya and Wrestling 【模拟】
    图像边缘检測小结
    【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念
    60.自己定义View练习(五)高仿小米时钟
    bzoj4361 isn
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/5509682.html
Copyright © 2020-2023  润新知