C语言复习笔记
一.C语言结构及其规范
1.组成:C语言由若干头文件和函数组成
主函数不可少,最新c标准中类型为int。
2.C语言的良好习惯
语句:一个说明或一个语句占一行,语句要有明显缩进,按一下tab键。
符号:括号成对写,成对删,语句末尾要有分号,所有符号为英文半角符号。
3.//注释一行 /* */注释多行
要记得写一些注释
二.C语言中的数据类型
1.标识符
组成:0到9的数字,26个大小写字母,下划线_
注意:只能字母或下划线开头;
长度不宜太长,有些版本规定前八位有效;
严格区分大小写;
最好要有意义,便于阅读 ;
如:word_max_length;
C语言的关键字不能作为标识符。
2.变量和赋值
注意:int a=b=c=5;×
int a,b,c; a=b=c=5; √
3.基本数据类型
基本类型:整型,字符型,实型(单精度浮点型,多精度浮点型)
构造类型:枚举类型,数组类型,结构体类型,共用体类型
指针类型
空类型
3.输出语句
printf("输出格式符",输出项);
格式符的个数要与变量、常量或者表达式的个数一一对应
%f 输出六位小数
输出十位小数%.10lf
4,常量
整型常量,实型常量,字符常量,字符串常量
5.自动转换类型
占字节少的数据类型可以自动转换为占字节大的数据类型
6.强制类型转换
形式为:(数据类型)(表达式)
不改变原数据,需要加括号,不遵循四舍五入
三.C语言运算符
1.类型: 算术运算符;
赋值运算符;
关系运算符;
逻辑运算符;
三目运算符。
2.除法运算
两整数除,小数省略,有一小数,结果为小数。
3.取余运算
符号由被除数决定;
只适合整数的运算。
4.自增运算符,自减运算符
++a; --a;先运算再取值
a--;a++;先取值再运算
5.赋值运算符
有右结合性
复合赋值运算符 a+=a
a*=5
a-=5
a%=5
a/=5
6.关系运算符
7.逻辑运算符
&& 与 ||或 !非
8.三目运算符
表达式1?表达式2:表达式3
表达式1为真,执行表达式2,为假,执行表达式3。
9.表达式优先级
括号优先级最高;
!正负号自增自减其次;
先乘除取余后加减;
关系运算分两级==,!=是第二级;
与&&高于或||;
三目运算符;
复合赋值在最后。
四.C语言结构语句
1.分支结构
简单if语句
if(表达式){
}
if-else语句
if(表达式)
{
}
else
{ }
多重if-else语句
if(表达式1)
{ }
else if(表达式2)
{
}
else
{
}
if-else可以进行嵌套
2.循环语句
while循环
while(表达式)
{ }
要改变循环变量的值,避免出现死循环。
do-while循环
do{
}while(表达式);
注意此处的分号
for循环
for(表达式1;表达式2;表达式3)
{ }
表达式一二三都可以省略,但是两个分号不可以省略
不知道循环次数用while和do-while,知道用for
新的_Bool类型
在编程中,表示真或假的变量被称为布尔变量(boolean variable);
该类型变量只能存储1(真)或2(假)
如将其他数赋值给_Bool类型变量,该变量会被设置为1;
循环也可以嵌套,如冒泡排序
#include<stdio.h> int main() { printf("请输入十个数字;\n"); //输入十个数字 int series[50]; int i,j,charge; for(i=0;i<10;i++) scanf("%d",&series[i]); for(i=9;i>=0;i--) { for(j=0;j<=i;j++) { if(series[j]<series[j-1]) { charge=series[j-1]; series[j-1]=series[j]; series[j]=charge; } } } printf("该数列从小到大排列后:\n"); for(i=0;i<10;i++) //输出排列后的数组 { if(i<9) printf("%d,",series[i]); else printf("91"); } return 0; }
3.break,contine,goto
break可以跳出当前循环,continue结束本次循环继续下一次循环;
goto也可以跳出循环,多层循环可以直接跳出。
4.swtich语句
swtich(表达式){ case 1:
case 2:
default:
}
case后的多个语句不用{};
swtich后的表达式只能是整型和字符型;
default可以省略。
五.函数
1.函数的分类
函数可分为库函数和用户自定义函数;
函数可分为有返回值函数和无返回值函数;
按照主调函数和被调函数有无数据传输可分为无参函数和有参函数。
2.自创函数
[数据类型说明]函数名([参数])
{
return0;
}
3.函数调用
函数名([参数]);
4.形参和实参
形参是定义函数时用的参数,只在函数内部有效,返回主调函数后不再使用;
实参是在调用时传递该函数的参数;
实参和形参在数量上,类型上必须严格一致。
5.函数的返回值
注意:1.函数返回值的类型应与函数类型保持一致;
2.有返回值的函数只能返回一个值;
3.返回值是指针类型,函数就是指针函数。
6.递归函数
即一个函数在函数体内调用它自身。
如:n的阶乘
#include<stdio.h> int factorial(int n) { int result; if (n<0) { printf("输入错误\n"); return 0; } else if(n==0||n==1) { result=1; } else { result=factorial(n-1)*n; } return result; } int main() { int x; printf("请输入你要算的阶乘:\n"); scanf("%d",&x); printf("%d的阶乘是%d",x,factorial(x)); return 0; }
递归函数必须要结束条件。
7.局部与全局
全局变量在函数外部定义,不属于任何一个函数
8.变量存储类别
1. 分为静态存储方式和动态存储方式
动态存储区存放的变量根据程序运行的需要而建立和释放
2.存储类别分为四类:自动(auto)
静态(static)
寄存器的(register)不能定义多个寄存器变量,只有局部自动变量和形参可以作为寄存器变量
外部的(extern)
9.内部函数和外部函数
不能被其他源文件调用的函数是内部函数,用static来定义
static [数据类型]函数名[参数]
能被其他源文件调用的是外部函数
extern [数据类型]函数名[参数]
不指定,默认为外部函数
六.数组
1.数组概念:一块连续的,大小固定并且里面的数据类型一致的内存空间。
2.数组声明:数据类型 数组名称[长度];
3.数组初始化的三种形式:
数据类型 数组名称[长度n] = {元素1,元素2…元素n};
数据类型 数组名称[] = {元素1,元素2…元素n};
数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n-1] = 元素n;
4.在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。
5.数组的遍历
int arr[3]={1,2,3}; int i; for(i=0;i<3;i++) { printf("%d\n",arr[i]); } return 0;
要避免越界访问
数组作为函数参数
1、整个数组当作函数参数,即把数组名称传入函数中 2、数组中的元素当作函数参数,即把数组中的参数传入函数中
冒泡排序
#include<stdio.h> int main() { printf("请输入十个数字;\n"); //输入十个数字 int series[50]; int i,j,charge; for(i=0;i<10;i++) { scanf("%d",&series[i]); } for(i=9;i>=0;i--) { for(j=0;j<=i;j++) { if(series[j]<series[j-1]) { charge=series[j-1]; series[j-1]=series[j]; series[j]=charge; } } } printf("该数列从小到大排列后:\n"); for(i=0;i<10;i++) //输出排列后的数组 { if(i<9) printf("%d,",series[i]); else printf("91"); } return 0; }
数组的查找功能
如该程序
#include<stdio.h> int getIndex(int arr[5],int value) { int i; for(i=0;i<5;i++) { if(arr[i]==value) { return i; } } return -1; } int main() { int arr[5]={22,45,23,12,67}; int value=12; int index=getIndex(arr,value); if(index!=-1) { printf("%d在数组中存在,下标为%d",value,index); } else { printf("%d在数组中不存在",value); } return 0; }
字符串与数组
有两种格式:
1、char 字符串名称[长度] = "字符串值";
2、char 字符串名称[长度] = {'字符1','字符2',...,'字符n','\0'};
第一种可以写中文,第二种不可以
10.一些#include<string.h>下的函数
1.strlen()获取字符串的长度,在字符串长度中是不包括‘\0’而且汉字和字母的长度是不一样的。
2.strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较,返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2 的ASCII码大,返回结果为-1表示s1比s2的ASCII码小。
3.strcpy()拷贝之后会覆盖原来字符串且不能对字符串常量进行拷贝。
4.strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串
5.strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串
6.strchr()在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
11.多维数组
数据类型 数组名称常量表达式1...[常量表达式n];
初始化方式:
1、数据类型 数组名称常量表达式1...[常量表达式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
2、数据类型 数组名称常量表达式1...[常量表达式n]; 数组名称下标1...[下标n] = 值;
注意:
1、采用第一种始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以 及列的维数后,会直接计算出行的维数;
2、采用第二种初始化时数组声明必须同时指定行和列的维数。
12.多维数组的遍历
#include<stdio.h> int main() { int num[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("num[%d][%d]=%d\n",i,j,num[i][j]); } } return 0; }
13.数组的输出输入
可以用 gets();
puts();
可以用%s整体输出
七.随机数
1.rand 函数 和 srand 函数 在C语言中比较常用的随机函数是 rand 函数,它可以随机的产生 0 ~ rand_max 的随机数,定义类型不同最大值也不同,rand 函数包含在头文件stdlib.h中。
#include<stdio.h> #include<stdlib.h> int main() { int a=rand(); printf("%d",a); return 0; }
rand 在系统启动之后就是一个定值。
要想每次产生的随机数不一样,要用到 srand 函数。
srand() 函数原型是:
void srand(unsigned int seed);
seed相同,产生的随机数相同,为了让随机数随机,要用时间做种子。
srand(time(NULL))
srand((unsigned int)time(NULL));//我们在使用rand和srand时,主要使用的就是这一种初始化方法!! 如果仍然觉得时间间隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某个合适的整数。 例如,srand((unsigned)time(NULL)*10) time的参数传NULL表示不需要经过参数获得到的time_t数据
2.随机数产生的方法
头文件
#include<stdlib.h>
#include<time.h>
初始化的两种方法
srand((unsigned int)getpid())
srand((unsigned int)time(NULL))
产生一个1到100的数
int num = rand() % 100 + 1;
八.指针
1.指针类型
指针是表示地址信息的数据类型
地址可以用10进制,8进制,16进制表示
%x 十六进制
%o 八进制
%lu 无符号长整型
2.指针变量的格式
类型说明符 *指针变量名[=初值];
类型说明符是指该指针变量指向的变量的数据类型
可以在定义时对指针赋初值
NUll表示指针不指向任何单元
3.辨析&和*
这两个符号有右结合性,这两个是一种相反的运算
*后只能是指针变量
4.可以对指针加减乘除,可以交换两个指针的指向
5.指向指针变量的指针
int a=10,*p,**q;
p=&a;
q=&p;
6.指针和数组
p++表示指向当前元素的下一个元素
可以用指针遍历数组
#include<stdio.h> int main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p; int i,j; for(p=a[0];p<a[0]+12;p++) { if((p-a[0]%4)==0) printf("\n"); printf("%-4d",*p); } return 0; }