第九课 C51运算符和表达式(指针和地址运算符)

第九课 C51运算符和表达式(指针和地址运算符),第1张

在第 3 课我们学习数据类型时,学习过指针类型,知道它是一种存放指向另一个数据的地址的变量类型。指针是单片机C语言中一个十分重要的概念,也是学习单片机C语言中的一个难点。对于指针将会在第九课中做详细的讲解。在这里我们先来了解一下单片机C语言中供给的两个专门用于指针和地址的运算符:

*    取内容

&    取地址取内容和地址的一般形式分别为:

变量  =  *  指针变量 指针变量  =  &  目标变量

取内容运算是将指针变量所指向的目标变量的值赋给左边的变量;取地址运算是将目标变量的地址赋给左边的变量。要注意的是:指针变量中只能存放地址(也就是指针型数据), 一般情况下不要将非指针类型的数据赋值给一个指针变量。

下面来看一个例子,并用一个图表和实例去简单理解指针的使用方法和含义。

设有两个 unsigned  int  变量    ABC 处 CBA  存放在 0x0028,0x002A 中 另有一个指针变量    portA  存放在 0x002C 中 那么我们写这样一段程序去看看*,&的运算结果

unsigned  int  data  ABC  _at_  0x0028; unsigned  int  data  CBA  _at_  0x002A; unsigned  int  data  *Port  _at_  0x002C;

#include  <at89x51.h>

#include  <stdio.h>

void  main(void)

{

SCON  =  0x50;  //串行口方式 1,允许接收 TMOD  =  0x20;  //定时器 1 定时方式 2

TH1  =  0xE8;  //11.0592MHz  1200 波特率 TL1  =  0xE8;

TI  =  1;

TR1  =  1;  //启动定时器

ABC  =  10;  //设初值 CBA  =  20;

Port  =  &CBA;  //取 CBA 的地址放到指针变量 Port

*Port  =  100;  //更改指针变量 Port 所指向的地址的内容

printf("1:  CBA=%d\n",CBA);  //显示此时 CBA 的值


Port  =  &ABC;  //取 ABC 的地址放到指针变量 Port

CBA  =  *Port;  //把当前 Port 所指的地址的内容赋给变量 CBA

printf("2:  CBA=%d\n",CBA);  //显示此时 CBA 的值

printf("     ABC=%d\n",ABC);  //显示 ABC 的值

}

程序初始时

 

地址

 

说明

 

0x00

 

0x002DH

     

0x00

 

0x002CH

     

0x00

 

0x002BH

     

0x00

 

0x002AH

     

0x0A

 

0x0029H

     

0x00

 

0x0028H

     

执行 ABC  =  10;向 ABC 所指的地址 0x28H 写入 10(0xA),因 ABC 是 int 类型要占用 0x28H 和

0x29H 两个字节的内存空间,低位字节会放入高地址中,所以 0x28H 中放入 0x00,0x29H 中 放入 0x0A

 

地址

 

说明

 

0x00

 

0x002DH

     

0x00

 

0x002CH

     

0x00

 

0x002BH

     

0x00

 

0x002AH

     

0x0A

 

0x0029H

 

ABC 为 int 类型占用两字节

 

0x00

 

0x0028H

     

执行 CBA  =  20;原理和上一句一样

 

地址

 

说明

 

0x00

 

0x002DH

     

0x00

 

0x002CH

     

0x14

 

0x002BH

 

CBA 为 int 类型占用两字节

 

0x00

 

0x002AH

     

0x0A

 

0x0029H

 

ABC 为 int 类型占用两字节

 

0x00

 

0x0028H

     

执行 Port  =  &CBA;  取 CBA 的首地址放到指针变量 Port

 

地址

 

说明

 

0x00

 

0x002DH

     

0x2A

 

0x002CH

 

CBA 的首地址存入 Port

 

0x14

 

0x002BH

     

0x00

 

0x002AH

     


0x0A

 

0x0029H

     

0x00

 

0x0028H

     

*Port  =  100;  更改指针变量 Port 所指向的地址的内容

 

地址

 

说明

 

0x00

 

0x002DH

     

0x2A

 

0x002CH

     

0x64

 

0x002BH

 

Port 指向了 CBA 所在地址 2AH

 

0x00

 

0x002AH

 

并存入 100

 

0x0A

 

0x0029H

     

0x00

 

0x0028H

     

其它的语句也是一样的道理,大家能用 Keil 的单步执行和打开存储器查看器一看,这样

就更不难理解了。

第九课 C51运算符和表达式(指针和地址运算符),第九课 C51运算符和表达式(指针和地址运算符),第2张

图 9-1    存储器查看窗

第九课 C51运算符和表达式(指针和地址运算符),第九课 C51运算符和表达式(指针和地址运算符),第3张

图 9-2    在串行调试窗口的最终结果

sizeof 运算符

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2580637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-08
下一篇 2022-08-08

发表评论

登录后才能评论

评论列表(0条)

保存