C语言知识点梳理.docx
- 文档编号:4098724
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:19
- 大小:21.28KB
C语言知识点梳理.docx
《C语言知识点梳理.docx》由会员分享,可在线阅读,更多相关《C语言知识点梳理.docx(19页珍藏版)》请在冰豆网上搜索。
C语言知识点梳理
1、内存四区特点
a)全局区变量空间缺省每个字节为00,栈空间缺省是cc,堆缺省是cd
b)堆、全局区(静态区)、字符串常量区,与栈区空间的位置距离很大,栈区访问速度可能最快;
2、C语言与C++编译器的区别:
a)所有的.c文件在VC或者VS编译器中按C编译器编译;
b)所有的.cpp文件在VC或者VS编译器中按C++编译器编译;
c)C编译器中所有的结构体名称在调用时都必须指定struct关键字;
d)C编译器中所有函数内临时变量,必须在函数起始位置定义;
Linux也有C语言编译器和C++编译器:
gcc命令按C编译器编译;
g++命令按C++编译器编译;
3、结构体对象赋值
a)memcpy
b)结构体对象之间直接赋值a=b;
4、学生信息管理系统:
a)录入数据时实现检查前面已经输入了该学号,阻止重复的学号被输入;
b)二级子菜单的开发:
a)浏览时可以按学号、姓名或成绩排序;
b)查找时可以按学号、姓名或成绩分数段查找;
c)将每次录入的学生信息保存到文件,下次启动时自动加载;
5、getc,fgetc:
-1代表结束符,不但能接收键盘输入的内容,也能从文件中读取一个字符;
getchar()等价于getc(stdin);
6、putc,fputc:
putchar(c)等价于putc(c,stdout);
7、文件操作t模式与b模式:
windows下每个文件中正确的换行符号是:
\r\n
\r0D
\n0A
t模式(缺省):
读取windows文件时将\r\n在读取过程中合并为\n
t模式写入文件时会将\n的换行符,在写入时加入\r成为\r\n的换行符形式
b模式是按文件原本的\r\n换行符读取到内存缓冲区中;
8、文件打开失败的原因是什么?
"r":
文件不存在,或者被写入性质的占用;
"w":
文件不存在不会失败,因为它可以自动创建指定的文件;失败的原因是创建都没办法,例如:
盘符,或者只读盘,只读文件;
"r+":
在win7以上的操作系统可以创建不存在文件,但是如果是只读文件打开会失败;可读可写模式
"w+":
打开后会自动清空文件,如果文件是只读会打开失败。
9、C动态内存(堆空间)
a)申请一个堆上的单个变量:
int*p=(int*)malloc(sizeof(int));
b)申请一个堆上的数组:
int*p=(int*)malloc(5*sizeof(int));
c)堆上的地址可以跨函数使用,在不需要时使用free释放堆空间;
10、宏函数
#definemax(a,b)a>b?
a:
b
常量定义方式:
#define,const,enum
enum的定义语法和struct极其相似,以逗号相隔
a)如果未指定从0开始,其他依次加1;
b)如果指定从指定的数开始,其他未指定的依次加1;
c)使用枚举定义系列常量的优点是可以自动无重复
11、二级指针
文件名:
PointerArray.txt
#include
voidTest2(char**pp)
{
//二级指针变量做参数,可以改变一个一级指针变量,让其指向其他地址
*pp=NULL;//*pp类型是char8的指针变量,也就是主调函数中p变量的代理
}
//voidTest3(char*p[])
voidTest3(char**pp,intn)
{
//指针数组做参数,实际上编译器内部自动转为二级指针
inti=0;
char*p;
while(i { p=pp[i]; printf("%s\n",p); ++i; } } intmain() { char*p="Test"; char*ar[4]={"basic","fortran","C++"};//ar[i]是char*类型 printf("sizeof(ar)=%d\n",sizeof(ar)); char**pp=ar; inti=0; while(i { p=pp[i]; printf("第%d个指针变量指向的地址是: 0x%p,指向的内容是: %s\n",i,p,p); //pp[i]的类型: char* i++; } Test2(&p); Test3(ar,4); return0; } 指针数组: #include voidmain() { char*p="Test"; char*ar[4]={"basic","fortran","C++"};//一共4个元素,每个元素都是char*类型 printf("sizeof(ar)=%d\n",sizeof(ar)); inti=0; //while(i while(ar[i]) { printf("ar[%d]指向的地址是: 0x%p,内容是: %s\n",i,ar[i],ar[i]); //ar[i]是char* ++i; } printf("p指向的地址是: 0x%p内存空间上的内容是: %s\n",p,p); } a)作输出型参数(背下2句话) 一级指针变量作参数,可以改变的是普通类型变量的实际参数的数值。 二级指针变量做参数,可以改变一个一级指针变量指向的地址。 b)遍历栈内数组(背下2句话) 一级指针常常用于遍历栈内或者全局区的一维数组; 二级指针可以遍历栈内或者全局区的指针数组。 (但是二级指针不可以遍历二维数组) 12、malloc堆内存申请总结: a)在堆空间申请一个普通变量(栈内变量: intn=-1;) int*p=(int*)malloc(sizeof(int)); b)在堆空间申请一个普通数组(栈内数组: intar[10];) int*p=(int*)malloc(sizeof(int)*10); c)在堆空间中申请一个结构体对象: (SStudst={1008,”aaa”,98};) SStud*p=(SStud*)malloc(sizeof(SStud)); d)在堆空间中申请一个结构体数组: (SStudst[10]={1008,”aaa”,98};) SStud*p=(SStud*)malloc(sizeof(SStud)*10); e)在堆空间中申请一个指针数组: (char*ss[10]={”abc”,”dd”,”aaa”};) char**p=(char**)malloc(sizeof(char*)*4); 13、free出错的原因: a)越界使用了malloc申请的空间; b)free的位置必须申请时起始位置,稍微有偏差就会出错; 14、二维数组做参数(行指针): a)二维数组做参数,只有1个括号可以不指定元素个数(靠近数组名) 例如: VoidTest(inta[][112][199]) b)实际上二维数组作参数是,内部已经转化成了行指针 voidTest(inta[][3])转化为voidTest(int(*a)[3]) int(*a)[3]是一个指针,原始类型*a或者a[0]是intd[3]; 15、C语言两大奇葩指针变量: a)行指针: int(*p)[12]=ar; b)函数指针: int(*pF)(int,int)=NULL 调用时有两种方法: 标准方法: intn=(*pF)(37,6); 简易方法: intn=pF(37,6); 16、printf函数占位控制: a)%符号与控制符之间的数字是用来控制占位的。 例如: printf("%8.3f",34.678f); 8代表包括小数点总共占用8个空位,.3代表保留3位小数。 b)%之后带-符号代表在所占用的空间内左对齐,缺省不带-符号是右对齐。 例如: printf("价格=%-8.3f",34.67f); 还是占用8个空位,但是左对齐 c)如果%后面是0.x代表不占用多余空位,只控制保留的小数位。 例如: printf("价格=%-0.3f",34.6f); d)对于整数和字符串输出只有占位控制和对齐管理,没有小数点后面的控制。 例如: printf("学号: %-8d姓名: %-10s"); 8和10代表的是占位管理,-符号代表左对齐,缺省不带-符号是右对齐。 17、printf加强功能: 宽度管理 a)整数宽度: 右对齐占8个位置,如: printf("%8d%8d",32,n); 左对齐占8个位置,如: printf("%-8d%-8d",32,n); 左对齐填充无效,右对齐填充0,如: printf("%08d%08d",32,n); 16进制填充0,如: printf("0x%08x0x%08x",32,n); b)字符串: 例如: printf("你的姓名是: %10s",s);右对齐 printf("你的姓名是: %-10s",s);左对齐 c)浮点数: 例如: printf("工资: %16.3f",8001.5);右对齐 printf("工资: %-16.3f",8001.5);左对齐 例如: printf("%8.3f",34.678f); 18、timelocaltime [附件]程序代码链表外排序(提取排序规则堆内数组+free函数指针数组): 结构体定义: typedefstructSUser { intnNumb; charsName[20]; floatfMath; }DATA; 链表: typedefstructSNode { DATAdata; SNode*pNext; }NODE,*PNODE; SNode*g_pHead=NULL; 排序规则: intbyNumb(SNode*q,SNode*m) { returnq->data.nNumb } intbyName(SNode*q,SNode*m) { returnstrcmp(q->data.sName,m->data.sName)<0; } intbyMath(SNode*q,SNode*m) { returnq->data.fMath>m->data.fMath; } 函数指针定义: typedefint(*FUNCP)(SNode*,SNode*); 排序函数: voidSort(intnIndex) { //int(*pFunc)(SNode*q,SNode*m)=NULL; //FUNCPpFunc; FUNCPpFuncs[]={byNumb,byName,byMath}; SNode*p=g_pHead; if(! p) return; intn=0,i=0; while(p) { p=p->pNext; ++n; } //SNode*ps[100]={0}; SNode**ps=(SNode**)malloc(sizeof(SNode*)*(n+1)); p=g_pHead; while(p) { ps[i]=p; p=p->pNext; ++i; } ps[i]=NULL; i=0; while(i { intj=i+1; intm=i; while(j { //if(ps[j]->data.nNumb //if(Judge(ps[j],ps[m],nIndex)) //if((*pFunc)(ps[j],ps[m])) if((*pFuncs[nIndex-1])(ps[j],ps[m])) //if(pFuncs[nIndex-1](ps[j],ps[m])) m=j; ++j; } if(m! =i) { SNode*t=ps[i]; ps[i]=ps[m]; ps[m]=t; } ++i; } PrintS(ps); free(ps); } 从文件加载数据: voidLoad() { DATAdata; FILE*pf=fopen("stud.lv","r"); if(! pf) { puts("加载信息时失败! "); return; } while(fread(&data,1,sizeof(DATA),pf)==sizeof(DATA)) { AddTail(data); } fclose(pf); } 保存数据到文件: voidSave() { SNode*p=g_pHead; FILE*pf=fopen("stud.lv","w"); if(! pf) { puts("保存文件时失败! "); return; } while(p) { fwrite(p,1,sizeof(p->data),pf); //fwrite(&p->data,1,sizeof(p->data),pf); p=p->pNext; } fclose(pf); } 在链表尾部添加: voidAddTail(DATAdata) { SNode*pNew=(SNode*)malloc(sizeof(SNode)); pNew->data=data; pNew->pNext=NULL; if(! g_pHead) { g_pHead=pNew; return; } SNode*p=g_pHead; while(p->pNext) p=p->pNext; p->pNext=pNew; } 在链表头部添加: voidAddHead(DATAdata) { SNode*p=(SNode*)malloc(sizeof(SNode)); p->data=data; p->pNext=g_pHead; g_pHead=p; } 修改: voidModify() { intnNumb; printf("请输入要修改的学号: "); scanf_s("%d",&nNumb); SNode*p=g_pHead; while(p) { if(p->data.nNumb==nNumb) break; p=p->pNext; } if(! p) { puts("你输入的学号不存在! "); system("pause"); return; } printf("%d\t%s\t%0.1f\n",p->data.nNumb,p->data.sName,p->data.fMath); printf("请输入姓名和成绩: "); scanf_s("%s",p->data.sName,sizeof(p->data.sName)); scanf_s("%f",&p->data.fMath); Save(); Print(); } 删除: intDelNumber(intnNumb) { SNode*p=g_pHead,*p1=NULL; if(! p) return0; if(p->data.nNumb==nNumb) { g_pHead=p->pNext; free(p); return1; } while(p) { if(p->data.nNumb==nNumb) { p1->pNext=p->pNext; free(p); return1; } p1=p; p=p->pNext; } return0; } voidDelete() { charc; do { intnNumb; printf("请输入要删除的学号: "); scanf_s("%d",&nNumb); if(DelNumber(nNumb)) { Save(); Print(); } else { puts("你输入的学号不存在! "); } printf("是否继续删除? [y/n]"); //setbuf(stdin,NULL); rewind(stdin); c=getchar(); }while(c=='y'||c=='Y'); } 打印: voidPrint() { system("cls"); puts("学号\t姓名\t成绩"); inti=0; SNode*p=g_pHead; while(p) { printf("%d\t%s\t%0.1f\n",p->data.nNumb,p->data.sName,p->data.fMath); p=p->pNext; ++i; } printf("\t总共有%d条记录\n",i); system("pause"); } 输入: voidInput(intnDir) { intnNumb; printf("请输入学号: "); scanf_s("%d",&nNumb); DATAdata; data.nNumb=nNumb; printf("请输入姓名: "); scanf_s("%s",data.sName,sizeof(data.sName)); printf("请输入成绩: "); scanf_s("%f",&data.fMath); if(1==nDir) AddHead(data); else AddTail(data); Save(); Print(); } voidPrintS(SNode**ps) { system("cls"); puts("学号\t姓名\t成绩"); inti=0; while(ps[i]) { SNode*p=ps[i];//ps[i]都是SNode*类型 printf("%d\t%s\t%0.1f\n",p->data.nNumb,p->data.sName,p->data.fMath); ++i; } printf("\t总共有%d条记录\n",i); system("pause"); } 添加菜单: intAddMenu() { puts("1.向头部插入"); puts("2.向尾部插入"); puts("0.返回主菜单"); inti=0; scanf_s("%d",&i); switch(i) { case1: case2: Input(i); break; } returni; } 排序菜单: intSortMenu() { system("cls"); puts("1.按学号排序"); puts("2.按姓名排序"); puts("3.按成绩排序"); puts("4.不排序"); puts("0.返回主菜单"); inti=0; scanf_s("%d",&i); switch(i) { case1: case2: case3: Sort(i); break; case4: Print(); default: returni; } returni; } 主菜单: intMenu() { inti=0; system("cls"); puts("1.浏览所有信息"); puts("2.添加信息"); puts("3.删除信息"); puts("4.修改信息"); puts("5.查找信息"); puts("6.颜色设置"); puts("0.退出"); printf("请选择: "); scanf_s("%d",&i); switch(i) { case0: break; case1: while(SortMenu()) ; break; case2: while(AddMenu()) ; break; case3: Delete(); break; case4: Modify(); break; } returni; } 主函数: intmain() { Load(); //inti=SYSTEM; //intj=TEST; //intk=HIDE; while(Menu()) ; return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 知识点 梳理
![提示](https://static.bdocx.com/images/bang_tan.gif)