手记

【九月打卡】第3天【养成记】嵌入式挑战第3天,C语言中的数组、数组的初始化、字符串数组和字符串

课程章节:

  • 课程名称:物联网/嵌入式工程师
  • 章节名称:第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;
}

课程评价:

通过课程学习熟练使用数组定义字符串,从终端输入字符到数组方式存储。继续努力再接再厉。

0人推荐
随时随地看视频
慕课网APP