C语言知识点梳理Word下载.docx
- 文档编号:17014751
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:19
- 大小:21.28KB
C语言知识点梳理Word下载.docx
《C语言知识点梳理Word下载.docx》由会员分享,可在线阅读,更多相关《C语言知识点梳理Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
在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<
stdio.h>
voidTest2(char**pp)
{
//二级指针变量做参数,可以改变一个一级指针变量,让其指向其他地址
*pp=NULL;
//*pp类型是char8的指针变量,也就是主调函数中p变量的代理
}
//voidTest3(char*p[])
voidTest3(char**pp,intn)
{
//指针数组做参数,实际上编译器内部自动转为二级指针
inti=0;
char*p;
while(i<
n)
{
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;
sizeof(ar)/sizeof(ar[0]))
第%d个指针变量指向的地址是:
0x%p,指向的内容是:
i,p,p);
//pp[i]的类型:
char*
i++;
Test2(&
p);
Test3(ar,4);
return0;
指针数组:
voidmain()
char*p="
char*ar[4]={"
"
};
//一共4个元素,每个元素都是char*类型
sizeof(ar));
inti=0;
//while(i<
sizeof(ar)/sizeof(ar[0]))
while(ar[i])
ar[%d]指向的地址是:
0x%p,内容是:
i,ar[i],ar[i]);
//ar[i]是char*
p指向的地址是:
0x%p内存空间上的内容是:
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)%之后带-符号代表在所占用的空间内左对齐,缺省不带-符号是右对齐。
价格=%-8.3f"
34.67f);
还是占用8个空位,但是左对齐
c)如果%后面是0.x代表不占用多余空位,只控制保留的小数位。
价格=%-0.3f"
34.6f);
d)对于整数和字符串输出只有占位控制和对齐管理,没有小数点后面的控制。
学号:
%-8d姓名:
%-10s"
);
8和10代表的是占位管理,-符号代表左对齐,缺省不带-符号是右对齐。
17、printf加强功能:
宽度管理
a)整数宽度:
右对齐占8个位置,如:
%8d%8d"
32,n);
左对齐占8个位置,如:
%-8d%-8d"
左对齐填充无效,右对齐填充0,如:
%08d%08d"
16进制填充0,如:
0x%08x0x%08x"
b)字符串:
你的姓名是:
%10s"
s);
右对齐
左对齐
c)浮点数:
工资:
%16.3f"
8001.5);
右对齐
%-16.3f"
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<
m->
data.nNumb;
intbyName(SNode*q,SNode*m)
returnstrcmp(q->
data.sName,m->
data.sName)<
0;
intbyMath(SNode*q,SNode*m)
data.fMath>
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;
ps[i]=p;
ps[i]=NULL;
i=0;
while(i<
n-1)
intj=i+1;
intm=i;
while(j<
n)
{
//if(ps[j]->
ps[m]->
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;
PrintS(ps);
free(ps);
从文件加载数据:
voidLoad()
FILE*pf=fopen("
stud.lv"
pf)
puts("
加载信息时失败!
while(fread(&
data,1,sizeof(DATA),pf)==sizeof(DATA))
AddTail(data);
fclose(pf);
保存数据到文件:
voidSave()
保存文件时失败!
fwrite(p,1,sizeof(p->
data),pf);
//fwrite(&
p->
data,1,sizeof(p->
在链表尾部添加:
voidAddTail(DATAdata)
SNode*pNew=(SNode*)malloc(sizeof(SNode));
pNew->
data=data;
pNext=NULL;
g_pHead)
g_pHead=pNew;
while(p->
pNext)
p->
pNext=pNew;
在链表头部添加:
voidAddHead(DATAdata)
SNode*p=(SNode*)malloc(sizeof(SNode));
pNext=g_pHead;
g_pHead=p;
修改:
voidModify()
请输入要修改的学号:
scanf_s("
%d"
&
nNumb);
if(p->
data.nNumb==nNumb)
break;
你输入的学号不存在!
system("
pause"
%d\t%s\t%0.1f\n"
p->
data.nNumb,p->
data.sName,p->
data.fMath);
请输入姓名和成绩:
%s"
data.sName,sizeof(p->
data.sName));
%f"
Save();
Print();
删除:
intDelNumber(intnNumb)
SNode*p=g_pHead,*p1=NULL;
return0;
if(p->
g_pHead=p->
free(p);
return1;
p1->
pNext=p->
free(p);
return1;
p1=p;
voidDelete()
charc;
do
intnNumb;
请输入要删除的学号:
scanf_s("
if(DelNumber(nNumb))
Save();
Print();
else
puts("
是否继续删除?
[y/n]"
//setbuf(stdin,NULL);
rewind(stdin);
c=getchar();
}while(c=='
y'
||c=='
Y'
打印:
voidPrint()
system("
cls"
puts("
学号\t姓名\t成绩"
data.nNumb,p->
data.sName,p->
\t总共有%d条记录\n"
i);
输入:
voidInput(intnDir)
请输入学号:
data.nNumb=nNumb;
请输入姓名:
data.sName,sizeof(data.sName));
请输入成绩:
if(1==nDir)
AddHead(data);
else
voidPrintS(SNode**ps)
while(ps[i])
SNode*p=ps[i];
//ps[i]都是SNode*类型
添加菜单:
intAddMenu()
1.向头部插入"
2.向尾部插入"
0.返回主菜单"
i);
switch(i)
case1:
case2:
Input(i);
break;
returni;
排序菜单:
intSortMenu()
1.按学号排序"
2.按姓名排序"
3.按成绩排序"
4.不排序"
case3:
Sort(i);
case4:
Print();
default:
returni;
主菜单:
intMenu()
1.浏览所有信息"
2.添加信息"
3.删除信息"
4.修改信息"
5.查找信息"
6.颜色设置"
0.退出"
请选择:
case0:
while(SortMenu())
;
while(AddMenu())
Delete();
Modify();
主函数:
Load();
//inti=SYSTEM;
//intj=TEST;
//intk=HIDE;
while(Menu())
;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 知识点 梳理