嵌入式学习小组
直播中

h1654155275.5614

7年用户 731经验值
私信 关注

什么是C语言的指针变量

C语言的指针变量

回帖(1)

吴觅

2020-12-15 16:55:32
要研究指针,我们得先来深入理解内存地址这个概念。比如:
整个内存————>一个拥有很多房间的大楼
内存的每个单元的地址————> 每个房间的房间号
(每个房间都有房间号,比如从 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 个变量分别放到内存中,我们先来大概了解一下他们的存储方式:
内存地址  存储的数据
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 的指针,所以相当于一个特殊的变量——保存指针的变量,因此称之为指针变量,简称为指针,而通常我们说的指针就是指指针变量。
地址输入框输入谁的地址,指向的就是这个人的信息,而给指针变量输入哪个普通变量的地址,它自然就指向了这个变量的内容,通常的说法就是指针指向了该变量。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分