C语言(学习笔记)

1. 文件结构

(1) 文件名:xxx.c

(2) 引用:#include

(3) 常量:#define SIZE 5

(4) 全局变量:int i = 1;

(5) 函数:void main() {... }

(6) 注释:// 单行注释,  /* 多行注释 */

(7) 局部变量:声明(int achar b[]="abc"double c,d,e;) 赋值(a=2;)

(8) 输入:scanf("%d", &a);

(9) 输出:printf("%d", a);

注释:extern int a; //引用其他文件的变量a,多个文件共用一个变量。

                    /* 1.1 文件名 main.c */ 
#include   /* 1.2 引用 */ 
#define SIZE 5      /* 1.3 常量 */ 
int i = 1;          /* 1.4 全局变量 */ 
void main() {       /* 1.5 主函数 */ 
  // 1.6 单行注释:标识符命名规范(1-9,a-z,A-Z,_),数字不能开头,区分大小写
  /* 1.6 多行注释:变量定义 vs中可以边定义边使用,vc必须函数开头先定义全部变量 */

  int a;             /* 1.7 局部变量(动态变量)声明,默认省略[auto] */ 
  char b[] = "abc";  /* 1.7 局部变量(动态变量)声明,默认省略[auto] */ 
  double c,d,e;      /* 1.7 局部变量(动态变量)声明,默认省略[auto] */ 
  a = 2;             /* 1.7 变量赋值 */ 
  static int sta=1;  /* 1.7 局部变量(静态变量)声明,只在加载时调用1次 */

  scanf("%d", &a);   /* 1.8 输入:scanf输入空格结束,gets(b)输入可以识别空格, */
  scanf("%s", b);    /* 1.8 输入:b等同于 &b[0] */

  printf("%d+%d=%d \n", 1, 1, 1+1); /* 1.9 输出:puts(b)自动换行 */

}

2. 数据类型

(1) 字符型:[signed] char (1字节有符号), unsigned char (无符号), char c = 'a';

(2) 短整型:[signed] short(2字节有符号), unsigned short(无符号), short s= 1;

(3) 整型:    [signed] int (2或4字节有符号), unsigned (无符号), int i= 1; 

(4) 长整型:[signed] long (4或8字节有符号), unsigned long(无符号), long l= 3L;

(5) 长长整型:long long (8字节)

(6) 单精度浮点:float (4字节) , float f = 1.2F;

(7) 双精度浮点:double(8字节) , double d = 1.2;

注释:int转double:double d = (double)i; // 可省略(double)1 => 1.000000

注释:double转int:int i = (int)d;  // 1.23 => 1 下切(舍弃小数部分)

3. 符号

3.1 运算符

(1) 算术运算符:+, -, *, /, %   // ()内计算优先级高

(2) 赋值运算符:=, +=, -=, *=, /=, %=

(3) 比较运算符:>, >=, <, <=, ==, !=

(4) 逻辑运算符:&&, ||, !

(5) 自增自减符:++, --

(6) 三元运算符:表达式 ? 真 : 假

注释:sizeof(变量) 取字节长度

3.2 转义字符

(1) 退格:\b

(2) 换行:\n (自动转换,\r\n 或 \n)

(3) 制表:\t

(4) 符号:\\   \?  \"  \'

(5) 空值:\0  (null)

(6) 百分号:%%

3.3 占位符

(1) 整数:%d (short, int)   %ld (long)    %lld (long long)

(2) 浮点:%f (float)   %lf (double)  // %.2f 保留2位小数

(3) 字符:%c (char)

(4) 字符串:%s (char [])

(5) 十六进制:%x

(6) 内存地址:%p

4. 流程控制

4.1 分支

(1) if分支: if (表达式) {...}if (..) {...} else {...}if (..) else if (..) {...} else {...}

(2) switch:switch(xx) { case 值: ...; breakdefault : ...; break; } 

注释:switch不写break会使case后的case继续执行 

4.2 循环

(1) for:for (i=0; i<5; i++) {...}

(2) while:while (表达式) {...}

(3) do while:do {...} while (表达式);

注释:do while有分号。break终止循环,continue跳过循环。

注释:loop: if(..) {...; goto loop; } 可以使程序跳转,一般禁止使用goto

4.3 数组

(1) 整型数组:int arr[3];  arr[0]=1;  int arr[] = {1,2,3};

(2) 字符数组:char c[]="abc";  char c[4]={'a','b','c','\0'}; // \0代表null字符串终止

注释:二维数组 arr[2][3],三维数组 arr[x][y][x]

5. 函数

5.1 函数

(1) 有参有返回值:int sum(int x, int y) { return x + y; }  // 函数调用  int z = sum(x1,y1);

(2) 无参无返回值:void printC() {... }  //调用  printC();

注释:函数声明  int sum(int x, int y);  主函数 main(){...}   函数实现  int sum(int x, int y) {...}

5.2 字符函数

