嵌入式从入门到精通(入土)——超详细知识点分享2

Linux C从入门到精通(入土)

  1. C语言基础(循环语句)

  2. for循环

  3. 格式:
    For(表达式1;表达式二;表达式3)
    {
    循环体;
    }
    表达式1:赋初始值;
    表达式2:终止条件;
    表达式3:增值或减值。
    注意:
    a) 没有赋初始值表达式,可以写在for循环的上边;
    b) 没有表达式2,循环是死循环,没有表达式3也是死循环,但表达式3可以写在循环体的最后。
    c) for(;;):表示死循环。

  4. 执行顺序
    先执行表达式1,然后判断表达式2是否成立,成立执行循环体,再执行表达式3,再判断表达式2是否成立,再继续执行循环体,再执行表达式3……直到表达式2不成立,循环结束。

  5. for嵌套格式
    for(表达式1;表达式2;表达式3)
    {
    for(表达式1;表达式2;表达式3)
    {
    循环体;
    }
    }

  6. while循环

  7. 格式1
    While(表达式)
    {
    循环体;
    }
    执行顺序:判断表达式是否成立,成立执行循环体,再判断表达式是否成立,成立执行循环体,……直到表达式不成立,循环结束。
    注意:while(1)=死循环。

  8. 格式二:do……while
    do{
    循环体;
    }while(表达式);
    执行顺序:首先执行一遍循环体,再判断是否成立,成立继续执行循环体,不成立结束循环。

  9. goto循环

  10. 格式
    loop:
    代码段;
    if(表达式)
    goto loop;

  11. 执行顺序:
    执行代码段,判断表达式是否成立,成立跳到loop继续执行代码段。

  12. 循环控制语句:break;continue;return

  13. break:跳出循环(结束循环);

  14. continue:结束本次循环,继续下一次循环。

  15. return:结束函数。Main函数中,不是正常执行完main函数内容,习惯写为:return -1;

  16. 数组

  17. 概念:
    由一种或多种数据类型数据的集合,将组成数组的每个数据叫做元素。

  18. 特点
    数据类型相同,内存空间连续。

  19. 一维数组

  20. 概念:只有一个下标的数组。

  21. 定义格式:
    [存储类型] 数据类型 数组名[下标];
    下标:元素的个数。

  22. 元素的访问:数组名[下标]。
    下标的取值:从0开始,元素个数=下标数-1;

  23. 初始化
    a) 定义时未初始化
    初始值为随机值。接下来需要逐个元素进行赋初始值,未赋初始值的元素依然是随机值。
    b) 定义时部分初始化
    未初始化元素值为0.
    c) 定义时,全部初始化
    可以省略下标。

  24. sizeof(数组名):计算数组所占空间大小。

  25. 注意:

  26. 若开辟时省略下标,开辟空间为初始化多少个开辟对应多少个元素。若没有省略下标,下标值为多少个开辟多少个元素空间,就只能初始化元素个数为下标值。

  27. 数组一旦定义开辟的内存空间就已经确定,定义时下标不能为随机值或未知量。

  28. 越界访问数据,不报错,使用时要注意越界问题。

  29. 排序:冒泡、选择

  30. 冒泡排序:下标为0和下标为1,将小的数后移,之后下标为1和下标为2 的比较,小的后移,直到将最小的放到最后。重新再来一次,将第二小的数放到倒数第二的位置。类推排序。

  31. 二维数组

  32. 概念:有两个下标的数组。

  33. 格式:
    [存储类型] 数据类型 数组名[行下标][列下标]
    访问元素内容:数组名[行][列];下标取值从0开始。

  34. 遍历二维数组:嵌套循环

  35. 局部二维数组初始化问题

  36. 定义时未初始化,初始值为随机值,接下来赋值需要逐个进行赋值。

  37. 定义时部分初始化,为初始化为0.

  38. 定义时全部初始化,可以省略行下标。

  39. 数组的地址问题
    计算机中以字节为单位,每个字节都有自己的地址编号。若定义空间保存地址编号,32为操作系统的地址编号为32位,需要开辟4byte,64位操作系统的地址编号位64位,需要开辟8byte。
    数组内存空间连续,拿到第一个元素地址,可以通过地址加1的形式获取第二个元素地址。

  40. 一维数组
    一维数组的数组名是一维数组d额首地址,是第一个元素的地址,是一个地址常量,数组一旦定义,首地址就是确定的,不能更改。
    a) 地址+1:得到的是下一个元素的地址。
    b) 在地址前加*,表示取地址内容。
    c) 直接访问元素内容:st[i] *(st+i);
    d) 直接访问元素地址:&st[i] st+i.

  41. 二维数组
    二维数组的数组名表示二维数组的第一行的地址,是一个行地址,是地址常量。数组名加1,表示下一行的地址。
    a) 的第二种用法:在行地址前加,将行地址降为列地址。
    b) 可以将二维数组看成多个一维数组构成,每个一维数组的数组名为:st[0]、st[1]、st[2]……st[n-1]。
    c) 数组名[行下标]:表示每一行的第一个元素的地址。
    d) 直接访问元素内容:st[i][j]; ((st+i)+j); *(st[i]+j)
    e) 直接访问元素地址:&st[i][j]; *(st+i)+j; st[i]+j。

  42. 字符串的操作函数

  43. gets 从终端获取字符串
    a) 功能:从终端获取字符串,并且会自动补充‘\0’;
    b) 参数:获取到字符串存放的首地址。
    c) 返回值:成功返回获取到字符串存放的地址
    失败返回NULL。
    注意:终端输入多少,gets拿多少,没有半大检测数组的越界问题,少用。

  44. puts 输出字符串到终端
    a) 功能:将字符串输出到终端显示。
    b) 参数:输出字符串的首地址。
    c) 返回值:成功:输出字符的个数;失败:EOF(-1)。

  45. 清零函数:memset; bzero

  46. memset(s,c,n):
    a) 功能:清零。
    b) 参数:s:清空内容的首地址;c:0;n:清空的字节。
    c) 返回值:成功:清空内容的首地址s;失败:NULL。

  47. bzero(s,n)
    a) 功能:清零。
    b) 参数:s:清空内容的首地址;n:清空的字节。
    c) 返回值:无。

  48. 指针

  49. 一级指针
    a) 指针:就是地址。
    b) 定义格式:[存储类型] 数据类型 *指针变量名
    注意:什么类型的变量,需要定义对应类型的指针保存变量的地址,才可以通过指针间接访问变量。

  50. 的三种用法
    a) 地址前加
    :取地址内容。
    b) 行地址前加*:降级为列地址(元素地址)。
    c) 数据类型后加*:表示的定义一个对应类型的指针变量。

  51. 指针和数组结合使用

  52. 指针和一维数组:
    通过指针保存一维数组的首地址,让指针变量代替一维数组数组名间接访问一维数组。
    数组名是地址常量。指针变量是变量,程序运行过程中可以发生变化

  53. 间接访问一维数组
    地址:p+i; &p[i];
    内容:*(p+i); p[i].

  54. 指针的运算

  55. 算数运算
    a) + :p+n指针向地址大的方向移动n个数据
    b) –:p-n指针向地址小的方向移动n个数据
    c) ++ :p++指针向地址大的方向移动一个数
    d) – :p—指针向地址小的方向移动1个数据
    e) - :p-q两个指针之间相隔数据元素的个数

  56. 关系运算

