课程章节:
- 课程名称:物联网/嵌入式工程师
- 章节名称:第2周之第四讲 1-1 至 1-4 C语言中的数组、数组的初始化、字符串数组和字符串
- 讲师姓名:大白老师
课程内容:
C语言中的数组
含义
数组:相同数据类型变量的集合。数组是为用户处理多个数据而设计,使用数组可以给多个变量分配多个连续的内存,节省变量名的消耗。
定义方法
数据类型 数组名[元素的个数];
例如:
//int t10,t11,t12,t13,t14;
int t[5];
//int b = 10;
//int m[b]; //error
注意:
(1)数据类型: char,short,int float,double,long ,long long
(2)数组名: 合法的标识符,以数字,字符,下划线组成,首个单词要是字母或下划线
(3)元素个数: 要求是一个确定的常量值.
数组总结
int t[5];
(1)数组的成员: t[0],t[1],t[2],t[3],t[4]
(2)每个成员的类型:int
(3)数组a的类型: int [5]
(4)整个数组的大小: sizeof(int [5]) 或 sizeof(a)
(5)数组一个元素的大小: sizeof(a[0])
(6)元素的个数: sizeof(a)/sizeof(a[0])
(7)数组名代表数组首元素的地址:
a <======> &a[0]
思考:数组首地址t编译器是如何找到对应t[0],t[1],t[2]内存块的数据呢?
t[0]=====> 表示数组的首地址a偏移0个元素的大小,[]取该地址中的内容
t[1]=====> 表示数组的首地址a偏移1个元素的大小,[]取该地址中的内容
t[2]=====> 表示数组的首地址a偏移2个元素的大小,[]取该地址中的内容
t[3]=====> 表示数组的首地址a偏移3个元素的大小,[]取该地址中的内容
代码示例1:
#include <stdio.h>
int main()
{
int a[5];
printf("sizeof(int [5]) = %ld\n",sizeof(int [5]));
printf("sizeof(a) = %ld\n",sizeof(a));
printf("sizeof(a[0]) = %ld\n",sizeof(a[0]));
printf("len = %ld\n",sizeof(a)/sizeof(a[0]));
return 0;
}
代码示例2:
#include <stdio.h>
int main()
{
int a[5]; //a[0]~a[4]
int i = 0;
int len = sizeof(a)/sizeof(a[0]); //5
/*
scanf("%d",&a[0]);
scanf("%d",&a[1]);
scanf("%d",&a[2]);
scanf("%d",&a[3]);
scanf("%d",&a[4]);
*/
printf("please input %d data : \n",len);
for(i = 0;i < len;i++)
{
scanf("%d",&a[i]);
}
for(i = 0;i < len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
数组的初始化
含义
在定义数组的同时,给数组中的每一个成员变量,赋予一个初始的值。
完全初始化
例如:
int a[5] = {10,20,30,40,50};
//a[0] = 10, a[1] = 20, a[2] = 30,a[3] = 40,a[4] = 50
部分初始化
例如:
int a[5] = {10,20,30};
部分初始化:未初始化的值,系统默认为0.
//a[0] = 10, a[1] = 20, a[2] = 30,a[3] = 0,a[4] = 0
错误写法:
int a[5] = 1,2,3,4,5; //error
int a[5]; //a[0]~a[4]
a[5] = {1,2,3,4,5}; //error
int m = 5;
int a[m]; //error
代码示例1
#include <stdio.h>
int main()
{
int a[5] = {10,20,30,40,50};
int b[5] = {1,3,5};
int len = 5,i = 0;
printf("a数组: ");
for(i = 0;i < len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("===========================\n");
printf("b数组: ");
for(i = 0;i < len;i++)
{
printf("%d ",b[i]);
}
printf("\n");
printf("===========================\n");
return 0;
}
省略元素的个数,根据初始化的个数分配内存空间
例如:
int a[] = {10,20,30,40,50,60,70};
int len = sizeof(a)/sizeof(a[0]);
//a[0] = 10 a[1] = 20 .... a[6] = 70;
特点:系统会根据用户初始化的元素个数来分配对应的内存空间。
常见错误:
//int a[7]; //true
//int a[]; //error
//int a[] = {}; //error
//int a[] = {5}; //true ,只有一个元素 a[0]
代码示例2
#include <stdio.h>
int main()
{
int c[] = {1,3,4,5,6,7,2,3,4,5,6};
int i = 0,n = 0;
int len = sizeof(c)/sizeof(c[0]);
for(i = 0;i < len;i++)
{
printf("%d ",c[i]);
if(c[i] % 2 == 0)
n++;
}
printf("\n");
printf("偶数的个数 = %d\n",n);
return 0;
}
课后作业
练习
int a[8] = {10,15,27,33,78,65};
(1)要求用户输出上述数组的内容
(2)要求求上述数组中奇数的和。
(3)求上述数据中所有元素(8个)的平均值,省略小数,输出整数。
代码
#include <stdio.h>
int main()
{
int a[8] = {10,15,27,33,78,65};
int length = sizeof(a)/sizeof(a[0]);
int odd_sum = 0,average = 0,sum = 0;
for (int i = 0; i < length; ++i)
{
// 要求用户输出上述数组的内容
printf("%d ",a[i]);
// 要求求上述数组中奇数的和。
if (a[i] & 1)
{
odd_sum+=a[i];
}
sum+=a[i];
}
printf("\n");
printf("odd_sum = %d\n",odd_sum);
// 所有元素(8个)的平均值,省略小数,输出整数
printf("average = %d\n",sum/length);
return 0;
}
字符串数组和字符串
含义
字符数组: 它是一个char/unsigned char类型的数组,常用来存放字符或字符串。
存放形式
- 存放字符
char buf[5] = {'A','B','C','D','E'};
思考:字符数组中只能存放字符或字符串,这句话对不对?
不对,还可以存放整数
char buf[5] = {65,66,67,68,69}; //true;
- 存放字符串
三种写法:
char buf[30] = "welcome";
char buf[30] = {"welcome"};
char buf[30] = {'w','e','l','c','o','m','e','\0'};
示例代码:
#include <stdio.h>
int main()
{
char buf1[] = {"hello"};
char buf2[] = "hello";
char buf3[] = {'h','e','l','l','o','\0'};
int i = 0;
printf("buf1 : ");
for(i = 0;buf1[i] != '\0';i++)
{
printf("%c ",buf1[i]); //输出单个字符
}
printf("\n");
printf("===============================\n");
printf("buf2 : ");
for(i = 0;buf2[i] != '\0';i++)
{
printf("%c ",buf2[i]);
}
printf("\n");
printf("===============================\n");
printf("buf3 : ");
for(i = 0;buf3[i] != '\0';i++)
{
printf("%c ",buf3[i]);
}
printf("\n");
return 0;
}
字符串的输入和输出
- 输入
char buf[100] = {0};
scanf("%s",字符数组的首地址); //scanf("%s",buf);
功能:用户从键盘输入任意一段字符串,存放到buf中。以回车,空格,tab键盘作为用户输入的结束符号。
- 输出
char buf[] = {"hello world"};
printf("%s\n",字符数组的首地址); //printf("%s\n",a);
功能: 输出数组中第一个'\0'之前所有的字符,并显示到屏幕上。
若是用户对应字符数组中没有'\0',则用户输出乱码.
代码示例1:
#include <stdio.h>
int main()
{
char name[100];
printf("please input your name : ");
scanf("%s",name);
//scanf("%s",&name[0]);
printf("NAME\n");
printf("%s\n",name); //
return 0;
}
代码示例2:
#include <stdio.h>
int main()
{
/*
char buf[1024] = {0};
buf[0] = 'h';
buf[1] = 'e';
buf[2] = 'l';
buf[3] = 'l';
buf[4] = 'o';
buf[5] = '\0'
printf("buf = %s\n",buf);
*/
char buf[100] = {'h','e','l','\0','X','Y','Z','\0'};
printf("buf = %s\n",buf);
return 0;
}
学习笔记:
练习
char buf[100] = {0};
要求用户从键盘输入字符数串存放到buf中,若是用户输入的字符数组中存在大写字符,
则转换为小写字符,若是小写字符则不管,然后输出用户输入的数据
代码
#include <stdio.h>
int main()
{
char buf[100] = {0};
int tmp = 0;
printf("请输入一些字符:\n");
scanf("%s",buf);
for (int i = 0; i < sizeof(buf)/sizeof(buf[0]); ++i)
{
tmp = buf[i];
if (65 <= tmp && tmp <= 90)
buf[i] += 32;
}
printf("%s\n",buf);
return 0;
}
课程评价:
通过课程学习熟练使用数组定义字符串,从终端输入字符到数组方式存储。继续努力再接再厉。