电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

c言语字符串数组指针阐明

2017-08-06 08:38分类:电子技术 阅读:

 

常量和符号常量
在程序作业进程中,其值不能被改动的量称之为常量。常量分为纷歧样的类型,有整型常量如 1、2、3、100;浮点型常量 3.14、0.56、-4.8;字符型常量„a‟、„b‟、„0‟;字符串常量“a”、“abc”、“1234”、“1234abcd”等。

仔细的同学会发现,整型和浮点型常量咱们直接写的数字,而字符型常量用单引号来标明一个字符,用双引号来标明一个字符串,分外咱们要留神„a‟和“a”是纷歧样的,这个等会咱们要具体介绍。

常量通常有两种表现办法:
•直接常量:直接以值的办法标明的常量称之为直接常量。上述举例这些都是直接常量,直接写出来了。
•符号常量:用标识符命名的常量称之为符号常量,便是为上面的直接常量再取一个姓名。运用符号常量一是便当了解,行进程序可读性,更首要的是便当程序的后续保护,习气上符号常量咱们都用大写字母和下划线来命名。

比方,咱们能够把 3.14 取名为 PI(即π)。再比方,咱们上节课的串口程序,咱们用的波特率是 9600,假定用符号常量来进行提早声明的话,那咱们要批改成其它速率的话,就不必在程序中找 9600 批改了,直接批改声明处就能够了,两种办法举例阐明。用 const 声明。比方咱们在程序开端方位界说一个符号常量 BAUD。

界说办法是:
const 类型 符号常量姓名=常量值;

const unsigned int BAUD = 9600; /*留神结束有个分号*/
咱们就能够在程序中直接把 9600 改成 BAUD,这么咱们假定要改波特率的话,直接在程序开端方位改一下这个值就能够了。用预处理指令#define 来结束,预处理指令咱们先来知道#define。

界说办法是:
#define 符号常量名 常量值

#define BAUD 9600 /*留神结束没有分号*/
这么界说往后,只需在程序中呈现 BAUD 的话,意思便是彻底代替了后边的 9600 这个数字。

