一、数据类型:
类型决定了,在内存中分配的字节数,可以参与的运算类型
数值类型(int ,char ,double/float)
void
构造类型(数组,指针,结构体 )/*
结构体
struct Student //类型
{
int num;
char name[20];
int score[5];
char sex;}
struct Student stu; //int a; a=3;
stu.num=2019001;
stu.name[0]=‘z’*/
常量
4----int
3.6----double
3.6f----float
变量:先定义后使用,变量三要素:变量名,变量地址,变量值
注意:整型和字符型在一定范围通用
‘A’65
char
c=128//错,128超过了char能表示的范围(-128~127)
unsigned char c=128;//对
二、输入输出
c语言本身比提供输入输出语句,由库函数提供
scanf(“格式字符串”,地址) %lf—double %c
scanf("%d%c",&a,&c); 123x 不能加空格,否则空格给了c
printf(“字符串”)------原样输出字符串,通常用于提示
printf(“格式字符串”,变量名) char s[]=“hello”
printf("%s",s);char * str=“hello”
printf("%s",str);
三、对数据进行运算(数值型运算、非数值型运算)------------运算符
运算符的作用,优先级,结合性,表达式的值
算术
% / ++ –
赋值 =
+=
关系
== 1<x<5
逻辑
&&(短路) ||(短路) !
条件 ? :
逗号,
四、流程控制
1、顺序
2、选择
1)if(表达式)
语句;
if(4)
if(a)<=>if(a!=0)
if(!a)<=>if(a0)
2) if(表达式)
语句1
else
语句2
3) if…else嵌套
else和if的配对
4)switch(表达式)//表达式任意合法
{
case 常量: 语句1;break;//case后面必须是常量
case 常量: 语句2;break;
default: 语句n;//default语句可以没有}
3、循环
循环三要
循环初值,循环条件,循环体(循环变量的改变)
1)while(表达式)
语句
2)do{
语句
}while(表达式);
3)for(表达式1;表达式2;表达式3)//表达式3一定会执行,哪怕循环体中遇到continue
语句
4)break; 跳出所在的循环
continue; 跳过循环体下面的语句,接着执行下一次循环的判断(如果是for循环,则先执行表达式3,然后在进行下一次循环条件的判断)
5)循环的嵌套:外循环执行一次,内循环执行一轮
五、数组—处理批量同类型数据,数组在内存中占有连续一段内存,数组名代表数组首的地址,并且是常量,不能改变
(一)一维数组
1、数组的定义
类型 数组名[常量]
2、数组的初始化:定义的同时赋值
int a[10]={1,2,3,4}//部分赋值,数组的大小必须指定,其余数组元素的值为类型所默认的值
int a[]={1,2,3,4,5}//全部初始化,则可以省略数组大小
3、数组元素的引用
数组名[下标]
int b[5];
b[0]=1;
利用循环遍历数组
for(i=0;i<5;i++)
b[i]
(二)二维数组 --------按行存放,是一维数组的数组
1、数组的定义
类型 数组名[常量][常量]
2、数组的初始化:定义的同时赋值
int a[10][4]={{1,2,3},{4},{3}}//部分赋值,数组的大小必须指定,其余数组元素的值为类型所默认的值
int a[][3]={{1,2},{3,5},{4,9},{5,8}}//全部初始化,则可以省略数组第一维大小
int a[][3]={{1,2},{3},{4,9},{5}}//部分赋值,但按行赋值,此时也可以省略数组第一维的大小
3、数组元素的引用
数组名[行标][列标]
int a[5][4]; -------a是一个一维数组,里面有5个元素a[0],a[1],a[2],a[3],a[4],每个元素又都是一个一维数组,里面有4个元素
a[0][0]=1;
利用双重循环遍历数组
for(i=0;i<5;i++)
for(j=0;j<4;j++)
a[i][j]
对于方阵(行列相等)
上三角i>=j
下三角i<=j
对角线i==j
(三)常见算法
1、排序
2、增删改查
3、最值
(四)字符数组
char ch[10];
scanf("%s",ch);
printf("%s",ch);
字符串处理函数
六、函数—模块化程序设计
1、函数的定义
函数的类型
函数名(形参1类型 形参1,形参2类型 形参2…)
{
声明语句(变量、数组等的声明,函数的声明)
执行语句
}
、返回值只能有1个,函数体中return语句可以有多个,但是只有一个能执行
2、函数的调用
函数名(实参1,实参2…) 实参的个数和形参保持一致,类型和形参要赋值兼容,实参一定要有确定的值
调用时
1)流程转到被调用函数
2)给被调用函数的局部变量,分配内存空间
3)实参的值一一对应传给形参,执行函数体语句
调用结束
1)流程回到函数调用处
2)收回被调用函数中局部变量占有的内存空间
3)将返回值带回
参数的传递
形参是普通变量
传递的是值
形参是数组名
传递的是值(址)
3、函数的声明(函数原型的声明)----为了编译系统检查函数调用语句的合法性
4、全局变量/局部变量
七、指针
1、指针变量的定义
基类型 * 指针变量名
int * p
2、指针变量的赋值
int a;
int *pa=&a;
3、指针变量的引用
p=====地址
*p=====指向的内存中的内容
&取地址,后面只能跟变量
*取地址里面的内容,后面必须是指针(地址类型的变量)
4、指针指向数组
5、指针指向字符串
char *s=“hello”
*s!=’\0’
字符串
字符数组
1、使用字符串初始化字符数组
char ch[]=“hello world”
scanf("%s",ch);
printf("%s",ch);
2、字符串处理函数
gets(ch)
指针变量指向字符串
char
- str=“hello” //使用字符串常量对字符指针进行初始化
str=str+2;
str=“world”
等价于
char * str;
str=“hello”
char ch[]=“hello”
char ch[10];
ch=“hello”//错误
char * str=ch;
字符串在c内存中都是以数组的形式存放
char * mystrcat(char ch1[],char * ch2)
{
int i,j;
for(i=0;;i++)
{
if(ch1[i]==’\0’)
break;
}
for(j=0;;j++)
{
if(ch2[j]==’\0’)
break;
}
for(y=0,x=i;y<=j;x++,y++)
{ ch1[x]=ch2[y];
}
return ch1;
}
char * mystrcat(char * ch1,char * ch2)
{
int i,j;
for(i=0;;i++)
{
if(*(ch1+i)==’\0’)
break;
}
for(j=0;;j++)
{
if(*(ch2+j)==’\0’)
break;}
for(y=0,x=i;y<=j;x++,y++)
{(ch1+x)=(ch2+y); }
return ch1;}
案例,字符串连接函数
char * mystrcat3(char * ch1,char *ch2)
{char *p=ch1;
while(*ch1!='\0')
ch1++;
while(*ch2!='\0')
{
*ch1=*ch2;
ch1++;
ch2++; }
*ch1='\0';
return p;}
#define A 5
#define B 6
#define C A+B
int x=2*C
====>x=2A+B ==x=25+6