C 语言笔记 荆楚理工学院:吴世华
第一章程序设计基本概念
1. 把由高级语言编写的程序称为“源程序“,把由二进制代码表示的程序称为”目标程序“,能把用户按规定语法写出的语句一一翻译成二进制的机器指令的软件称为“编译程序”。
2. 当型循环的特点是:当指定条件满足时,就执行循环体
3. 直到型循环特点是:当指定条件满足时,就跳出循环体
第二章 C 程序设计初步知识
1. C语言中,只有十进制数可以是负数,二八进制和十六进制数只能是正数。
2. 八进制以0开头、十六进制一0x 或者0X 开头
3. 通常把一个字节中的最右边一位称为最低位,最左边的一位称为最高位,其中最高位用于存放整数的符号,又称其为符号位。若是正数,最高位放置0;若是负数,最高位放置-1..
4. 负数在内存中是以“补码“形式存放的。源码 补码,前提是符号位不变。
5. 补码转十进制:
①先对除符号位之外的各位取反。如-6的补码11111010,取反后为10000101. ②将所得的二进制数转换为十进制数。如10000101的十进制数为-5. ③对所求得的数再减1,即为-6。
6. 表达式+分号=语句,如a=1+2是表达式、a=1+2;是语句
7. 需要两个运算对象的运算符,称为双目运算符,如+ - * / % 需要一个运算对象的运算符,称为单目运算符,如+ - 单目优先级高于双目 求余运算%的运算对象只能是整型。
8. 在C 语言中,所有实型数的运算均以双精度方式进行。若是单精度数,则在尾数部分添加0,使之转化为双精度。
9. 强制类型转换表达形式:(类型名)(表达式)如(double )(10%3)表示把10%3所得的结果1转换成双精度数。
10. 当赋值号左边的变量为短整型,右边的变量为长整形时,短整型只能接受长整形数低位上的两个字节中的数据,高位上两个字节中的数据将丢失。
11. 当赋值号左右边为一个有符号型、一个无符号型时,内存中的内容按原样复制,如有符
按位取反,末位加1 末位加1,按位取反
号型-1赋值给无符号型是65535
12.自增自减运算
i++ 表达式值域自增后的i值相同
i值都增加1
++i 表达式值域自增前的i值相同
13.逗号表达式:表达式1,表达式2,表达式n
逗号运算符的结合性从左到右,最后一个表达式的值为整个逗号表达式的值,在所有运算符中、逗号运算符的优先级最低。
第三章顺序结构
1.%f 以带小数点的数学形式输出浮点数(包含单精度和双精度)
2.%d、%c、%f、%e、%s、…..输出所占宽度由系统决定,通常按照数据本身的实际宽度
输出,前后不加空格,并采用右对齐方式。
3.%4d以四个宽度输出整形数据
printf(”%*d”,m,i)以m个宽度输出整形数据i
%5.2f以5个宽度保留2位小数的浮点型数据输出(第三位小数四舍五入)
Printf(“%*.*f”,m,n,f)以m宽度保留n位小数输出浮点型数据f
4.左对齐输出:%和宽度之间加“-”号,不加则默认右对齐。
带-+输出:%和宽度之间加“+”,不加则默认输出正数省略+
5.输出百分号%:printf(“%%”);
6.在VC6.0下,输入short型整数,格式控制要用%hd,输入double型要用%lf或%le,否
则不能正确输入
7.在scanf函数格式字符前可以加入一个整数指定输入数据的宽度,但不可以对实数指定
小数位的宽度。
8.scanf在输入整形或实型数据时,输入数据之间必须用空格、回车符、制表符(table键)
等间隔符隔开,间隔数不限。
9.跳过某个输入数据:
可以在%和格式字符之间加入“*”号,如:scanf(“%d%*d%d%d”,&x,&y,&z);
输入1 2 3 4 输出1 3 4
10.在scanf函数中,在每个格式说明符之间加一个逗号作为通配符:scanf(“%d,%d,%d”,&a,
&b,&c);则输入数据时,必须在前两个数据后面紧跟一个逗号如12,34,56
第四章选择结构
1.逻辑与&&,逻辑或||,逻辑非!
2.等号==,赋值号=。注意区分if语句中的等号==
3.复合语句:用花括号把多条语句括起来
如果if语句里面含多个语句,则需要用花括号括起来
4.if(表达式)语句,如果表达式值为1则执行后面语句,否则不执行。
5.条件表达式:表达式1?表达式2:表达式3
当表达式1的值非零时,求出表达式2值作为整个式子的值
当表达式1的值为零时,求出表达式3值作为整个式子的值
6.switch语句:
switch(表达式)
{
case 常量表达式1:语句1 break;//break用于跳出switch语句
case 常量表达式2:语句2 break;
case 常量表达式3:语句3 break;
default:语句4
}
7.
第五章循环结构
1.while循环结构:
while(表达式)
{语句} // 当表达式成立时,执行循环体。
2.do-while循环结构:
do // 当表达式成立时,执行循环体
{语句}
While(表达式);//注意有分号结尾
3.for语句结构:
for(表达式1;表达式2;表达式3)
{语句} // 当表达式2成立,执行循环体
4.break语句用于终止本层循环,continue语句用于终止本次循环。
5.
第六章字符型数据
1.一个字符常量代表ASCII字符集中的一个字符,在程序中用单引号把一个字符常量括
起来作为字符常量,如‘A‘,也可以写成’\101‘、’\x41‘其中斜杠后面表示A的ASCII代码值,三位表示8进制、可以不加0,两位表示16进制、前只能加x.
2.字符常量只能包含一个字符,如‘abc‘是非法的。
3.所有的字符常量都作为整形处理,在内存中占一个字节,存放的是该字符的ASCII代
码值,可以参与任何整数运算,如‘a‘+1=97+1=’b‘
4.字符变量,char a;a只能存放一个字符。用%c格式输入输出,当输入多个字符时,只
去第一个字符赋值给变量。
5.scanf(“%c%c%c%d”,a,b,c,d)输入字符时不应有间隔符,间隔符也会被当做字符读入!
Scanf(“%c %c %c %d”,a,b,c,d)加空格,输入时可以有间隔符、而不被读入!
6.a=getchar();//获取从键盘上输入的第一个字符
putchar(a);//输出从键盘上输入的第一个字符
putchar(‘ABC’)//输出字符B,只能输出一个字符
putchar(‘\n’)//换行
7.while((c=getchar())!=?\n?)
{语句} //当输入回车键时,终止循环
第七章函数
1.函数定义:
函数返回值类型函数名(类型名形式参数1,类型名形式参数2)
{语句} 如:
double add (double a,double b)//a和b为形参
{double s; s=a+b; return s;} //当程序执行到return语句时就退出该函数,函数中可以有多个return
2.函数调用:
main()
{ int k;
k=add(x,y);//x和y为实参
k=add(2,3);//2和3为实参
}
3.除返回值类型为int和char的函数外,其余函数必须先定义、后调用,如:要在main
函数中调用双精度add函数,add函数必须要在main之前先定义。
第八章地址和指针
1.内存的存储空间是连续的,内存中的地址号也是连续的,并且用二进制表示,为了直观
起见,常用十进制表示。
2.存放地址的变量称为“指针变量”。
3.每个变量的地址是指该变量所占存储单元的第一个字节的地址,指针变量存放的就是该
类型变量所占的第一个字节的地址。
4.指针移动的最小单位是一个存储单元,如int型指针移动的最小单位是4个字节。
5.直接存储:直接按变量地址存取变量
间接存储:通过指针间接得到变量地址,然后存取变量的值。
6.指针变量的定义:
类型名*指针变量名1,*指针变量名2;如:
int *pi,*pj;
pi=&a; //指针通过求地址运算符&获取地址
*pi=*pi+1;//指针的运算,相当于a=a+1
7.求地址运算符&只能应用于变量和数组元素,不可以用于表达式、常量或被说明为
register的变量。
8.在调用scanf函数时,输入的各项变量之间都必须加符号&,这就是求地址运算。scanf
函数把从终端读入的数据依次放入这些地址所代表的存储单元中,也就是说scanf函数
要求输入项是地址值。因此当有语句:q=&k时,scanf(“%d”,&k)和scanf(“%d”,q)是等价的。
9.给指针变量赋“空”值:p=NULL;
NULL是在stdio.h头文件中定义的预定义符,NULL的代码值为0,以上语句等价于:P=‘\0’或p=0;以十进制输出值为0,以指针方式输出出错。
10.指向指针的变量:int **p,*s,k=10;
s=&k;p=&s; //*s代表存储单元k,*p代表存储单元s,**p也代表
存储单元k。
11.指针的移动:对于连续的存储单元a[1]、a[2]、a[3],若指针p指向a[1],则p++自增后
将指向a[2],同理若运算p=p+2,则p指向a[3].
12.传送地址值能在被调用函数中直接改变调用函数中变量的值,调用形式如下:
void swap(int *a,int*b){语句交换a,b}
main(){swap(&x,&y);}//调用时要加&,调用后会交换main函数中的x,y值
13.函数返回值类型还可以是指针类型:
int *fun(……)//定义fun函数是整型指针函数
第九章数组
1.数组中的每个元素在内存中是连续单元存放的。
2.数组定义:
类型名数组名[整型常量表达式];如:int a[8]; //定义数组为整型、有八个元素a[0]到a[7]
3.C语言中,数组名存放的是该数组首个元素的地址,a=&a[0],a+1值等于&a[1].
4.C语言程序在运行过程中,系统并不自动检验数组元素的下标是否越界,因此数组的两
端都可能越界二破坏了其他存储单元中的数据,甚至破坏程序代码。
5.当赋初值少于所定义数组元素个数时,将自动给后面的元素补初值0(字符型补‘\0’).
给所有元素赋初值0:int a[10]={0},b[2][10]={{0},{0}}//给一维数组a,二维数组b赋初值0.
6.二维数组按行排列(先排第一行、再排第二行),多维数组最右边下标变化最快。
7.
第十章字符串
1.字符串是借助字符型一维数组来存放的,并规定以字符?\0?作为字符串结束标志。?\0?
是一个转义字符,称为“空值“,其ASCII代码值为0.
2.C语言中没有字符串型数据,但可以使用“字符串常量“:
char *p; p=?Hello!?;//字符串常量以无名一维数组存放,其值为第一个字符的地址
3.字符数组赋初值:
char str[6]={…H?,?e?,?l?,?l?,?o?};
char str[]={…H?,?e?,?l?,?l?,?o?,’\0’};//必须要留有一存储单元存放“\0“作为结束标志
char str[6]={“Hello”};//必须是定义时使用,系统自动加?\0?,要留一空位
char str[]=”Hello”;必须是定义时使用,可以去掉花括号,系统自动补?\0?
4.循环语句给数组元素逐个赋值:(输出同理)
char mark[10]; int i;
for(i=0;i<9;i++) scanf(“%c”,&maek[i]);
mark[i]=’\0’;//必须末尾加上’\0’
5.可以在定义字符指针变量时,把字符串的存储单元的起始地址赋给指针变量,如:
char *p=”Hello”;
6.用格式说明符%s进行整串输入和输出,如:
char str[10]; scanf(“%s”,str);//可以输入一串字符,系统自动补?\0?
str为地址值,其他指针也可以。
输入时,空格、回车都作为分隔符,出现分隔符则停止读入!
7.gets可以进行整串字符输入,用法:(puts类推)
char str[10];gets(str);//以回车作为结束标志,输入空格会被当做字符读入!
8.字符串处理函数
①字符串复制函数strcopy: strcopy(s1,s2) //把s2字符串类容复制到s1中,返回s1首地
址
②字符串链接函数strcat:strcat(s1,s2)// 把s2字符串类容链接到s1后面,返回s1首
地址
③求字符串长度函数strlen: strlen(s)//求去字符串s中字符个数,返回十进制个数。
④字符串比较函数strcop: strcmp(s1,s2)
第十一章对函数的进一步讨论
第十二章C语言中用户标示符的作用域和
存储类
第十三章编译预处理和动态存储分配
第十四章结构体、共用体和用户定义类型
第十五章位运算
第十六章文件