• C语言基础知识笔记


    C语言笔记
      1. 因为默认main为int所以可以直接:
        • main(){
      2. 函数定义不可嵌套
      3. 运算符%%只能用于整数操作
      4. %%要双标记才能打印
      5. 判等与赋值一定要区分
      6. 不可以在同一个地方,访问和修改同一个数的数值
      7. 负数操作运算符“/”、“%”时,C89和C99都要确保一个神奇的公式:(a/b)*b+a%d=a
      8. 变量是左值
      9. if(表达式){语句;}
      10. if(表达式){语句;}else语句
      11. if的用法:
        • if(表达式){语句;}
        • else if(表达式){语句;}
        • else if(表达式){语句;}
        • else{语句;}
      12. 条件表达式:
        • 表达式1?表达式2:表达式3
        • 表达式1成立计算表达式2的值
        • 表达式1不成立计算表达式3的值
      13. switch结构:
        • switch(表达式){
        • case 表达式1: case 2: case 3:
          • 语句;break;
        • case 表达式4:
          • 语句;break;
        • default:语句;break;
      14. else语句属于离他最近的且还未与其他else配对的if语句
      15. 循环中
        1. while用于循环体执行之前检验
        2. do用于循环执行之后检
        3. for用于递增或递减计数变量的循环
        4. continue语句仅在循环可用
      16. while循环:
        1. while(表达式)表达式不为0即执行
        2. {语句;}
        3. 如果一来就为0,会一次都不执行直接跳出循环
      17. while(1)是一种常用的无限循环语句
      18. do循环:
        1. do{语句;}while(表达式);
        2. 先执行循环,再判定
        3. 至少执行一次循环
      19. for循环:
        1. for(表达式1;2;3)
        2. 表达式1用来赋初值(循环执行前)
        3. 表达式2用来控制循环终止
        4. 表达式3(循环执行后执行)
        5. 可以等价于
          • 表达式1;
          • while(表达式2){
          • 语句
          • 表达式3;
        6. 必须有两个分号,表达式1都可以挑出来表达之后省略(;2;3)
      20. 形式参数定义时!每个形参前必须都有其类型说明
      21. 函数定义:
        1. 返回类型 函数名(形式参数)
        2. 声明;
        3. 语句;
        4. (花括号内的称为函数体)
      22. 函数调用:
        1. 函数名(实际参数);
      23. 函数声明:
        1. 返回类型 函数名(形式参数);
        2. 注意!这里有分号!
        3. 原因是形式参数里面没有具体的变量名称,只需要类型
        4. 目的是让程序进行预备
        5. 如果函数在调用前遇到了原型,编译器会创建一个隐式声明(也说明函数声明的重要性!)
        6. 如果函数在调用前没有遇到原型,编译器会执行默认的实际参数提升
      24. 无实参的函数要调用也必须有()
      25. 非void函数必须用return语句来指定返回值
      26. void类型函数没有返回值
      27. 若省略返回类型,C89会自动变为int,C99中不合法
      28.  把数组名传递给函数时,数组名后不加方括号!
      29.  利用数组型实际参数可以控制数组的有效性,把无效部分在后期删去!!!
      30.  声明多维数组的形式参数时,声明可以省略第一维的长度(例如二维数组,可以不说行数,但是必须制定列数)
      31.  变长数组声明时必须先长度参数,再数组,要让代表数组长度的参数先被程序看见
      32.  也可以用*替换数组内的长度参数,*直接代表数组长度与形参列表中的前面的参数有关
      33. static可以在数组参数声明中使用C99
      34. int a【static 3】代表数组长度至少为3
      35. 多维数组的话static仅可用于第一维
      36. 静态局部变量static可以在局部变量的值调用结束后,而不释放,保存原值。
        • static int a;
      37. 寄存器变量(register变量)代表允许将局部变量的值放在cpu中提高执行效率
        • register int a;
      38. 扩展外部变量的作用域(extern)
        1. extern 外部变量名字;
        2. 代表作用域效果从上一行开始
        3. 再正式定义外部变量
        4. 然后以下的范围都可使用
        5. 日后测试完善(少用为好)
        6. 加了static变为静态外部变量后,不可用extern扩大其范围
      39. 复合字面量是通过指定其包含的元素而创建的没有名字的数组(int 【】){…}
      40. 可以使用const把数组变为只读
        1. (const int【】){1,1}
      41. return语句:
        1. return 表达式;
      42. 在main函数中也可以用exit来等价替换,形式如下:
        1. 首先必须是在main函数中!
        2. #include<stdlib.h>
        3. exit(表达式);
        4. return 0;可以变为exit(0);
        5. 也可以用exit(EXIT_SUCCESS);
        6. exit(EXIT_FAILURE);
      43. continue语句
        1. 把循环转移到循环体末尾之前
        2. 但是没有跳出循环!
      44. continue与goto等效替换
        • while (…) {           while (…) {
        •   …                      …
        •   continue;           goto end;
        •   …                      …
        • }                           end: ; 
        •                              }
      45. break语句
      46. 可以跳出循环
      47. 一个break只能跳出最近的一层
      48. goto语句
      49. 使用模版:
        • 标识符:语句
        • goto 标识符;
      50. 可以任意跳跃!直接跳出多重循环!
      51. 所以优点也是缺点,很容易创造垃圾代码
      52. 空语句最好单独放置在一行,或者用continue;语句或者还可以用{}凸显一下
      53. 空循环一般仅只是用于增加简洁度,而不会提高效率
      54. 素数判断可以只检查不大于n(你输入的检验数)的平方根 的除数
      55. 十进制不可以0开头
      56. 八进制通常以0开头
      57. 十六进制通常以0x或0X开头
      58. 有符号整数类型
        1. short int:%hd
        2. int:%d
        3. long int:%ld(C99可以%lld)
      59. 浮点类型
        1. float:%f,常量末尾加f
        2. double:%lf,末尾加F
        3. long double:%lf,末尾加L
        4. 注意!只能在scanf中使用l,不能在printf函数格式串中使用
        5. long double中scanf和printf都放%Lf
      60. 字符操作
        1. 显示格式:
          • char sb;
          • sb='a'
          • sb='  '
      61. 字符常量使用时,转义序列必须用一对单引号括起来:'33'
      62. getchar返回的是int型的值,尽管它读入和返回的是字符
      63. %s不能有空格
      64. 使用getchar时必须打括号!!!!!曹尼玛!
      65. 类型转换有隐式转换和显式转换
      66. 常用的算术转换的策略是整值提升
      67.  强制转换表达式:
        • (类型名)表达式
      68.  类型定义:
        • typedef 类型 名字;
        • 名字 变量,变量,变量;
        • 更容易理解,更有实际意义,容易修改,直接改定义处的类型
        • 类型定义比宏定义强大,宏定义还不能定义数组和指针。
      69.   sizeof表达式:
        • sizeof(类型名)
        • 这个运算符允许程序储存指定类型值所需的空间的大小
      70.  C语言有两种聚合类型:数组和结构
      71.  数组:
        • 类型 名字【大小】{个体表示,个体表示};
      72.  数组可以通过在类型名前面加const变成常量数组
      73. 声明为常量数组的数组不会被程序修改,编译器也能发现那些有修改他意图的代码
      74.  C99可以使用变长数组,即使用非常量表达式
      75. 变长数组的限制在于无初始化值和静态存储期限
      76.  在局部变量声明中放置static可以使变量具有静态存储期限,即拥有永久的存储单元,即使函数返回,也不会失去他的值。
      77. #define N n等效于sizeof(a)/sizeof(a【0】)
      78. 这是为了解决可能忘记名字的问题
      79. 也可以二者直接组合定义
      80.    #include<string.h>
      81.  gets(数组) and puts(数组)
      82.  strcat(字符数组1,字符数组2)
      • 效果:把字符串2接到1的后面
      • 字符串1一定要够大!
    1.  83.rcpy(字符数组1,字符串2)
      1. 效果:把字符串2复制到字符数组1中
      2. 字符串2也可以是字符数组
      3. 够大!
    2. strcmp(字符串1,字符串2)
      1. 从左往右比较不同元素,随ASCII码大的为正
      1. 若两个字符串相等,为0
      1. 小于为负
    3. strlen(字符数组)
      • 测量长度
      • 不包含''
    4. strlwr(字符串)
      • 效果:将字符串转化为小写
    5. strupr(字符串)
      • 效果:将字符串转化为大写
    6. 指针就是地址,指针变量就是储存地址的变量
    7. 指针变量的声明:
      • 1.int i;
      • 类型  *p,*q;
      • p=&i;
      • q=&j;
    8.   &:取地址符(&x就是x在内存中的地址)*:间接寻址符(*p就是i的别名,改变*p的值也会改变i的值)
    9. 对变量使用&会产生指针
    10. 对指针使用*会返回变量
    11.  q=p是把p的内容(i的地址)给了q,即把q指向了p所指向的地方
    12. *q=*p是把p指向的值(i的值)复制给q指向的对象(j的值)
    13. const保护参数:说明p是指向“长整数”的指针。表明函数不会改变指针参数指向的对象。
    14. 数组指针的元素可以
      • *(p+i)表示数组p的第i个元素
    15. p+i实质为p+i*(元素所占字节)还是位置
    16. 多维数组中a【1】+1等价于*a(a+1)+1,都表示了a【1】【1】
    17. 指向函数的指针:
      • int(*p)(int)
      • p=f(函数入口)
      • 这是一个指向整形函数,并且这个整形函数还有一个整形参数的函数
      • 调用形式为:
      • a=(*p)(n)
      • (*p)(n)等效于f(n)
    C语言笔记
      1. 因为默认main为int所以可以直接:
        • main(){
      2. 函数定义不可嵌套
      3. 运算符%%只能用于整数操作
      4. %%要双标记才能打印
      5. 判等与赋值一定要区分
      6. 不可以在同一个地方,访问和修改同一个数的数值
      7. 负数操作运算符“/”、“%”时,C89和C99都要确保一个神奇的公式:(a/b)*b+a%d=a
      8. 变量是左值
      9. if(表达式){语句;}
      10. if(表达式){语句;}else语句
      11. if的用法:
        • if(表达式){语句;}
        • else if(表达式){语句;}
        • else if(表达式){语句;}
        • else{语句;}
      12. 条件表达式:
        • 表达式1?表达式2:表达式3
        • 表达式1成立计算表达式2的值
        • 表达式1不成立计算表达式3的值
      13. switch结构:
        • switch(表达式){
        • case 表达式1: case 2: case 3:
          • 语句;break;
        • case 表达式4:
          • 语句;break;
        • default:语句;break;
      14. else语句属于离他最近的且还未与其他else配对的if语句
      15. 循环中
        1. while用于循环体执行之前检验
        2. do用于循环执行之后检
        3. for用于递增或递减计数变量的循环
        4. continue语句仅在循环可用
      16. while循环:
        1. while(表达式)表达式不为0即执行
        2. {语句;}
        3. 如果一来就为0,会一次都不执行直接跳出循环
      17. while(1)是一种常用的无限循环语句
      18. do循环:
        1. do{语句;}while(表达式);
        2. 先执行循环,再判定
        3. 至少执行一次循环
      19. for循环:
        1. for(表达式1;2;3)
        2. 表达式1用来赋初值(循环执行前)
        3. 表达式2用来控制循环终止
        4. 表达式3(循环执行后执行)
        5. 可以等价于
          • 表达式1;
          • while(表达式2){
          • 语句
          • 表达式3;
        6. 必须有两个分号,表达式1都可以挑出来表达之后省略(;2;3)
      20. 形式参数定义时!每个形参前必须都有其类型说明
      21. 函数定义:
        1. 返回类型 函数名(形式参数)
        2. 声明;
        3. 语句;
        4. (花括号内的称为函数体)
      22. 函数调用:
        1. 函数名(实际参数);
      23. 函数声明:
        1. 返回类型 函数名(形式参数);
        2. 注意!这里有分号!
        3. 原因是形式参数里面没有具体的变量名称,只需要类型
        4. 目的是让程序进行预备
        5. 如果函数在调用前遇到了原型,编译器会创建一个隐式声明(也说明函数声明的重要性!)
        6. 如果函数在调用前没有遇到原型,编译器会执行默认的实际参数提升
      24. 无实参的函数要调用也必须有()
      25. 非void函数必须用return语句来指定返回值
      26. void类型函数没有返回值
      27. 若省略返回类型,C89会自动变为int,C99中不合法
      28.  把数组名传递给函数时,数组名后不加方括号!
      29.  利用数组型实际参数可以控制数组的有效性,把无效部分在后期删去!!!
      30.  声明多维数组的形式参数时,声明可以省略第一维的长度(例如二维数组,可以不说行数,但是必须制定列数)
      31.  变长数组声明时必须先长度参数,再数组,要让代表数组长度的参数先被程序看见
      32.  也可以用*替换数组内的长度参数,*直接代表数组长度与形参列表中的前面的参数有关
      33. static可以在数组参数声明中使用C99
      34. int a【static 3】代表数组长度至少为3
      35. 多维数组的话static仅可用于第一维
      36. 静态局部变量static可以在局部变量的值调用结束后,而不释放,保存原值。
        • static int a;
      37. 寄存器变量(register变量)代表允许将局部变量的值放在cpu中提高执行效率
        • register int a;
      38. 扩展外部变量的作用域(extern)
        1. extern 外部变量名字;
        2. 代表作用域效果从上一行开始
        3. 再正式定义外部变量
        4. 然后以下的范围都可使用
        5. 日后测试完善(少用为好)
        6. 加了static变为静态外部变量后,不可用extern扩大其范围
      39. 复合字面量是通过指定其包含的元素而创建的没有名字的数组(int 【】){…}
      40. 可以使用const把数组变为只读
        1. (const int【】){1,1}
      41. return语句:
        1. return 表达式;
      42. 在main函数中也可以用exit来等价替换,形式如下:
        1. 首先必须是在main函数中!
        2. #include<stdlib.h>
        3. exit(表达式);
        4. return 0;可以变为exit(0);
        5. 也可以用exit(EXIT_SUCCESS);
        6. exit(EXIT_FAILURE);
      43. continue语句
        1. 把循环转移到循环体末尾之前
        2. 但是没有跳出循环!
      44. continue与goto等效替换
        • while (…) {           while (…) {
        •   …                      …
        •   continue;           goto end;
        •   …                      …
        • }                           end: ; 
        •                              }
      45. break语句
      46. 可以跳出循环
      47. 一个break只能跳出最近的一层
      48. goto语句
      49. 使用模版:
        • 标识符:语句
        • goto 标识符;
      50. 可以任意跳跃!直接跳出多重循环!
      51. 所以优点也是缺点,很容易创造垃圾代码
      52. 空语句最好单独放置在一行,或者用continue;语句或者还可以用{}凸显一下
      53. 空循环一般仅只是用于增加简洁度,而不会提高效率
      54. 素数判断可以只检查不大于n(你输入的检验数)的平方根 的除数
      55. 十进制不可以0开头
      56. 八进制通常以0开头
      57. 十六进制通常以0x或0X开头
      58. 有符号整数类型
        1. short int:%hd
        2. int:%d
        3. long int:%ld(C99可以%lld)
      59. 浮点类型
        1. float:%f,常量末尾加f
        2. double:%lf,末尾加F
        3. long double:%lf,末尾加L
        4. 注意!只能在scanf中使用l,不能在printf函数格式串中使用
        5. long double中scanf和printf都放%Lf
      60. 字符操作
        1. 显示格式:
          • char sb;
          • sb='a'
          • sb='  '
      61. 字符常量使用时,转义序列必须用一对单引号括起来:'33'
      62. getchar返回的是int型的值,尽管它读入和返回的是字符
      63. %s不能有空格
      64. 使用getchar时必须打括号!!!!!曹尼玛!
      65. 类型转换有隐式转换和显式转换
      66. 常用的算术转换的策略是整值提升
      67.  强制转换表达式:
        • (类型名)表达式
      68.  类型定义:
        • typedef 类型 名字;
        • 名字 变量,变量,变量;
        • 更容易理解,更有实际意义,容易修改,直接改定义处的类型
        • 类型定义比宏定义强大,宏定义还不能定义数组和指针。
      69.   sizeof表达式:
        • sizeof(类型名)
        • 这个运算符允许程序储存指定类型值所需的空间的大小
      70.  C语言有两种聚合类型:数组和结构
      71.  数组:
        • 类型 名字【大小】{个体表示,个体表示};
      72.  数组可以通过在类型名前面加const变成常量数组
      73. 声明为常量数组的数组不会被程序修改,编译器也能发现那些有修改他意图的代码
      74.  C99可以使用变长数组,即使用非常量表达式
      75. 变长数组的限制在于无初始化值和静态存储期限
      76.  在局部变量声明中放置static可以使变量具有静态存储期限,即拥有永久的存储单元,即使函数返回,也不会失去他的值。
        1. #define N n等效于sizeof(a)/sizeof(a【0】)
    • 这是为了解决可能忘记名字的问题
    • 也可以二者直接组合定义
    1.  #include<string.h>
    2.  gets(数组) and puts(数组)
    3.  strcat(字符数组1,字符数组2)
      • 效果:把字符串2接到1的后面
      • 字符串1一定要够大!
    4.  strcpy(字符数组1,字符串2)
      • 效果:把字符串2复制到字符数组1中
      • 字符串2也可以是字符数组
      • 够大!
    5. strcmp(字符串1,字符串2)
      • 从左往右比较不同元素,随ASCII码大的为正
      • 若两个字符串相等,为0
      • 小于为负
    6. strlen(字符数组)
      • 测量长度
      • 不包含''
    7. strlwr(字符串)
      • 效果:将字符串转化为小写
    8. strupr(字符串)
      • 效果:将字符串转化为大写
    9. 指针就是地址,指针变量就是储存地址的变量
    10. 指针变量的声明:
      • 1.int i;
      • 类型  *p,*q;
      • p=&i;
      • q=&j;
    11.   &:取地址符(&x就是x在内存中的地址)*:间接寻址符(*p就是i的别名,改变*p的值也会改变i的值)
    12. 对变量使用&会产生指针
    13. 对指针使用*会返回变量
    14.  q=p是把p的内容(i的地址)给了q,即把q指向了p所指向的地方
    15. *q=*p是把p指向的值(i的值)复制给q指向的对象(j的值)
    16. const保护参数:说明p是指向“长整数”的指针。表明函数不会改变指针参数指向的对象。
    17. 数组指针的元素可以
      • *(p+i)表示数组p的第i个元素
    18. p+i实质为p+i*(元素所占字节)还是位置
    19. 多维数组中a【1】+1等价于*a(a+1)+1,都表示了a【1】【1】
    20. 指向函数的指针:
      • int(*p)(int)
      • p=f(函数入口)
      • 这是一个指向整形函数,并且这个整形函数还有一个整形参数的函数
      • 调用形式为:
      • a=(*p)(n)
      • (*p)(n)等效于f(n)
     
    一种单项链表编法
    1. 辗转相除法
      1. 用(a,b)表示最大公约数
      2. 若a%b=c,则(a,b)=(b,c)
    2. 一些常用的函数
      1. 除法:sqrt
      2. pow(x,y)      x的y次方
      3. 字符串拼接:strcat(数组1,数组2)
      4. 字符串比较:strcmp
      5. 字符串复制:strcpy
  • 相关阅读:
    Leetcode:42. Trapping Rain Water
    Leetcode: 41. First Missing Positive
    Leetcode: 40. Combination Sum II
    多项式全家桶
    BZOJ 3878 [AHOI&JSOI2014]奇怪的计算器 (线段树)
    BZOJ 2959 长跑 (LCT+并查集)
    BZOJ 3028 食物 (生成函数+数学题)
    luogu P5504 [JSOI2011]柠檬
    hdu 6399 City Development
    luogu P3826 [NOI2017]蔬菜
  • 原文地址:https://www.cnblogs.com/STK0210/p/10265422.html
Copyright © 2020-2023  润新知