C笔记

1
2
3
4
5
6
7
8
9
10
11
12
13
//malloc C里没有new
char* t=(char*)malloc(n*sizeof(char));
free(t);
//二维数组传参用指针,必须要写列数
void print(int p[][4],int row){
int i,j;
for(i=0;i<row;i++){
for(j=0;j<sizeof(*p)/sizeof(int);j++){
printf("%d",p[i][j]);
}
printf("\n");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//二级指针实现数据排序,不改变源数据
#include<stdio.h>
#include<stdlib.h>
#inclued<string.h>

void print(char **p){ //char *p[]
for(int i=0;i<5;i++){
puts(p[i]);
}
}

int main(){
char *p[5];
char b[5][10]={"l","w","hh","mm","tt"};
int i,j,tmp;
char *t;
char **p2;
for(i=0;i<5;i++){
p[i]=b[i];
}
for(i=4;i>0;i--){
for(j=0;j<i;j++){
if(strcmp(p2[j],p2[j+1])==1){
t=p2[j];
p2[j]=p2[j+1];
p2[j+1]=t;
}
}
}
print(p2);
for(i=0;i<5;i++){
puts(b[i]);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//函数指针
#include<stdio.h>
#include<stdlib.h>

void b(){
printf("fun b\n");
}

void a(void (*p)()){
p();
}

int main(){
void (*p)();//函数指针
p=b;
a(p);//相当于执行p函数
return 0;
}
1
2
extern int k;//借用main.c文件的全局变量k
static int i;//只能在本文件中使用,static也可以修饰函数
1
2
3
4
5
6
7
8
9
//递归 Hanoi
void hanoi(int n,int a,int b,int c){
if(n==1) printf("%c->%c\n",a,c);
else{
hanoi(n-1,a,c,b); //把n-1个盘子从a通过c移动到b
printf("%c->%c\n",a,c);//把a的最后一个盘子移动c
hanoi(n-1,b,a,c);//把n-1个盘子从b通过a移动到c
}
}
1
2
//c语言中结构体定义必须使用struct 结构体名,c++中可以直接使用结构体名
struct student xx;//typedef 提前定义别名是常见操作
1
2
3
4
5
6
7
8
9
10
11
12
//共用体 个人理解为了节约存储空间
union data{
int i;
char ch;
float f;
} a,b,c;
//枚举类型
//编译时被当做常量
enum weekday{a=0,b,c,d,e,f};
enum weekday num;
num=a;
printf("%d",num);//num=0;枚举类型没有定义从0开始
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//文件
struct _iobuf {
char *_ptr;//下一个要被读取的字符地址
int _cnt; // 剩余的字符,如果是输入缓冲区,那么就表示缓冲区中还有多少个字符未被读取
char *_base; // 缓冲区基地址
int _flag; // 读写状态标志位
int _file; // 文件描述符
int _charbuf;
int _bufsiz;//缓冲区大小
char *_tmpfname;
};
typedef struct _iobuf FILE;
FILE *p=fopen("路径""打开方式");
int fclose(File *stream);
int fputc(int ch,FILE *stream);
int fgetc(FILE *stream);
int fread(void *buffer,size_t size,FILE *stream);
int fwrite(const void *buffer,size_t size,size_t count,FILE *stream);
int fseek(FILE *stream,long offset,int origin); //改变文件的位置指针
//文件开头 SEEK_SET 0
//文件当前位置 SEEK_CUR 1
//文件末尾 SEEK_END 2
//成功返回0,失败返回非0
char *fgets(char *str,int num,FILE *stream);
//成功返回字符串,失败返回NULL
int fputs(const char* str,FILE *stream);
//成功返回非负值,失败返回EOF
int fprintf(FILE *stream,const char *format,...);
//成功返回输出字符数,失败返回负值
int fscanf(FILE *stream,const char *format,...);
//返回值为事实已赋值的变量数,如果未进行分配返回EOF
//fprintf,fscanf输入是要将ASCII码转化为二进制,输出时反之,增加消耗时间,频繁操作使用fread和fwrite
Mode 意义
"r" 只读方式打开
“w” 写入方式打开
“a” 附加到一个文本文件
“rb” 只读方式打开二进制文件
“wb” 写入方式打开二进制文件
“ab” 附加到一个二进制文件
“r+” 打开一个用于读/写的文本文件
"w+" 创建一个用于读/写的文本文件
“a+” 打开一个用于读/写的文本文件
“rb+” 打开一个用于读/写的二进制文件
“wb+” 创建一个用于读/写的二进制文件
“ab+” 打开一个用于读/写的二进制文件