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的地址是不可改变的量,才导致出错。

  • 相关阅读:
    MFC Windows 程序设计>WinMain 简单Windows程序 命令行编译
    AT3949 [AGC022D] Shopping 题解
    CF643D Bearish Fanpages 题解
    CF643C Levels and Regions 题解
    CF241E Flights 题解
    CF671C Ultimate Weirdness of an Array 题解
    CF1592F Alice and Recoloring 题解
    GYM 102452E 题解
    CF494C Helping People 题解
    P5556 圣剑护符
  • 原文地址:https://www.cnblogs.com/xuhj001/p/3436177.html
Copyright © 2011-2022 走看看