C言语变量的地址
要研讨指针,我们得先来深化了解内存地址这个概念。打个比如:全部内存就相当于一个具有许多房间的大楼,每一个房间都有房间号,比方从 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 言语变量类型深化了解。假设如今界说了
unsigned char a = 1; unsigned char b = 2; unsigned int c = 3; unsigned long d = 4;
如许 4 个变量,我们把这 4 个变量辨别放到内存中,就会是表 12-1 中所列的样子,我们先来大约理解一下他们的存储方法。
表12-1 变量存储方法
内存地址 | 存储的数据 |
---|---|
…… | …… |
0x07 | d |
0x06 | d |
0x05 | d |
0x04 | d |
0x03 | c |
0x02 | c |
0x01 | b |
0x00 | a |
变量 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 的指针,所以相当于一个特别的变量——保管指针的变量,因而称之为指针变量,简称为指针,而平日我们说的指针就是指指针变量。
地址输出框输出谁的地址,指向的就是这团体的信息,而给指针变量输出哪个通俗变量的地址,它天然就指向了这个变量的内容,平日的说法就是指针指向了该变量。