变量名和变量地址

变量名和变量地址

研一时,很偶然的翻开谭浩强老先生的《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的地址是不可改变的量,才导致出错。

时间: 2024-08-26 04:20:58

变量名和变量地址的相关文章

js中定义用字符串拼接起来的变量名的变量

今天在写js的时候碰到了难题,我又一个页面需要生成很多的变量.但是变量的名称是根据参数的不同而区分的. 例如可能需要生成 date_1,date_2,datet_3... (后面的数字是根据参数来的). 所以我的函数名 应该由 var name = "test_"+num;   生成函数名  但这问题就来了.1     初始化变量时 等号左边是不允许是表达式的. 所以 var "test_"+num = 100; 这中肯定是错误的.后来问了大哥后才知道.可以使用  

python之学习-------变量名

python变量名的规范: 1.变量名只能包含数字.字母.下划线: 2.变量名不能以数字开头: 3.不能使用python内置的函数和关键字作为变量名 4.变量名应简短和有意义. 原文地址:https://www.cnblogs.com/yunhui/p/9462112.html

PHP中的变量名,函数名,类名是区分大小写的吗

在PHP中,自定义的函数名,类名,以及内置的函数,关键字是不区分大小写的,比如: class,Class,CLASS,while,While,ECHO,echo,NULL,Null 都是一样的. 但是PHP中,变量的名字是区分大小写的,比如: $name,$Name 就是两个不同的变量名. 原文地址:https://www.cnblogs.com/chaoguo1234/p/9538942.html

shell 组合新的变量名

shell 组合新的变量名 普通变量 name_A=Jamesname_B=Smith name=`eval echo '$'"name_$1"` echo ${name} 测试: #./filename.sh A #./filename.sh B 数组 model_so=dummy.so R_so_list=(laaaR lsssR ldddR leeeR lrrrR) A_so_list=(laaaA lsssA ldddA leeeA lrrrA) SO_LIST=`eval e

Linux编程 12 (默认shell环境变量, PATH变量重要讲解)

一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash  shell支持的Bourne变量 Bourne shell 是 UNIX 最初使用的 shell.下面例举几个常用的变量名. 变量名 描述 HOME 当前用户的主目录 PATH Shell查找命令的目录列表,由冒号分隔 PS1 Shell命令行界面的主提示符 PS2 Shell命令行界面的次提示符 如下图所示:使用echo 输出该变量名

iOS 成员变量,实例变量,属性变量的区别,联系

在ios第一版中: 我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: 注意:(这个是以前的用法) @interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @end 在现在iOS版本中: 苹果将默认编译器从GCC转换为LLVM(low leve

环境变量;位置参数变量;预定义变量

环境变量 设置环境变量:1. export 变量名=变量值 2. 变量名=变量值 export 变量名 (export 变量名=变量值 :把该变量声明为环境变量,让这个SHELL中所有的子SHELL都能查看使用这个变量) 查询变量:env 查看进程树:pstree PATH:系统查找命令的路径 PATH=”$PATH”:/root/sh →PATH变量叠加(临时) 系统默认环境变量名都是大写 位置参数变量 $n:n为数字,$0代表命令本身,$1-$9代表第一到第9个参数,10以上的参数用大括号包

[Shell]Bash变量:自定义变量

/*------------------------------------------------------------------------------------------- @黑眼诗人 <www.farwish.com> --------------------------------------------------------------------------------------------*/ 变量是计算机内存的单元,其中存放的值可以改变.变量用于暂时保存信息. 一

iOS开发中 类、对象、实例变量、成员变量、属性变量等区别和关系

类(class):具有相同属性和行为等同一类元素等总称,类是一个抽象的概念. 区分是类还是对象,看它能否继续被细分. 在OC中,类是表示对象类型的结构体,对象通过类来获取自身的各种信息.类由两个部分组成:*.h和*.m文件组成. *.m文件中 implemention部分是类的实现部分,内部包含类中的各种信息,包括各种实例方法或类方法. 类别( category):是为现有的类添加新方法的方式,通常以"类名称+类别名称"来命名. 类别中不能添加新的实例变量.但是可以在类别中添加属性.