zoukankan      html  css  js  c++  java
  • 关于普通变量和数组元素地址的讨论

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

    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. 未初始化的数组,其元素的值是不确定的。
  • 相关阅读:
    Cucumber 入门【转】
    unable to find instrumentation target package
    【转】fiddler 请求配置https后出现“你的连接不是私密连接。。。”,处理过程
    DirBuster工具扫描敏感文件
    pycharm常用快捷键
    读取 ini 配置文件
    TypeError: a bytes-like object is required, not 'str'
    日期控件定位处理
    pywin32模块安装
    python:os.path模块常用方法
  • 原文地址:https://www.cnblogs.com/fzd19zx/p/1941689.html
Copyright © 2011-2022 走看看