类型说明符 数组名[常量表达式],...;
int a[5]; //整型数组a中有5个元素
float b[10],c[10]; //实型数组b中有10个元素,实型数组中有10个元素
char ch[10]; //字符数组ch有10个元素
(1)数组的类型的类型是指数组元素的取值类型。一个数组只有一种类型;
(2)数组名必须是合法标识符,也就是说必须符合标识符的书写规定;
(3)数组名不能与程序中其他变量名同名;
(4)若用n表示数组元素的总数,则数组的第一个元素的下标为0,最后一个为n-1。如d[5]表示数组d中有5个元素,依次是d[0]、d[1]、d[2]、d[3]、d[4];
(5)不能在方括号里用变量表示数组的个数,但是可以用符号常量或常量表达式;
(6)允许在同一类型说明中,说明多个数组或多个变量。
void main(void)
{
int a;
float a[10]; // 数组名与变量名a同名,所以是错误的
}
#define FD 5
void main(void)
{
int a[3+2],b[7+FD]; // 合法
....
}
又如
void main(void)
{
int n = 5;
int a[n]; // 使用变量,不合法,这种说明方式是错误的
}
或
void main(void)
{
int n;
int a[n]; // 使用变量,不合法,这种说明方式是错误的
}
int a,b,c,arry1[10],arry2[20];
数组名[下标]
(1)下标只能为整数或整型表达式;
(2)如果为小数时,C编译会自动取整;
(3)数组元素也称为下标变量。必须先定义数组,才能使用下标变量;
(4)只能逐个使用下标变量,而不能依次引用整个数组。
void main(void)
{
int a[10];
a[7] = 6; // 单独使用一个标变量
}
void main(void)
{
int a[10];
for(int i=0;i<10;i++)
{
a[i] = i; // 使用循环语句逐个使用各下标变量
}
}
类型说明符 数组名[n] = {值1,值2,...,值n-1};
// { }中即为个元素初值,各值之间用逗号间隔。
int a[7] = {0,1,2,3,4,5,6};
// 相当于
a[0] = 0;a[1] = 1;....;a[7] = 6
static int a[15] = {0,1,2,3,4}; // 表示只给a[0]~a[4]前面5个元素赋值,而后面几个元素自动赋值为 0
// 正确的赋值方法如下:
static int a[5] = {1,1,1,1,1};
// 错误的赋值方法如下:
static int a[5] = 1;
/****************** 省略数组元素个数举例 *********************/
// 常规定义方法
static a[5] = {1,2,3,4,5};
// 可以写为如下语句
static a[] = {1,2,3,4,5};
// 一维数组的定义与赋初值
unsigned char tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共阴极数码管0~9的码
unsigned char Disp_SW; //定义十位
unsigned char Disp_GW; //定义个位
unsigned char S_Display_SW; //定义秒十位
unsigned char S_Disply_GW; //定义秒个位
unsigned char second,msecond;
// 延时函数
void delay(unsigned int cnt)
{
while(cnt);
}
void main(void)
{
EX0 = 1; // 外部中断0设置
IT0 = 1;
EX1 = 1; // 外部中断1设置
IT1 = 1;
TMOD |= 0X01; // 定时器设置 10ms in 12M crystal
TH0 = 0XD8;
TL0 = 0XF0;
ET0 = 1;
TR0 = 0; // 打开中断
EA = 1;
CLR();
while(1)
{
P0 = S_Display_SW; // 显示秒十位
P2 = 1;
delay(300); // 短暂延时
P0 = S_Display_GW; // 显示秒个位
P2 = 2;
delay(300);
P0 = 0X40;
P2 = 3;
delay(300);
P0 = Disp_SW; // 显示十位
P2 = 4;
delay(300); // 短暂延时
P0 = Disp_GW; // 显示个位
P2 = 5;
delay(300);
}
}
// 定时器中断函数
void tim(void) interrupt
{
TH0 = 0XD8;
TL0 = 0XF0; // 重新赋值
msecond++;
if(msecond == 100)
{
msecond = 0;
second++; // 秒加1
if(second == 100)
second = 0;
S_Display_SW = tab[second/10]; // 十位显示值处理
S_Display_GW = tab[second%10]; // 个位显示值处理
}
Disp_SW = tab[msecond/10]; // 十位显示值处理
Disp_GW = tab[msecond%10]; // 个位显示值处理
}
// 外部中断函数
void ISR_INT0(void) interrupt 0
{
TR0 = !TR0; // 利用外部中断打开和关闭定时器0用于开始和停止计时
}
void ISR_INT1(void) interrupt 2
{
if(TR0 == 0) // 停止可以清0
{
CLR();
}
}
//CLR函数的具体内容
void CLR(void)
{
second = 0; // 利用外部中断清0
msecond = 0;
Disp_SW = tab[msecond/10]; // 十位显示值处理
Disp_GW = tab[msecond%10]; // 个位显示值处理
S_Display_SW = tab[second/10]; // 十位显示值处理
S_Display_GW = tab[second%10]; // 个位显示值处理
}
char 数组名[下标数组]; // 一维数组的定义形式
char 数组名[下标1总数][下标2总数]; // 二维数组的定义形式
char a1[10]; // 定义一个拥有10个元素的字符型数组
char a2[10][5]; // 定义一个拥有10*5个元素的字符数组
char a3[10][10]; // 定义一个拥有10*10个元素的字符数组
字符数组和数值数组相同,也允许在类型说明时作初始化赋值。
举例(字符数组初始化实例)
char c1[10] = {'c','d','e','f','g'}; // 未赋值的数组元素,由系统自动赋值为0
char c2[10] = {'c','d','e','f','g'}; // 当对全体元素赋初值时也可以省略长度
// 说明,此时c数组的长度自动定为5
char error[] = {'e','r','r','o','r'}; // 定义一个error字符数组
char a[][5] = {{'B','A','S','I','C'},{'d','B','S','I','C'}}; // 定义一个2行5列的字符数组
(1)C语言通常使用一个字符数组来存放一个字符串;并以'\0'作为字符串的结束符;
(2)当把一个字符串存入一个数组时,也要把结束符'\0'存入数组,以此作为该字符串是否结束的标志;
(3)有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了;
可以通过字符串的方式对数组进行复制初始化;
(4)使用字符串方式赋值比用字符逐个赋值要多占一个字节空间,用于存放字符串结束标志位'\0';
(5)’/0‘是由系统自动加上的,程序员无需在编写程序时加上。
char c[] = {'c','5','1',’ ','p','r','o','g','r','a','m'};
// 可写为
char c[] = {"c51 program"};
// 或去掉{ }写为
char c[] = "c51 program";
// @功能:将字符数组2中的字符串连接到字符数组1中字符串的后面,并删除字符串1后的串标志'\0'
strcat (字符数组名1,字符数组名2);
#include "string.h"
void main(void)
{
static char st1[50] = "My name is ";
char st2[15];
printf("input your name:\n");
gets(st2);
strcat(st1,st2);
puts(st1);
}
输入:C51
输出:My name is C51
// @功能:将字符数组2中的字符串复制到字符数组1中。串结束标志'\0'也一同复制。
strcpy(字符数组1,字符数组2);
#include "string.h"
void main(void)
{
// strcpy 函数要求字符数组1有足够的长度,否则不能全部装入所复制的字符串
static char st1[15],st2[] = "C51 language";
strcpy(st1,st2);
puts(st1);
printf("\n");
}
// @功能:按照ASCII码比较2个数组中的字符串,并由函数返回值返回比较结果。
strcmp(字符数组名1,字符数组2);
字符串关系 | 返回值 |
---|---|
字符串1 = 字符串2 | 返回值 = 0 |
字符串1 > 字符串2 | 返回值 > 0 |
字符串1 < 字符串2 | 返回值 < 0 |
void main(void)
{
int k1;
static char st1[15],st2[] = "Hello World";
printf("input a string:\n");
gets(st1);
k1 = strcmp(st1,st2);
if(k1 == 0) printf("st1 = st2\n");
if(k1 > 0) printf("st1 > st2\n");
if(k1 < 0) printf("st1 < st2\n");
}
strlen(字符数组名);
#include "string.h"
void main(void)
{
int k1;
static char st[] = "HELLO WORLD";
k1 = strlen(st);
printf("The length of the string is %d\n",k1);
}