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(字符数组)
    • 测量长度
    • 不包含'\0'
  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(字符数组)
    • 测量长度
    • 不包含'\0'
  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
    6.  

posted @ 2019-01-14 10:09  STK0210  阅读(345)  评论(0编辑  收藏  举报