本文介绍: 需要注意的是,数组指针不同指向数组指针,后者指向的是整个数空间的首地址可以通过指针的加减操作访问不同的数组元素。也就是说,每个元素存储的是一个地址这个地址指向另一个变量的地址。在C语言中,可以使用&运算符取得一个变量的地址,同时可以使用*运算符访问指针所指向的内存地址中的值。指针变量的比较可以用指针变量来比较两个数组元素的地址大小例如a

指针

        C语言指针是一种保存变量地址的数据类型。它可以让程序直接访问内存中的数据,而不需要通过变量名访问。指针变量存储的是一个地址,这个地址指向内存中的某个位置,该位置存储一个值。

        在C语言中,可以使用&运算符取得一个变量的地址,同时可以使用*运算符来访问指针所指向的内存地址中的值。

        指针的使用可以提高程序的效率,因为它能够直接操作内存中的数据。但是,它也需要谨慎使用,因为使用不当会导致程序出现无法预期的错误

1.  P0 口显示指针运算结果

可以通过以下步骤在 51 单片机 P0 口显示指针运算结果:

  1. 首先定义一个指针变量,指向需要进行运算的值。例如

    unsigned int *ptr; // 定义一个指向 unsigned int 类型变量的指针

  2. 程序中对指针进行运算操作,得到运算结果。例如

    *ptr = 100; // 将指针所指向的变量设为 100 *ptr += 50; // 将指针所指向的变量加上 50,得到 150

  3. 将运算结果转化为字符串以便在 LCD 显示屏或者数码管输出。可以使用 sprintf 函数整数转化为字符串例如

    char str[10]; // 定义一个字符数组用于存放化后字符串 sprintf(str, “%d“, *ptr); // 将指针所指向的变量转化为字符串

  4. 字符输出到 P0 口。需要先将 P0 口配置输出模式然后使用 putchar 函数字符串逐个输出到 P0 口。例如:

    P0 = 0xff; // 将 P0 口配置输出模式 for (int i = 0; i < strlen(str); i++) { putchar(str[i]); // 将字符串逐个输出到 P0 口 }

注意:需要在程序引入 stdio.h 头文件以使用 sprintf 和 putchar 函数

#include<reg51.h> 
void main(void) 
{ 
 unsigned char *p1,*p2; //定义无符号字符型指针变量 p1,p2 
 unsigned char i,j; //定义无符号字符型数据
 i=25; //给 i 赋初值 25 
 j=15; 
 p1=&i; //使指针变量指向 i ,对指针初始化
 p2=&j; //使指针变量指向 j ,对指针初始化
 P0=*p1+*p2; //*p1+*p2 相当于 i+j,所以 P0=25+15=40=0x28 
 //则 P0=0010 1000B,结果 P0.3、P0.5 引脚 LED 熄灭,其余点亮
 while(1) 
 ; //无限循环,防止程序“跑飞”
}

2.  用指针数组控制 P0 口 8 位 LED 流水点亮

        C语言指针数组是一个数组,而数组中的每个元素都是指针。也就是说,每个元素存储的是一个地址,这个地址指向另一个变量的地址。

        使用指针数组可以方便地存储多个指针,并操作这些指针。例如,可以使用指针数组来存储一组字符串,然后循环输出每个字符串。

指针数组的声明方式如下

type *name[count];

        其中,type表示指针指向的数据类型name是指针数组的名称count是指针数组的长度

例如,下面的代码声明一个包含5个整型指针的指针数组:

int *ptr_array[5];

可以使用下标访问指针数组中的每个元素,例如:

int a = 10;
int *p = &a;
ptr_array[0] = p;
printf("%dn", *ptr_array[0]);  // 输出 10

代码示例

#include<reg51.h> 
/************************************************* 
函数功能延时约 150ms (3*200*250=150 000μs=150ms 
*************************************************/ 
void delay150ms(void) 
{ 
 unsigned char m,n; 
 for(m=0;m<200;m++) 
 for(n=0;n<250;n++) 
 ; 
} 
/************************************************* 
函数功能:主函数
*************************************************/ 
void main(void) 
{ 
 unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
 unsigned char *p[ ]={&amp;Tab[0],&amp;Tab[1],&amp;Tab[2],&amp;Tab[3],&amp;Tab[4],&amp;Tab[5], 
 &amp;Tab[6],&Tab[7]}; 
 unsigned char i; //定义无符号字符型数据
 while(1) 
 { 
 for(i=0;i<8;i++) 
 { 
 P0=*p[i]; 
 delay150ms(); 
 } 
 } 
}

3.  用数组的指针控制 P0 口 8 位 LED 流水点亮

        C语言中,数组名本身就是一个指向数组首元素的指针。因此,可以通过数组名访问数组元素,也可以将数组名作为指针来操作。下面是一些常见的数组指针用法

  1. 声明数组指针:可以用指针变量来表示个数组,可以写作int *a;

  2. 数组指针的初始化:可以用数组名初始化指针变量,例如:int arr[] = {1, 2, 3}; int *a = arr;

  3. 数组指针的访问:对于指针变量a,可以使用a[i]来访问数组元素;

  4. 指针变量的算术运算:指针变量a可以进行加法和减法运算,例如:a++、a–、a+3等,表示将指向下一个或上一个元素;

  5. 指针变量的比较:可以用指针变量来比较两个数组元素的地址大小,例如:a<b,表示a所指向的元素在b所指向的元素之前。

        需要注意的是,数组指针不同于指向数组的指针,后者指向的是整个数空间的首地址,可以通过指针的加减操作来访问不同的数组元素。

#include<reg51.h&gt; 
/************************************************* 
函数功能延时约 150ms (3*200*250=150 000μs=150ms 
*************************************************/ 
void delay150ms(void) 
{ 
 unsigned char m,n; 
 for(m=0;m<200;m++) 
 for(n=0;n<250;n++) 
 ; 
} 
/************************************************* 
函数功能:主函数
*************************************************/ 
void main(void) 
{ 
 unsigned char i; 
 unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF, 
 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 
 0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00, 
 0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81, 
 0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB}; 
 //流水控制码
 unsigned char *p; //定义无符号字符型指针
 p=Tab; //将数组首地址存入指针 p 
 while(1) 
 { 
 for(i=0;i<32;i++) //共 32 个流水控制码
 { 
 P0=*(p+i); //*(p+i)的值等于 a[i] 
 delay150ms(); //调用 150ms 延时函数
 } 
 } 
}

51单片机应用从零开始(九)·数组-CSDN博客

原文地址:https://blog.csdn.net/MANONGDKY/article/details/134760887

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_37856.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注