前边我们提到了,指针的意义往往在小程序里是体现不出来的,对于简单程序来说,有时候用了指针,反而可能比没用指针还麻烦,但是为了让大家巩固一下指针的用法,我还是写了个使用指针的流水灯程序,目的是让大家从简单程序开始了解指针,当程序复杂的时候不至于手足无措。
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void ShiftLeft(unsigned char *p);
void main(){
unsigned int i;
unsigned char buf = 0x01;
ENLED = 0; //使能选择独立 LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
while (1){
P0 = ~buf; //缓冲值取反送到 P0 口
for (i=0; i<20000; i++); //延时
ShiftLeft(&buf); //缓冲值左移一位
if (buf == 0){ //如移位后为 0 则重赋初值
buf = 0x01;
}
}
}
/* 将指针变量 p 指向的字节左移一位 */
void ShiftLeft(unsigned char *p){
*p = *p << 1; //利用指针变量可以向函数外输出运算结果
}
这是一个使用指针实现流水灯的例子,纯粹是为了讲指针而写这样一段程序,程序中传递的是 buf 的地址,把这个地址直接传递给函数 ShiftLeft 的形参指针变量 p,也就是 p 指向了 buf。对比之前的函数调用,大家是否看明白,如果是普通变量传递,只能单向的,也就是说,主函数传递给子函数的值,子函数只能使用却不能改变。而现在我们传递的是指针,不仅仅子函数可以使用 buf 里边的值,而且还可以对 buf 里边的值进行修改。
此外再强调一句,只要是*p 前边带了变量类型如 unsigned char,就是表示定义了一个指针变量 p,而执行代码中的*p,是指 p 所指向的内容。
通过理论的学习和这样一个例程,我想大家对指针应该有概念了,至于它的灵活应用,需要我们在后边的程序中慢慢去体会,理论上就不再过多赘述了。
关键字:C语言 指针
引用地址:
C语言指针的简单示例
推荐阅读最新更新时间:2024-03-16 15:26
STM32 | STM32中一些非常重要的C语言知识点汇总
说在前面的话 一位初学单片机的小伙伴让我推荐C语言书籍,因为C语言基础比较差,想把C语言重新学一遍,再去学单片机,我以前刚学单片机的时候也有这样子的想法。 其实C语言是可以边学单片机边学的,学单片机的一些例程中,遇到不懂的C语言知识,再去查相关的知识点,这样印象才会深刻些。 下面就列出了一些STM32中重要的C语言知识点,初学的小伙伴可以多读几遍,其中大多知识点之前都有写过,这里重新整理一下,更详细地分析解释可以阅读附带的链接。 assert_param 断言(assert)就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。 断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真
[单片机]
PIC C语言编程_PICC中的指针
PICC中指针的基本概念和标准C语法没有太多的差别。但是在PIC单片机这一特定的架构上,指针的定义方式还是有几点需要特别注意。 1) 指向RAM的指针 如果是汇编语言编程,实现指针寻址的方法肯定就是用FSR寄存器,PICC也不例外。为了生成高效的代码,PICC在编译C原程序时将指向RAM的指针操作最终用FSR来实现间接寻址。这样就势必产生一个问题:FSR能够直接连续寻址的范围是256字节(bank0/1或bank2/3),要覆盖最大512字节的内部数据存储空间,又该如何让定义指针?PICC还是将这一问题留给编程员自己解决:在定义指针时必须明确指定该指针所适用的寻址区域,例如: unsignedchar*ptr0;//①
[单片机]
使用C语言进行单片机电子时钟课程设计
第一章 设计目的及要求 1.目的 通过对电子时钟系统进行编程与Protues仿真,进一步掌握单片机的组成,P1、P0、P2、P3口的应用,蜂鸣器的应用,定时中断程序的编写及应用,对之前学习的单片机课程进行回顾与应用;初步掌握Protues仿真方法以及用keil软件编写程序的方法。 2.题目与要求 本次课程设计的题目为:电子时钟的设计,其具体要求为: (1)能实现时、分、秒的显示; (2)能实现12、24小时制的切换; (3)能设定时间; (4)能设定闹钟; 整个系统要设计键盘和显示器,利用单片机内部时钟完成定时器的定时设计。 第二章 理论基础 1.AT89C52芯片 AT89C52芯片的引脚图如图1所示。 图1 AT89C5
[单片机]
基于C语言设置TMS320 DSP中断向量表
摘要: 随着DSP芯片应用的不断深入,用C语言开发DSP芯片,不仅可以使DSP芯片的开发速度大大提高,也使得程序的修改和移植变得十分方便。C语言设置TMS320系列DSP中断向量表是高级语言开发DSP的一个具体应用。 1、引言 DSP(数字信号处理器)自二十世纪70年代末80年代初诞生以来,得到了突飞猛进的发展,在信号处理、通讯、雷达等方面应用越来越广泛,而且开发手段和开发设备也越来越多样化。其中C语言在DSP开发应用中起着越来越重要的作用,以C语言编写的DSP应用程序具有可读性、可移植性,易于维护和修改。另外在DSP应用系统中,中断是完成数据传递、实时处理等的重要手段,因而用C语言完成对DSP中断设置是DSP开发的重要
[嵌入式]
C语言和单片机有什么关系?
学习单片机之前要学什么?提起这个就想起我当年开始学习单片机的血泪史了。 08年我加入学校的电子实验室,为08年的全国电子大赛做准备。 08年的电子大赛分类3类, 硬件设计类、单片机软件类、产品的调试动手类 。 现在的大赛应该有所改动。 我选择的是软件类,选择这个的原因是我觉得这个更加的神秘,就是这个神秘感让我对软件更加的有兴趣。 刚开始真的是一窍不通,我 买了一本C语言书 ,独自学习了 2个月 ,做了 3本笔记 ,然后 又学习了1个月的数字电路 ,到这个时候,我都快奔溃了,3个月过去了,还是啥都不懂! 这个时候我已经做好放弃的准备了,最后想想:自己选的路,跪着也要走完。 正好那段时间每天也闲的蛋疼,就抱着边玩边学的态度,说出来你可
[单片机]
PIC单片机CCS之C语言(#USE FAST_IO的用法)
#USE FAST_IO 语法:#use fast_io(port) port是A~G 目的:影响编译器如何产生输入输出代码,说明如下.这种指令有效,直到出现下一个#use xxxx_io为止.执行I/O的快速方法将使编译器不用对I/O方向寄存器进行编程就可执行I/O操作,但用户必须保证通过set_tris_X()来设置I/O方向寄存器. 例子:#use fast_io(A)例子文件:ex_cust.c;该文件在前面已经叙述过了
[单片机]
STC12C2052AD单片机AD转换C语言程序
首先:这个小程序搞了我两天,加上焊板子共三天,当然是业余时间。也有24个小时了。 我瞪着电脑两个晚上,我拆了装,装了拆(下载程序不在本板子上)。最后,就在今天!(“今”读四声)18点。可让我找到问题所在了!搞了两个晚上,AD转换控制流程,根本没错!!!!啊!! 错就错在一个小地方,打死都想不到的地方。 具体错在哪,请在下文中找!!!! 功能:STC12C2052AD AD转换C程序 +PWM输出功能 成功使用。 应用:AD检测电压进行过欠压保护(继电器控制)+PWM把直流电压斩波成脉动直流。 板子功能:给手机电池充电。 降压用的LM317,小电流应用应该够了。没时间去买开关管,就用的9013开关。 图纸:
[单片机]
C语言一百例第十五例
代码: /* C语言第十五例 题目:利用条件运算符的嵌套来完成此题:学习成绩 =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 程序分析:(a b)?a:b这是条件运算符的基本例子。 */ #include stdio.h void main(void) { int a; char grade; printf( 请输入一个分数:n ); scanf( %d ,&a); grade=(a =90)?'A':((a =60)?'B':'C'); //条件运算符的意思就是,当括号里的为真,执行问号后面的,不然就执行冒号后面的程序,
[单片机]