< >= <= != ==
地址大的大于地址小的。

  1. 赋值运算:
    = += -=
    不同数据类型指针之间进行运算无意义。
  2. 二级指针
  3. 概念:保存的是仪及指针的地址。
  4. 格式:[存储类型] 数据类型 **指针变量名;
    注意:只要是指针,保存的就是地址编号,32位操作系统指针就开辟4byte。
  5. Const常量化
  6. const修饰变量
    const修饰变量,变量的值不能通过变量名修改,但是可以定义一个指针指向变量,通过指针访问地址内容进行修改值。
  7. const修饰指针
    a) const int *p
    指针指向可以修改,指针指向的呢人不可以通过指针修改。
    b) int * const p
    指针指向不可以修改,指针指向的内容可以通过指针修改。
    注意:由于指针的指向不可以修改,只能在定义的时候赋值一个指向。
    c) const int * const p
    指针指向不可以修改,指针指向的内容不可以通过指针修改。
  8. void空类型
    没有void类型的变量,可以用void修饰指针,修饰函数或者作为函数参数。
  9. void修饰指针
    void*类型的指针可以匹配任意类型的地址,但是使用时需要强转为对应地址类型。
  10. 强转
  11. 数据类型的强转
    格式:变量=(数据类型)值;
    一般都是隐式强转,运算时将低精度强转为高精度运算。
  12. 指针类型的强转
    格式:指针变量=(数据类型*)地址值。
  13. 大小端
    a) 大端存储:低地址存放高字节内容,高地址存放低字节内容。
    b) 小端存储:低地址存放低字节内容,高地址存放高字节内容。
  14. 函数
    函数三要素:功能、参数、返回值。
  15. 定义:将特定功能的代码模块封装成一个函数(接口)。
  16. 定义格式:
    [存储类型] 数据类型 函数名(形参)
    {
    函数体;
    Return 常量或者变量或表达式;
    }
    注意:
    a) 返回的常量或变量或表达式,数据类型必须和函数数据类型一致。如果没有返回,函数类型定义为void类型,函数中没有return语句。
    b) 定义的函数需要直接或间接被main函数调用才能实现功能。
    c) 若定义的函数不需要传递参数,函数原型形参写为void。如果没有写void,传递实际的实参值,不会报错,但是这个实参值会占用资源空间,后期如果使用到这个空间会出现错误,容易找不到错误的原因。
  17. 函数的调用:函数名(实参)
  18. 函数声明:[存储类型] 数据类型 函数名(形参);
    a) 函数的声明是在main函数上边,声明可以省略形参变量名。
    b) 若函数原型定义在main函数的上边,声明可以不写。
  19. 形参和实参的区别
    a) 形参:形参是在定义函数的时候定义的形参变量,是形式上存在的值,函数调用才会开辟内存空间。
    b) 实参:实参是在调用函数的时候传递的值,是实际存在的值,是有开辟存放的内存空间。
  20. 函数的传参
  21. 值传递
    将值复制一份传递给其他函数,更改复制的内容,原内容没有发生改变。
  22. 地址传递
    将变量的地址传递给其他函数,通过地址可以对元内容进行修改。
  23. 数组传递
    本质也是地址传递,传递的是数组的首地址。
  24. 命令行参数
    int main(int argc,const char *argv[])
  25. argc:命令行参数的个数
  26. argv:保存命令行参数内容,保存的是每一个参数的首地址。
  27. string函数族
  28. strlen(char *s)
    a) 功能:计算字符串的长度,不包括‘\0’;
    b) 参数:s:要计算的字符串的首地址;
    c) 返回值:字符串的长度
  29. strlrn和sizeof的区别
    a) strlen是函数,sizeof是关键字。
    b) strlen是计算字符串实际字符个数长度,不包括‘\0’;
    c) sizeof是计算所占的内存空间大小的,包括‘\0’;
  30. strcpy(char *dest,char *src)
    a) 功能:实现字符串的复制
    b) 参数:dest:复制的字符串的存放位置;src:要复制的字符串。
    c) 返回值:复制后字符串的首地址。
  31. strcat(char *dest,char *src)
    a) 功能:实现字符串的拼接,将dest后的‘\0’去掉后在拼接。
    b) 参数:dest:要拼接的字符串的存放位置;src:要拼接的字符串。
    c) 返回值:拼接后字符串的首地址。
  32. strcmp(char *s1,char *s2)
    a) 功能:比较两个字符串的大小,按字符比较,比较字符ASCII码。
    b) 参数:两个字符串的首地址。
    c) 返回值:s1>s2 返回正数;s1<s2 返回负数;s1=s2 返回0.

猜你喜欢

转载自blog.csdn.net/qq_47023150/article/details/123442917