您的位置:首页 > 编程语言 > C语言/C++

基于proteus的51单片机仿真实例四十七、C语言的指针演示实例

2017-05-07 23:06 441 查看
1、指针是C语言中的一个重要概念,也是C语言的一个重要特色。

正确而灵活地使用指针,可以有效地表示复杂的数据结构,动态地分配内存,方便地使用字符串,有效地使用数组。

2、指针与地址

计算机程序的指令、常量和变量等都要存放在以字节为单位的内存单元中,内存的每个字节都具有一个唯一的编号,这个编号就是存储单元的地址。

各个存储单元中所存放的数据,称为该单元的内容。计算机在执行任何一个程序时都要涉及到单元访问,就是按照内存单元的地址来访问该单元中的内容,即按地址来读或写该单元中的数据。由于通过地址可以找到所需要的单元,因此这种访问是“直接访问”方式。

另外一种访问是“间接访问”,它首先将欲访问单元的地址存放在另一个单元中,访问时,先找到存放地址的单元,从该单元中取出地址,然后才能找到需要访问的单元,再读或写该单元的数据。在这种访问方式中使用了指针。

C语言中引入了指针类型的数据,指针类型数据是专门用来确定其他类型数据地址的。因此一个变量的地址就称为该变量的指针。例如,一个整型变量m存放在内存单元的56H地址中,则56H就是变量m的指针。

如果有一个变量专门用来存放另一个变量的地址,则该变量称为指向变量的指针变量,简称指针变量。例如用一个变量n来存放整型变量m的地址56H,则n即为一个指针变量。

3、指针变量的定义

指针变量与其他变量一样,必须先定义,后使用。指针变量定义的一般格式为:

数据类型 [存储器类型] 指针变量名;

说明如下:

数据类型:指出该指针变量所指向的变量的类型。

存储器类型:这是一个可选项,它是C51编译器的一种扩展,如果带有此选择项,指针被定义为基于存储器的指针,无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用3个字节,而基于存储器的指针,其指针长度可以1个或两个字节。

指针变量名:由编程者定义的指针变量的名字,与普通变量的命名方法一样。

 

特别要注意:变量的指针和指针变量是两个不同的概念。变量的指针就是该变量的地址,而一个指针变量里面存放的内容是另一个变量在内存中的地址,拥有这个地址的变量则称为该指针变量所指向的变量。每一个变量都有它自己的指针(即地址)。而每一个指针变量都是指向另一个变量的,为了表示指针变量和它所指向的变量之间的关系,C语言中用符号“*”来表示“指向”,例如整型变量m的地址60H存放在指针变量n中,则可用*n来表示指针变量n所指向的变量,即*n也表示变量m。

4、指针变量的引用

指针变量是含有一个数据对象地址的特殊变量,指针变量中只能存放地址。在实际的编程和运算过程中,变量的地址和指针变量的地址是不可见的,因此,C语言提供了一个取地址符“&”,使用取地址符“&”和“=”就可以使一个指针变量指向一个变量。

例如:int i;

int *pt;

pt=&i

通过取地址运算和赋值运算后,指针变量pt就指向了变量i。

当完成了变量、指针变量的定义以及指针变量的引用后,就可以对内存单元进行间接访问。此时,需要用到指针变量运算符(又称间接运算符)“*”。

例如:要将变量t的值赋给变量x,

先定义两个变量:

int x;

int t;

直接访问方式为:x=t;

间接访问方式为:int *pt;

pt=&t;

x=*pt;

有关的运算符有两个:“&”和“*”。在不同场合所代表的含义是不同的,这个一定要搞清楚。例如:

int *pt;进行指针变量的定义,此时“*”为指针变量说明符。

pt=&t;此时“&”为取t的地址并赋给pt(取地址)。

x=*pt;此时“*”为指针运算符,即将指针变量pt所指向的变量值赋给x(取内容)。

 

5、指针的初始化

在使用指针前必须进行初始化,一般格式如下:

类型说明符指针变量=初始地址值;

示例如下:

unsigned char *p;定义无符号字符型指针变量p;

unsigned char m;定义无符号字符型数据m;

p=&m;将m的地址存放于p中(指针变量有了确定指向,即被初始化了);

 

未经初始化的指针严禁使用,否则将引起严重后果。

 

6、本实例进行一个简单的运算,以演示指针运算的结果,并将结果通过P0口显示。

7、在keil c51中新建工程ex36,编写如下程序代码,编译并生成ex36.hex文件。

//实例36:指针运算结果演示,通过P0口显示结果

#include <reg51.h>     //包含头文件

void main(void)

{

  unsigned char *p1,*p2;  //定义无符号字符型指针变量

 unsigned char i,j;     //定义无符号字符型变量

 i = 30;        //变量赋初值

 j = 20;

 p1 = &i;       //指针初始化,

 p2 = &j;

 P0 = *p1 + *p2;    // 指针变量的运算结果送P0口显示

 while(1)     //

 {

 }

}

8、在proteus中新建仿真文件ex36.dsn,原理图如下图所示



9、将ex36.hex文件载入at89c51,启动仿真,运行结果如下图所示。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