1. 文件结构
(1) 文件名:xxx.c
(2) 引用:#include <stdio.h>
(3) 常量:#define SIZE 5
(4) 全局变量:int i = 1;
(5) 函数:void main() {... }
(6) 注释:// 单行注释, /* 多行注释 */
(7) 局部变量:声明(int a; char 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 <stdio.h> /* 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 值: ...; break; default : ...; 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 <string.h>
(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 <stdio.h> /* <>引入系统程序 */
#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 *p; int *p=null;
(2) 赋地址:p=&a; int *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 // 文件不存在,新建。原有文件末尾添加内容文章来源:https://www.toymoban.com/news/detail-827669.html
注释:r+(读写),w+(读写), a+(读写)文章来源地址https://www.toymoban.com/news/detail-827669.html
9.3 例
#include <stdio.h>
#include <stdlib.h>
void main() {
FILE *file = fopen("c:\\xx.txt", "w");
if ( file == null ) {
exit(1);
}
fprintf(file, "xxx \r\n"); /* \r\n输出后换行 */
fclose(file);
}
到了这里,关于C语言(学习笔记)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!