12.1 C语言变量的地址
来源:互联网 发布:淘宝取消已付款的订单 编辑:程序博客网 时间:2024/06/06 03:20
要研究指针,我们得先来深入理解内存地址这个概念。打个比方:整个内存就相当于一个拥有很多房间的大楼,每个房间都有房间号,比如从 101、102、103 一直到 NNN,我们可以说这些房间号就是房间的地址。相对应的内存中的每个单元也都有自己的编号,比如从0x00、0x01、0x02 一直到 0xNN,我们同样可以说这些编号就是内存单元的地址。房间里可以住人,对应的内存单元里就可以“住进”变量了:假如一位名字叫 A 的人住在 101 房间,我们可以说 A 的住址就是 101,或者 101 就是 A 的住址;对应的,假如一个名为 x 的变量住在编号为 0x00 的这个内存单元中,那么我们可以说变量 x 的内存地址就是 0x00,或者 0x00就是变量 x 的地址。
基本的内存单元是字节,英文单词为 Byte,我们所使用的 STC89C52 单片机共有 512 字节的 RAM,就是我们所谓的内存,但它分为内部 256 字节和外部 256 字节,我们仅以内部的 256 字节为例,很明显其地址的编号从 0 开始就是 0x00~0xFF。我们用 C 语言定义的各种变量就存在 0x00~0xFF 的地址范围内,而不同类型的变量会占用不同数量的内存单元,即字节,可以结合前面讲过的 C 语言变量类型深入理解。假如现在定义了这样 4 个变量,我们把这 4 个变量分别放到内存中,就会是表 12-1 中所列的样子,我们先来大概了解一下他们的存储方式。
表12-1 变量存储方式 内存地址 存储的数据 …………0x07d0x06d0x05d0x04d0x03c0x02c0x01b0x00a
变量 a、b 和 c 和 d 之间的变量类型不同,因此在内存中所占的存储单元也不一样,a 和b 都占一个字节,c 占了 2 个字节,而 d 占了 4 个字节。那么,a 的地址就是 0x00,b 的地址就是 0x01,c 的地址就是 0x02,d 的地址就是 0x04,它们的地址的表达方式可以写成:&a,&b,&c,&d。这样就代表了相应变量的地址,C 语言中变量前加一个&表示取这个变量的地址,&在这里就叫做“取址符”。
讲到这里,有一点延伸内容,大家可以了解下:比如变量 c 是 unsigned int 类型的,占了2 个字节,存储在了 0x02 和 0x03 这两个内存地址上,那么 0x02 是它的低字节还是高字节呢?
这个问题由所用的 C 编译器与单片机架构共同决定,单片机类型不同就有可能不同,大家知道这么回事即可。比如:在我们使用的 Keil+51 单片机的环境下,0x02 存的是高字节,0x03存的是低字节。这是编译底层实现上的细节问题,并不影响上层的应用,如下这两种情况在应用上丝毫不受这个细节的影响:强制类型转换——b = (unsigned char) c,那么 b 的值一定是 c 的低字节;取地址——&c,则得到的一定是 0x02,这都是 C 语言本身所决定的规则,不因单片机编译器的不同而有所改变。
实际生活中,我们要寻找一个人有两种方式,一种方式是通过它的名字来找人,还有第二种方式就是通过它的住宅地址来找人。我们在派出所的户籍管理系统的信息输入方框内,输入小明的家庭住址,系统会自动指向小明的相关信息,输入小刚的家庭住址,系统会自动指向小刚的相关信息。这个供我们输入地址的方框,在户籍管理系统叫做“地址输入框”。
那么,在 C 语言中,我们要访问一个变量,同样有两种方式:一种是通过变量名来访问,另一种自然就是通过变量的地址来访问了。在 C 语言中,地址就等同于指针,变量的地址就是变量的指针。我们要把地址送到上边那个所谓的“地址输入框”内,这个“地址输入框”既可以输入 x 的指针,又可以输入 y 的指针,所以相当于一个特殊的变量——保存指针的变量,因此称之为指针变量,简称为指针,而通常我们说的指针就是指指针变量。
地址输入框输入谁的地址,指向的就是这个人的信息,而给指针变量输入哪个普通变量的地址,它自然就指向了这个变量的内容,通常的说法就是指针指向了该变量。
基本的内存单元是字节,英文单词为 Byte,我们所使用的 STC89C52 单片机共有 512 字节的 RAM,就是我们所谓的内存,但它分为内部 256 字节和外部 256 字节,我们仅以内部的 256 字节为例,很明显其地址的编号从 0 开始就是 0x00~0xFF。我们用 C 语言定义的各种变量就存在 0x00~0xFF 的地址范围内,而不同类型的变量会占用不同数量的内存单元,即字节,可以结合前面讲过的 C 语言变量类型深入理解。假如现在定义了
- unsigned char a = 1;
- unsigned char b = 2;
- unsigned int c = 3;
- unsigned long d = 4;
变量 a、b 和 c 和 d 之间的变量类型不同,因此在内存中所占的存储单元也不一样,a 和b 都占一个字节,c 占了 2 个字节,而 d 占了 4 个字节。那么,a 的地址就是 0x00,b 的地址就是 0x01,c 的地址就是 0x02,d 的地址就是 0x04,它们的地址的表达方式可以写成:&a,&b,&c,&d。这样就代表了相应变量的地址,C 语言中变量前加一个&表示取这个变量的地址,&在这里就叫做“取址符”。
讲到这里,有一点延伸内容,大家可以了解下:比如变量 c 是 unsigned int 类型的,占了2 个字节,存储在了 0x02 和 0x03 这两个内存地址上,那么 0x02 是它的低字节还是高字节呢?
这个问题由所用的 C 编译器与单片机架构共同决定,单片机类型不同就有可能不同,大家知道这么回事即可。比如:在我们使用的 Keil+51 单片机的环境下,0x02 存的是高字节,0x03存的是低字节。这是编译底层实现上的细节问题,并不影响上层的应用,如下这两种情况在应用上丝毫不受这个细节的影响:强制类型转换——b = (unsigned char) c,那么 b 的值一定是 c 的低字节;取地址——&c,则得到的一定是 0x02,这都是 C 语言本身所决定的规则,不因单片机编译器的不同而有所改变。
实际生活中,我们要寻找一个人有两种方式,一种方式是通过它的名字来找人,还有第二种方式就是通过它的住宅地址来找人。我们在派出所的户籍管理系统的信息输入方框内,输入小明的家庭住址,系统会自动指向小明的相关信息,输入小刚的家庭住址,系统会自动指向小刚的相关信息。这个供我们输入地址的方框,在户籍管理系统叫做“地址输入框”。
那么,在 C 语言中,我们要访问一个变量,同样有两种方式:一种是通过变量名来访问,另一种自然就是通过变量的地址来访问了。在 C 语言中,地址就等同于指针,变量的地址就是变量的指针。我们要把地址送到上边那个所谓的“地址输入框”内,这个“地址输入框”既可以输入 x 的指针,又可以输入 y 的指针,所以相当于一个特殊的变量——保存指针的变量,因此称之为指针变量,简称为指针,而通常我们说的指针就是指指针变量。
地址输入框输入谁的地址,指向的就是这个人的信息,而给指针变量输入哪个普通变量的地址,它自然就指向了这个变量的内容,通常的说法就是指针指向了该变量。
0 0
- 12.1 C语言变量的地址
- C语言变量内存地址的分配
- C语言--返回局部变量的地址
- C语言中变量的地址分配
- C语言中变量和变量地址
- C语言中变量的地址是一个常量
- C语言变量名和地址的关系探讨
- C语言函数不能返回局部变量的地址
- C语言 变量在内存的地址分布
- C语言变量名和地址的关系探讨
- C语言变量名和地址的关系探讨
- C语言变量名和地址的关系(一)
- C语言变量名和地址的关系探讨
- C语言函数不能返回局部变量的地址
- C语言中局部变量的地址覆盖问题
- c语言变量名和地址的关系
- C语言输出指针变量地址以及指向变量的地址
- C语言 静态变量、全局变量、局部变量、指针变量 地址
- 11.4 IO口模拟UART串口通信
- CMS/PKCS#7 读书笔记
- 11.5 UART串口通信的基本应用
- 11.6 通信实例与ASCII码
- Delete Volume 操作 - 每天5分钟玩转 OpenStack(57)
- 12.1 C语言变量的地址
- 12.2 C语言指针变量的声明
- 12.3 C语言指针的简单示例
- 12.4 C语言指向数组元素的指针
- 12.5 C语言字符数组和字符指针
- 【2022】余料最少
- 12.6 1602液晶介绍
- HDU1048 The Hardest Problem Ever
- Subarray Sum to the given target value