注释:使用字符函数,需引入  #include

(1) 复制:strcpy( s, "abc");  // char s[10]; 

(2) 拼接:strcat(s, "def");  // 在s后追加

(3) 取长:strlen(s);

(4) 比较:strcmp(s1, s2);  // 相等返回0,可用于判断 if (strcmp(s1,s2) == 0)

(5) 字符转数字: int a = atoi(s);  double d = atof(s);

(6) 数字转字符:sprintf(s, "xxx%d", i) // i换%d,赋值给s

6. 构造体

6.1 构造体

(1) 单个构造

定义:struct student { int id; char name[256]; }

使用:main() {  struct student data;  data.id=1; }

(2) 数组构造

定义:struct student { int id; char name[256]; }

重命名:typedef struct student re_data;

使用:main() {  re_data data[] = { {1,"aa"}, {2,"bb"} }; }

(3) 直接重命名

定义:typedef struct { int id; char name[256]; } re_data;

使用:main() { re_data n1={1,"aa"}, n2={2,"bb"}; }

6.2 枚举

(1) 默认值:enum XX{ X1, X2 }  //默认值,0, 1

(2) 初始值:enum XX{ X1=1, X2=2 } 

7. 多文件

注释:.h头文件,.c 源文件

7.1 .h头文件

(1) 判断声明是否存在 (ifdef),存在则加载内容

#ifdef {key}
  ...
[#else]
  ...
#endif

(2) 判断声明是否不存在(ifndef),不存在则加载内容

#ifndef {key}
  ...
[#else]
  ...
#endif

(3) 判断表达式(if) 

#if {表达式}
  ...
[#else]
  ...
#endif

 (4) 代码例

#ifndef _文件名_H_
#define _文件名_H_  //不存在则声明变量,防止多次引用重复声明
  ...
  int sum(int x, inty); 
[#else]
  ...
#endif

7.2 .c源文件

(1) 代码例

#include "xx.h"  /* 引入.h头文件 */

int sum(int x, int y) {
  return x+y;
}

(2) 主程序

#include  /* <>引入系统程序 */
#include "xx.h"    /* ""引入自定义程序,找不到再找系统 */

void main() {
  ...
}

8. 指针

8.1 内存地址

(1) 值传递:setData1(n1);  //内部dn1属性值变更,不影响函数外的n1的值。

(2) 地址传递:setData2(&n2); //内部dn2属性值变更,外部变量n2的值也变更。

typedef struct {
  int id,
  char name[256]
} data

void main() {
  data n1={1,"aa"}, n2={2,"bb"};

  setData1(n1);
  setData2(&n2);
}

void setData1(data dn1) {
  dn1.id=3;
}

void setData2(data *dn2) {
  dn2.id=4;
}

8.2 指针

注释:int a =1;

(1) 定义:int *pint *p=null; 

(2) 赋地址:p=&aint *p=&a;

(3) 赋值: *p=300

注释:p为地址,*p为值

8.3 数组指针

(1) 数组:int a[3]={1,2,3}

注释:值 a[0],a[1],a[2],  地址 &a[0],&a[1],&a[2]

(2) 指针指向数组开头:int *p = &a[0];  //等同与 int *p = a;

注释:值 *p=a[0],*(p+1)=a[1], *(p+2)=a[2]   地址 p=&a[0], p+1=&a[1], p+2=&a[2]

(3) 指针指向数组中间:int *p = &a[1]; 

注释:值 *(p-1)=a[0],*p=a[1], *(p+1)=a[2]   地址 p-1=&a[0], p=&a[1], p+1=&a[2]

(4) 循环

for(i=0;i<3;i++){
  *(a+1) /* 或者 p[1] */
}
for(i=0;i<3;i++){
  *p
  p++  /* 指针使用后,需手动更改指针 */
}

9. 读写文件

9.1 文件函数

(1) 打开文件:FILE *file = fopen("c:\\xx.txt", "w");

(2) 关闭文件:fclose(file);

(3) 读写函数:

fgetc(file);  fputc(file); // 读写1个字符

fgets(s,n,file);  fputs(s, file); // 读n个字符到s, 写s到文件

注释:二进制读写 fread, fwrite。fscanf(file,"xx%d", &s);  fprintf(file, "xx%d\r\n", 1);

9.2 读写区分(fopen参数)

(1) 只读:r  // 文件不存在,异常

(2) 只写:w // 文件不存在,新建。覆盖原有文件内容

(3) 只写:a // 文件不存在,新建。原有文件末尾添加内容

注释:r+(读写),w+(读写), a+(读写)

9.3 例

#include 
#include 

void main() {
  FILE *file = fopen("c:\\xx.txt", "w");
  if ( file == null ) {
    exit(1);
  }
  
  fprintf(file, "xxx \r\n");  /* \r\n输出后换行 */
  fclose(file);
}

你可能感兴趣的:(学习,笔记)