指针
C语言指针是一种保存变量地址的数据类型。它可以让程序直接访问内存中的数据,而不需要通过变量名来访问。指针变量存储的是一个地址,这个地址指向内存中的某个位置,该位置存储了一个值。
在C语言中,可以使用&运算符取得一个变量的地址,同时可以使用*运算符来访问指针所指向的内存地址中的值。
指针的使用可以提高程序的效率,因为它能够直接操作内存中的数据。但是,它也需要谨慎使用,因为使用不当会导致程序出现无法预期的错误。
1. P0 口显示指针运算结果
可以通过以下步骤在 51 单片机 P0 口显示指针运算结果:
-
首先定义一个指针变量,指向需要进行运算的值。例如:
unsigned int *ptr; // 定义一个指向 unsigned int 类型变量的指针
-
在程序中对指针进行运算操作,得到运算结果。例如:
*ptr = 100; // 将指针所指向的变量设为 100 *ptr += 50; // 将指针所指向的变量加上 50,得到 150
-
将运算结果转化为字符串,以便在 LCD 显示屏或者数码管上输出。可以使用 sprintf 函数将整数转化为字符串。例如:
char str[10]; // 定义一个字符串数组,用于存放转化后的字符串 sprintf(str, "%d", *ptr); // 将指针所指向的变量转化为字符串
-
将字符串输出到 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("%d\n", *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[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],
&Tab[6],&Tab[7]};
unsigned char i; //定义无符号字符型数据
while(1)
{
for(i=0;i<8;i++)
{
P0=*p[i];
delay150ms();
}
}
}
3. 用数组的指针控制 P0 口 8 位 LED 流水点亮
C语言中,数组名本身就是一个指向数组首元素的指针。因此,可以通过数组名来访问数组元素,也可以将数组名作为指针来操作。下面是一些常见的数组指针用法:
-
声明数组指针:可以用指针变量来表示一个数组,可以写作:int *a;
-
数组指针的初始化:可以用数组名来初始化指针变量,例如:int arr[] = {1, 2, 3}; int *a = arr;
-
数组指针的访问:对于指针变量a,可以使用a[i]来访问数组元素;
-
指针变量的算术运算:指针变量a可以进行加法和减法运算,例如:a++、a--、a+3等,表示将指向下一个或上一个元素;
-
指针变量的比较:可以用指针变量来比较两个数组元素的地址大小,例如:a<b,表示a所指向的元素在b所指向的元素之前。
需要注意的是,数组指针不同于指向数组的指针,后者指向的是整个数组空间的首地址,可以通过指针的加减操作来访问不同的数组元素。
#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 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 延时函数
}
}
}