8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
二维数组的定义
类型 数组名[常量表达式1][常量表达式2];
例如:float a[2][3];
二维数组的引用
数组名[行下标][列下标];
二维数组的初始化
1、分行初始化1
2
3
4
5int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
2、按顺序初始化1int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
3、部分元素初始化1
2
3
4
5int a[3][4] = {
{ ,1},
{0,6},
{0,0,11}
};
1
2
30 1 0 0
0 6 0 0
0 0 11 0
4、如果对全部元素赋值,定义数组可以不指定一维长度1int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
二维数组的输入与输出
二维数组的输入与输出是通过对每个元素的输入输出实现的。
1、输入方法1
2
3for(int i = 0; i < 2; i++)
for(int j = 0; j < 3; j++)
scanf("%d",&a[i][j]);
2、输出方法1
2
3for(int i = 0; i < 2; i++)
for(int j = 0; j < 3; j++)
printf("%d",a[i][j]);
指向二维数组的指针
二维数组可以堪称时由多个一维数组的组合。
比如:对于int a[3][4];
(1)a是数组名,包含三个元素,a[0],a[1],a[2]。
(2)每个元素a[i]又是一个一维数组,包含4个元素。
二维数组的行指针与列指针例子类型意义a行指针类型二维数组的首地址,第0行的地址
a+i行指针类型第i行的地址
*(a+i)列指针类型第i行第0列的地址
*(a+i)+j列指针类型第i行第j列的地址
((a+i)+j)元素第i行第j列的元素
指针与二维数组
1、列指针1
2
3
4
5
6
7
8int *p;
int a[3][4];
p = a[0]; //用列地址初始化
int i,j;
for(i = 0; i < iMAX; i++)
for(j = 0; j < jMAX; j++)
printf("%d",*(p+i*n+j)); //或p[i*n+j]
2、行指针1
2
3
4
5
6
7int (*p)[3]; //行指针,指向数组的一行
p = a; //用行指针初始化
int i,j;
for(i = 0; i < iMAX; i++)
for(j = 0; j < jMAX; j++)
printf("%d",*(*(p+i)+j)); //可以写成p[i][j]
特殊的指针:数组类型指针
例如:int (*iPtr)[3];
类型名:”int”说明其指向的数组变量类型是整型。
数组类型指针变量名:”iPtr”说明要定义的变量名字。
整型常量表达式:”3”说明指向的数组变量元素个数为3。
指针数组
元素均为指针类型数据的数组,称为指针数组
定义形式:类型关键字 *数组名[数组长度];
例如:char *pStr[5];1
2
3
4
5
6
7
8//二维字符数组
void main(){
int i;
char str[][10] = {"Pascal","Basic","Fortran","Java","VisualC"};
for(i = 0; i < 5; i++)
printf("%sn",str[i]);
}1
2
3
4
5
6
7
8//字符指针数组
void main(){
int i;
char *ptr[] = {"Pascal","Basic","Fortran","Java","VisualC"};
for(i = 0; i < 5; i++)
printf("%sn",ptr[i]);
}
命令行参数
int main(int argc, char* argv[])
动态分配内存1
2
3
4
5
6
7
8
9
10
11
12
13
14#include
void* malloc(unsigned int size);
//向系统申请大小为size的内存块,返回首地址。申请不成功返回NULL。
void* calloc(unsigned int num, unsigned int size);
//向系统申请num个size大小的内存块,返回首地址。申请不成功返回NULL。
void free(void* p);
//释放由malloc和calloc申请的内存块。p是指针。
//例如:if(p == NULL){free(p); p = NULL}
void* realloc(void* pointer, unsigned int size);
//如果重新分配成功,返回指向被分配内存的指针,否则返回空指针NULL。
结构体
结构体的定义
一般形式:1
2
3
4
5struct 结构体名{
类型关键字 成员名1;
类型关键字 成员名2;
类型关键字 成员名3;
};
例如:1
2
3
4
5struct student{
int ID;
char name[20];
int age;
};
结构体只是定义了数据的形式,未生成任何变量,可以如下定义:struct student stu;。
定义类型名1
2
3
4
5typedef struct student{
int ID;
char name[20];
int age;
}STUD;
或直接typedef struct student STUD;。
定义的类型名就与普通数据形式一样的使用方法。
链表
类型:1
2
3
4
5struct student{
int ID;
struct student* next;
};
typedef struct student Node;
尾插法创建链表
基本思路:
1、申请一个节点的空间,置指针域为空。
2、输入结点数据域的数据。
3、搜索链表的最后一个结点。
4、将新结点插入到链表尾。
5、返回头指针。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Node* Add_end(Node* head){
Node *p;
Node *tail;
p = (Node*)malloc(sizeof(Node));
if(NULL == p){
printf("Wrong!");
exit(1);
}
p->next = NULL;
scanf("%d",&(p->ID) ); //一个结点创建完毕。
if(NULL == head){
head = p;
}
else{
tail = head;
while(tail->next != NULL){
tail = tail->next;
} //找到尾节点
tail->next = p; //插入
}
return head; //返回
}
头插法创建链表
基本思路:
1、建立空链表,但不需要定义尾指针。
2、生成新结点,对新结点赋值,指针域可不必赋值。
3、将结点插入到链表中。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Node* Add_head(Node* head){
Node* p;
p = (Node*)malloc(sizeof(Node));
if(NULL == p){
printf("Wrong!");
exit(1);
}
p->next = NULL;
scanf("%d",&(p->ID)); //单个结点创建完成
p->next = head;
head = p; //插入完成
return head;
}
文件操作
打开文件fopen
常用的打开文件方法:1
2
3
4if( (fp = fopen("文件名","操作方式")) == NULL ){
printf("打不开文件n");
exit(1);
}
文件操作方式:文件操作方式含义r(只读)为输入打开一个文本文件
w(只写)为输出打开一个文本文件
a(追加)向文本文件尾增加数据
rb(只读)为输入打开一个二进制文件
wb(只写)为输出打开一个二进制文件
ab(追加)向二进制文件尾增加数据
r+(读写)为读/写打开一个文本文件
w+(读写)为读/写建立一个新的文本文件
a+(读写)为读/写打开一个文本文件
rb+(读写)为读/写打开一个二进制文件
wb+(读写)为读/写建立一个新的二进制文件
ab+(读写)为读/写打开一个二进制文件
规律:
1、含有”b”的为二进制文件操作。
2、含有”+”的可以进行读写操作,且可以新建文件。
文件关闭fclose
函数原型:int fclose(FILE *fp);
功能:关闭fp所指向的文件。
正常关闭返回0,出错返回非0值。
读/写文件中的一个字符
写入一个字符到文件中——fputc
函数原型:int fputc(int c, FILE *fp);
功能:把一字节代码c写入fp指向的文件中,同时读写位置指针指向下一个写入位置。
返回值:正常,返回c(ASCLL码);错误返回EOF。
从文件中读取一个字符——fgetc
函数原型:int fgetc(FILE *fp)
功能:从fp指向的文件中读取一字节代码。
返回值:正常,返回读到的代码值;读到文件为或出错,返回EOF。
库函数feof
函数原型:int feof(FILE *fp)
功能:执行读文件操作时,遇到文件尾,返回逻辑真;否则返回0。
读/写一个字符串
读一个字符串——fgets
函数原型:char *fgets(char *s, int n, FILE *fp)
功能:从fp所指向文件读n-1个字符送股s指向的内存区,并在最后加一个’ ’。
返回值:正常时返回读取字符串的首地址;出错或遇文件尾返回NULL。
写一个字符串——fputs
函数原型:int fputs(char *s, FILE *fp)
功能:把s指向的字符串写入fp指向的文件。
返回值:正常时返回写入的最后一个字符;出错为EOF。
读/写一个数据块
读一个数据块——fread
函数原型:int fread(void *buffer, int size, int count, FILE *fp)
功能:从fp所指向的文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针移动size*count个字节。
返回值:调用成功,返回count;否则为0。
注意:一般用于二进制文件的处理。
写一个数据块——fwrite
函数原型:int fwrite(void buffer, int size, int count, FILE *fp)
功能:从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件中;同时将读写文件位置指针移动size*count个字节。
返回值:调用成功,返回count;否则为0。
注意:一般用于二进制文件的处理。
对文件进行格式化读写
函数原型:
1、读入:int fscanf(FILE *fp,const char*format,[argument,···])
2、写出:int fprintf(FILE *fp,const char*format,[argument,···])
功能:按格式对文件进行I/O操作。
返回值:成功,返回I/O的个数;出错或文件尾,返回EOF。
位置指针和文件定位
位置指针复位函数——rewind
函数原型:void rewind(FILE *fp)
功能:使文件的位置指针返回到文件头。
移动文件位置指针函数fseek
函数原型:int fseek(FILE *fp, long int offset, int whence)
功能:将指定文件的位置指针,从参照点开始,移动指定的字节数。
参照点:’0’或SEEK_SET表示文件头,’1’或SEEK_CUR表示当前位置,’2’或SEEK_END表示文件尾。
返回值:成功为0;否则为非0值。
注意:一般用于二进制文件处理。
返回文件当前位置的函数ftell
函数原型:long int ftell(FILE *fp)
功能:返回文件位置指针的当前位置(用相对于文件头的位移量表示)。如果返回值为-1L表明调用出错。1
2
3offset = ftell(fp);
if(offset == -1L)
printf("ftell() errorn");
出错检测
ferror函数
函数原型:int ferror(FILE *fp)
功能:如果返回值为0,表示未出错;返回非0值,表示出错。
注意:
(1)对同一文件,每次调用输入输出函数均产生新的ferror()函数值。因此调用的输入输出函数后,应立即检测,否则出错信息会丢失。
(2)在执行fopen函数时,系统将ferror的值设为0。
clearerr函数
函数原型:void clearerr(FILE *fp)
功能:将文件错误标志(ferror的值)和文件结束标志(feof的值)置为0。