[C] 第7章 数组

文章目录

  • [C] 数组_基于51单片机
    • 数组
    • 一维数组
      • 一维数组的定义形式
        • 定义形式
        • 注意事项
        • 举例1:数组名与其他变量同名的实例
        • 举例2:数组定义
        • 举例3:同一类型定义数组和变量
      • 一维数组的引用
        • 数组元素的一般形式
        • 举例1:单独使用一个标变量
        • 举例2:使用循环语句逐个使用各下标变量
      • 一维数组的初始化
        • 初始化赋值的一般形式
        • 举例1:全部初始化赋值
        • 注意事项
      • 案例1:秒针程序
    • 字符数组
      • 字符数组的定义
      • 字符数组的初始化
      • 字符串和字符串结束标志
      • 字符串处理函数
        • 字符串连接函数 strcat
        • 字符串复制函数 strcpy
        • 字符串比较函数 strcmp
        • 测字符串函数函数 strlen

[C] 数组_基于51单片机

数组

  • 数组:具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。
  • 分类:按数组元素的类型不同:数值数组(整数数组、浮点数数组、多维数值数组)、字符数组、指针数组、结构数组等。

一维数组

一维数组的定义形式

定义形式
类型说明符 数组名[常量表达式],...;
  • 类型说明符:基本数据类型或构造数据类型
  • 数组名:用户定义的数组标识符
  • 常量表达式:数据元素的个数,称为数组的长度
  • 举例:一维数组定义实例
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)允许在同一类型说明中,说明多个数组或多个变量。
举例1:数组名与其他变量同名的实例
void main(void)
{
	int a;
	float a[10]; // 数组名与变量名a同名,所以是错误的
}
举例2:数组定义
#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]; // 使用变量,不合法,这种说明方式是错误的
}
举例3:同一类型定义数组和变量
int a,b,c,arry1[10],arry2[20];

一维数组的引用

数组元素的一般形式
数组名[下标]
  • 注意
(1)下标只能为整数或整型表达式;
(2)如果为小数时,C编译会自动取整;
(3)数组元素也称为下标变量。必须先定义数组,才能使用下标变量;
(4)只能逐个使用下标变量,而不能依次引用整个数组。
举例1:单独使用一个标变量
void main(void)
{
	int a[10];
	a[7] = 6;	// 单独使用一个标变量	
}
举例2:使用循环语句逐个使用各下标变量
void main(void)
{
	int a[10];
	for(int i=0;i<10;i++)
	{
		a[i] = i;	// 使用循环语句逐个使用各下标变量
	}
}

一维数组的初始化

初始化赋值的一般形式
类型说明符 数组名[n] = {值1,值2,...,值n-1};
 // { }中即为个元素初值,各值之间用逗号间隔。
举例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;
  • 当数组为全局变量或静态变量时,未赋值的元素编译器会默认为0;而对于自动变量(非静态变量),未赋值的元素值为未定义(可能是随机值)。
  • 加入全部给元素赋值,则在数组说明中,可以省略数组元素的个数。
/****************** 省略数组元素个数举例 *********************/
 // 常规定义方法
 static a[5] = {1,2,3,4,5};
 // 可以写为如下语句
 static a[] = {1,2,3,4,5};

案例1:秒针程序

 // 一维数组的定义与赋初值
 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";

字符串处理函数

  • 头文件”stdio.h“:用于输入/输出的字符串函数;
  • 头文件”string.h“:使用其他字符串函数
字符串连接函数 strcat
  • 格式如下
 // @功能:将字符数组2中的字符串连接到字符数组1中字符串的后面,并删除字符串1后的串标志'\0'
strcat (字符数组名1,字符数组名2); 
  • 举例(strcat应用举例)
#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
字符串复制函数 strcpy
  • 格式如下
 // @功能:将字符数组2中的字符串复制到字符数组1中。串结束标志'\0'也一同复制。
strcpy(字符数组1,字符数组2);
  • 举例(strcpy应用举例)
#include "string.h"

void main(void)
{
	// strcpy 函数要求字符数组1有足够的长度,否则不能全部装入所复制的字符串
	static char st1[15],st2[] = "C51 language";
	strcpy(st1,st2);
	puts(st1);
	printf("\n");
}
字符串比较函数 strcmp
  • 格式如下
 // @功能:按照ASCII码比较2个数组中的字符串,并由函数返回值返回比较结果。
strcmp(字符数组名1,字符数组2);
  • 字符串比较之间的关系
字符串关系 返回值
字符串1 = 字符串2 返回值 = 0
字符串1 > 字符串2 返回值 > 0
字符串1 < 字符串2 返回值 < 0
  • 举例(strcmp)
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
  • 格式如下
strlen(字符数组名);
  • 举例(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);
}

你可能感兴趣的:(C,c语言,单片机,笔记,51单片机,开发语言)