嵌入式学习---在 Linux 下的 C 语言学习 Day6

Day6

C 语言编程基础

数组(Array)

字符数组(Character Array)

字符串(string)处理相关的标准 C 库函数:

  • strlen:string length,求字符串长度,即字符个数(不包括’\0’字符)
  • strcpy:string copy,字符串拷贝
  • strncpy:和 strcpy 函数功能一样,只是拷贝前面的 n 个字符。注意:‘\0’ 需要自己处理
  • strcat:string catenete,字符串连接。注意:‘\0’ 需要自己处理
  • strncat:和 strcat 函数功能一样,只是连接前面的 n 个字符。注意:‘\0’ 需要自己处理
  • strcmp:string compare,字符串比较,如果两个字符串相同,返回值为 0,否则返回值非零
  • strncmp:和 strcmp 函数功能一样,只是比较前面的 n 个字符。

字符串处理函数(str开头的)的声明都是在 string.h 头文件中

常见面试问题:

  • strlen 和 sizeof 的区别?
  • strlen 是标准 C 库函数,sizeof 不是函数,是关键字。strlen 函数计算的是不包括’\0’字符的字符串长度,而 sizeof 计算的是整个数据占内存空间的总字节数。

函数原型

//#include <stdio.h>
#include <string.h>

// 声明 printf 函数
int printf(const char*, ...);

int main()
{
        char s1[] = "abc\nd e\rf123";
        char s2[] = "abc\nd e\rf1\023";
        char s3[33] = "abc\nd e\rf1\023";
        char s4[5] = {'a',53,'\n','\0'};
        char s5[5] = {'a',53,'\n','\r'};

        printf("s1: %lu %lu\n",strlen(s1),sizeof(s1));

        return 0;
}

两种很容易弄错的转义字符:

  • \x 后面跟上 1 - 2 位十六进制数字,它表示的是 ASCII 码值为这个十六进制数值的字符
  • \ 后面跟上 1 - 3 位八进制数字,它表示的是 ASCII 码值为这个八进制数值的字符
数组排序

常用数组排序算法:

  • 冒泡排序算法
static void sort1(void)
{
        int i,j,tmp = 0;
        int num[N] = {12,32,4,123,45,1,4,78,12,45};

        for(int i = 0;i<N;i++)
        {
                printf("%d ",num[i]);
        }

        printf("\n");

        for(int i = 0;i<N-1;i++)
        {
                for(int j = 0;j<N-1-i;j++)
                {
                        if(num[j] > num[j+1])
                        {
                                tmp = num[j+1];
                                num[j+1] = num[j];
                                num[j] = tmp;
                        }
                }
        }

        for(int i = 0;i<N;i++)
        {
                printf("%d ",num[i]);
        }
        printf("\n");
}

在这里插入图片描述

  • 选择排序算法
static void sort2(void)
{
        int i,j,k,tmp=0;
        int num[N] = {12,2,45,2,546,12,345,68,90,100};
        for(int i = 0;i<sizeof(num)/sizeof(num[0]);i++)
        {
                printf("%d ",num[i]);
        }
        printf("\n");

        for(int i = 0;i<N-1;i++)
        {
                k = i;
                for(int j = i+1;j<N;j++)
                {
                        if(num[j] < num[k])
                        {
                                k = j;
                        }
                }
                if(i != k)
                {
                        tmp = num[k];
                        num[k] = num[i];
                        num[i] = tmp;
                }
        }

        for(int i = 0;i<N;i++)
        {
                printf("%d ",num[i]);
        }
        printf("\n");
}

在这里插入图片描述

  • 插入排序算法
void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];  // 待插入元素
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];  // 后移元素
            j--;
        }
        arr[j + 1] = key;  // 插入
    }
}

在这里插入图片描述

  • 快速排序算法

算法(Algorithm):解决问题的方法

升序和降序

二维数组和多维数组

一维数组:单个数据元素构成的数组。

二维数组:一维数组构成的数组,即二维数组的每个数据元素是一个一维数组。

三维数组:二维数组构成的数组。

更多维数组以此类推。

二维数组在逻辑上可以看成一个由若干行和列数据构成的表格,二维数组在内存中是按行存储的。

定义二维数组的语法规则:

数据类型关键字 数组名[一维长度][二维长度];

数据类型关键字 数组名[一维长度][二维长度] = {初值1,初值2,初值3,初值4,...};

数据类型关键字 数组名[一维长度][二维长度] = {{初值1,初值2,初值3,...},{初值1,初值2,初值3,...}};

// 在定义二维数组是如果进行了初始化(上面两种写法),那么可以省略不写一维长度,但二维长度必须写

访问二维数组的元素

二维数组的遍历可以通过两层循环实现

矩阵(Matrix):多行多列数据,可以使用二维数组表示

二维字符数组

二维字符数组可以用来表示多个字符串,即字符串数组

指针(Pointer)

指针也是一种数据类型,它用来表示内存地址

指针就是内存地址,内存地址就是内存单元的编号(从零开始的一个整数而已)

指针是 C 语言的灵魂!

CPU:中央处理器,由运算器和控制器构成,具有运算和控制两大功能。咱们写的程序就是 CPU 负责执行的,通过程序告诉 CPU 应该做什么事情。

存储器:存储数据,分为内部存储器(简称内存)和外部存储器(简称外存)。

  • 内存:读写速度极快,但容量小,价格高,掉电后数据会丢失(即易失性存储器),内存和 CPU 直接交互。

  • 外存:容量大,价格低,掉电后数据不会丢失(即非易失性存储器),但读写速度较慢。比如:硬盘、U 盘、光盘、软盘、Flash 等

在程序运行时,变量、常量、表达式的中间运算结果,以及指令都是存放在内存中,以便 CPU 使用。

文件通常存放在外存中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值