zoukankan      html  css  js  c++  java
  • 变量名和变量地址

    变量名和变量地址

    研一时,很偶然的翻开谭浩强老先生的《C程序设计》(是师姐的书,俺的老早就卖了,估计当时觉得这本书写得不够好),很偶然的看到关于变量名的一段话:“变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。

    当时很震惊上课的时候居然没有发现这句蛮有深意的话语,可是研一的时候还是没有完全明白,只是知道有这么几个东西:变量名、内存地址、变量值。后来看到指针的地方,说到了“符号表”的这个东东,就更头大了。符号表到底是个什么样子?那个变量名到底放在内存的什么地方?

    最近在写驱动,面对的是一个芯片手册,几百个寄存器。现在来看,才发现其实还是蛮简单的。

    芯片手册大概是这么写的:

    地址

    名称

    0x00

    CHIP_ID

    0x03

    0x01

    CHIP_VERSION

    0xA2

    0x02

    ……

    ……

    0x03

    那么,“符号表”其实就是“名称”的那一列,把所有的名称放在一起就是一个符号表了嘛。

    “通过变量名找到内存地址”也很简单,比如说定义一个宏:#define CHIP_ID_ADDR       0x00就可以了。

    read函数可以这么写:

    xxx_read_val(addr, retval)

    {

           retval = *addr;

    }

    调用的时候也很容易:

    xxx_read_val(CHIP_ID_ADDR,&val);

    这也可以算是所谓的“通过变量名找到内存地址,,从其存储单元中读取数据了。”

    那么,比如说定义一个char a = ‘P’;

    编译时会为a分配一个地址,是把a和P填在表上,就是:

    地址

    名称

    0x00

    CHIP_ID

    0x03

    0x01

    CHIP_VERSION

    0xA2

    0x02

    a

    0x50

    0x03

    ……

    ……

    /*在对程序编译连接时由编译系统给每一个变量名分配对应的内存地


    址,该地址分配后不可改变,直到该空间被释放*/


    #include <iostream.h>
    void main()
    {
    int val1 = 10, val2 = 20;
    int temp;

    cout << "Before swap, val1 =" << val1 << "  " << 


    "val2 =" << val2 << endl;
    cout << "Before swap, val1 =" << &val1 << "  " << 


    "val2 =" << &val2 << endl;


    temp = &val1;   //错误:改变了变量的内存地址
    &val1 = &val2;
    &val2 = temp;

    cout << "After swap, val1 =" << val1 << "  " << 


    "val2 =" << val2 <<endl;
    cout << "After swap, val1 =" << &val1 << "  " << 


    "val2 =" << &val2 <<endl;

    }

    报错error C2106: '=' : left operand must be l-value

    解释:赋值号(‘=’)左边的操作数必须是一个左值。通俗的说:左值就是可以改变值的变量。

    发生这个错误的原因是你把常量(或不可改变值的变量)放到了赋值号的左边。此处就是因为变量val1,val2的地址是不可改变的量,才导致出错。

  • 相关阅读:
    从Android APP里面打开其他应用
    jQuery 中 serialize() 方法会受到asp.net 页面影响
    javascript 对象转换 json 的插件
    MVC 4将jQuery升级到1.9出现各种问题。。。
    用MVC做可拖拽的留言板,利用 Jquery模板 JsRender
    未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”
    处理MVC中默认的Json方法返回时间的问题
    jQuery 中使用$.post 无法获取 json
    MVC中用 BundleCollection 压缩CSS时图片路径问题
    MVC中返回Json的几种声明方式
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7778528.html
Copyright © 2011-2022 走看看