不知咱们是不是记住,咱们之前界说数码管真值表的时分,用了一个 code 要害字。
unsigned char code LedChar[] = { //数码管显现字符改换表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};咱们其时说加了 code 往后,这个真值表的数据只能被运用,不能被改动,假定咱们直接写 LedChar[0] = 1;这么就错了。实习上 code 这个要害字是 51 单片机特有的,假定是其它类型的单片机咱们只需要写成 const unsigned char LedChar[]={}就能够了,主动保存到 FLASH里,而 51 单片机只用 const 而不加 code 的话,这个数组会保存到 RAM 中,而不会保存到FLAHS 中,鉴于此,在 51 这单个系下,const 反倒变得不那么首要了,它的作用被 code 代替了,这儿咱们知道这么回事即可。

咱们来对各品种型的常量做进一步阐明。

整型常量和浮点型常量就没多少可说的了,之前咱们运用的都很娴熟了,整型直接写数字便是十进制如 128,前边 0x 开端的标明是十六进制 0x80,浮点型直接写带小数点的数据就能够了。

字符型常量是由一对单引号括起来的单个字符。它分为两种办法,一种是通常字符,一种是转义字符。

通常字符便是那些咱们能够直接书写直接看到的有形的字符,比方阿拉伯数字 0~9,英文字符 A~z,以及标点符号等。它们都是 ASCII 码表中的字符,而它们在单片机中都占用一个字节的空间,其值便是对应的 ASCII 码值。比方„a‟的值是 97,„A‟的值是 65,„0‟的值是48,假定界说一个变量 unsigned char a = „a‟,那么变量 a 的值便是 97。

除了上述这些字符以外,还有一些分外字符,它们一些是无形的,像回车符、换行符这些都是看不到的,还有一些像‟\”这类字符它们现已有分外用处了,愿望一下假定写 '''觉得编译器会怎样去解说呢。关于这些分外符号,为了能够让它们正常进入到咱们的程序代码中,C 言语就规矩了转义字符,它是以反斜杠(\)开端的特定字符序列,让它们来标明这些分外字符,比方咱们用\n 来代表换行。咱们用一个简略表格来阐明一下常用的转义字符的意思,如表 12-2 所示。

表 12-2 常用转义字符及意义
字符办法 意义
\n 换行
\t 横向跳格(恰当于Tab)
\v 竖向跳格
\b 退格
\r 光标移到行首
\\ 反斜杠字符„\‟
\‟ 单引号字符
\” 双引号字符
\f 走纸换页
\0 空值
表格不需要咱们记住,用到了,过来查就能够了。

字符串常量是用双引号括起来的字符序列,通常咱们都称之字符串。如“a”、“1234”、“welcome”等都是字符串常量。字符串常量在内存中按次第逐一存储字符串中的字符的 ASCII 码值,并且分外留神,究竟还有一个字符„\0‟,„\0‟字符的 ASCII 码值是 0,它是字符串结束象征,在写字符串的时分,这个„\0‟是躲藏的,咱们看不到,可是实习却是存在的。所以“a”就比„a‟多了一个 „\0‟,“a”的就占了 2 个字节,而 „a‟只占一个字节。

还有一 个地 方要注 意, 便是字 符串 中的空 格, 也是一 个字 符,比 如 “welcome ”总共占了 26 个字节的空间。其间 21 个字母,2 个„.‟,2 个 „ ‟(空格字符)以及一个„\0‟。
字符和字符串数组实例
为了比照字符串、字符数组、常量数组的差异,咱们写个了简略的演示程序,界说了 4个数组别离是:
unsigned char array1[] = "1-Hello!\r\n";
unsigned char array2[] = {'2', '-', 'H', 'e', 'l', 'l', 'o', '!', '\r', '\n'};
unsigned char array3[] = {51, 45, 72, 101, 108, 108, 111, 33, 13, 10};
unsigned char array4[] = "4-Hello!\r\n";
在串口调试帮手下,发送十六进制的 1、2、3、4,运用字符办法显现的话,会别离往电脑上送这 4 个数组中对应的那个数组。咱们只是在开端方位做了差异,其它均没有差异。咱们能够比照一下作用。

此外还要阐明一点,数组 1 和数组 4,数组 1 咱们是发无缺的字符串,而数组 4 咱们只是发送数组中的字符,没有发结束符号。串口调试帮手用字符办法显现是没有差异的,可是咱们假定改用十六进制显现,咱们会发现数组 1 比数组 4 多了一个字节„ \0 ‟的 ASCII 值 00。
#include <reg52.h>
bit cmdArrived = 0; //指令抵达象征,即接纳到上位机下发的指令
unsigned char cmdIndex = 0; //指令索引,即与上位机约好好的数组编号
unsigned char cntTxd = 0; //串口发送计数器
unsigned char *ptrTxd; //串口发送指针

unsigned char array1[] = "1-Hello!\r\n";
unsigned char array2[] = {'2', '-', 'H', 'e', 'l', 'l', 'o', '!', '\r', '\n'};
unsigned char array3[] = {51, 45, 72, 101, 108, 108, 111, 33, 13, 10};
unsigned char array4[] = "4-Hello!\r\n";

void ConfigUART(unsigned int baud);
void main(){
EA = 1; //开总接连
ConfigUART(9600); //装备波特率为 9600

while (1){
if (cmdArrived){
cmdArrived = 0;
switch (cmdIndex){
case 1:
ptrTxd = array1; //数组 1 的首地址赋值给发送指针
cntTxd = sizeof(array1); //数组 1 的长度赋值给发送计数器
TI = 1; //手动办法发动发送接连,处理数据发送
break;
case 2:
ptrTxd = array2;
cntTxd = sizeof(array2);
TI = 1;
break;
case 3:
ptrTxd = array3;
cntTxd = sizeof(array3);
TI = 1;
break;
case 4:
ptrTxd = array4;
cntTxd = sizeof(array4) - 1; //字符串实习长度为数组长度减 1
TI = 1;
break;
default:
break;
}
}
}
}
/* 串口装备函数,baud-通讯波特率 */
void ConfigUART(unsigned int baud){
SCON = 0x50; //装备串口为办法 1
TMOD &= 0x0F; //清零 T1 的操控位
TMOD |= 0x20; //装备 T1 为办法 2
TH1 = 256 - (11059200/12/32)/baud; //核算 T1 重载值
TL1 = TH1; //初值等于重载值
ET1 = 0; //阻遏 T1 接连
ES = 1; //使能串口接连
TR1 = 1; //发动 T1
}
/* UART 接连效劳函数 */
void InterruptUART() interrupt 4{
if (RI){ //接纳到字节
RI = 0; //清零接纳接连象征位
cmdIndex = SBUF; //接纳到的数据保存到指令索引中
cmdArrived = 1; //设置指令抵达象征
}
if (TI){ //字节发送结束
TI = 0; //清零发送接连象征位
if (cntTxd > 0){ //有待发送数据时,持续发送后续字节
SBUF = *ptrTxd; //宣告指针指向的数据
cntTxd--; //发送计数器递减
ptrTxd++; //发送指针递加
}
}
}

上一篇:智能电容器的作业原理

下一篇:in4007二极管参数阐明

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部