• 关于普通变量和数组元素地址的讨论


    当我们在画数组的时候,往往是把数组的元素画得一个挨一个,紧挨在一起的。

    image

    实际情况究竟是否如此呢?需要给出证明。

    为了说明我们的证明,先要明确:

    1. 两个相关的概念:“变量的地址”和“变量的值”
    2. “求地址”的运算符

    看下图,说明了“变量的地址”和“变量的值”之间的区别:

    image

    你可能会奇怪,为什么相邻的2个内存单元之间地址间隔4?原因如下:

    1. 地址的单位是字节(Byte)
    2. 我们假设每个内存单元存储的都是int类型的数据
    3. 每个int变量的需要4个字节的存储空间(可以用int i; printf(“%d”,sizeof(i));来证明)

    再看一段相关的代码:

    
    0001 # include "stdio.h"
    
    000
    2
    int main() {
    000
    3
    int i;
    000
    4
    i=1;
    000
    5
    printf("i=%d\n",i);
    000
    6
    printf("i的地址:%d",&i);
    0007 return 0; 0008 }

    会不会觉得这里的&i很熟悉?我们常用的scanf(“%d”,&i);就有这种用到这种&i的表达式。&i表示的是计算变量i所处的内存地址。

    所以printf("i的地址:%d",&i); 打印的就是以十进制整数形式所表示的“i所处的内存地址”。

    Tiny C Compiler的一次运行结果如下:

    D:\temp>tcc -run code1.c
    i=1
    i的地址:2292520

    这里所展示的变量i的地址,随着多次运行,是会发生变化的。不信?运行一次以后,重启电脑,再运行一次,看看i的地址会不会变?

    下面我们用一段代码来验证

    image

    这10个数组元素的地址之间是否是相邻的:

    0001 # include "stdio.h"
    
    0002 int main() {
    0003 int a[10],i;
    0004 printf("每个数组元素占%d个字节。\n",sizeof(a[0]));
    000
    5
    printf("起始地址\t值\n");
    0006 for (i=0; i<=9; i=i+1) {
    000
    7
    printf("%d\t\t%d\n",&a[i],a[i]);
    0008 }
    000
    9
    return 0;
    0010 }

    运行的结果如下:

    D:\temp>tcc -run code2.c
    每个数组元素占4个字节。
    起始地址       
    2292484         4266160
    2292488         2292512
    2292492         4266201
    2292496         4143320
    2292500         4329261
    2292504         207
    2292508         4143320
    2292512         2292552
    2292516         4280461
    2292520         4143320

    注意,运行的结果证明了如下事实:

    1. 每个int元素占4个字节
    2. 相邻两个元素之间的内存起始地址相差4个字节。也就是说,相邻的两个元素在内存中确实是“紧紧靠在一起”的。
    3. 未初始化的数组,其元素的值是不确定的。
  • 相关阅读:
    [React Testing] Create a Custom Render Function to Simplify Tests of Redux Components
    [React Testing] Test a Custom React Hook with React’s Act Utility and a Test Component
    Android之Android apk动态加载机制的研究
    Android之设备唯一识别
    ios之调用打电话,发短信,打开网址
    ios之如何读取plist
    android之卸载反馈的功能
    Android之针对webview的缓存
    Android之仿String的对象驻留
    Mac与Mac之中的共享方式
  • 原文地址:https://www.cnblogs.com/fzd19zx/p/1941689.html
Copyright © 2020-2023  润新知