1 学习工具
学习c语言推荐使用dev-c++,软件体积小,好下载。
2 关键字
Int,float,short,double,char,long | 数据类型 |
---|---|
signed | 有符号类型 |
unsigned | 无符号类型 |
void | 空类型 |
struct | 结构体 |
union | 共用体 |
enum | 枚举 |
auto | 声明自动变量 |
const | 一个变量被修饰后值不再变化 |
extern | 全局变量 |
static | 静态变量 |
register | 声明寄存器变量 |
do while | 循环 |
for | 循环 |
if | 条件语句 |
switch case default | |
break | 跳出当前循环 |
continue | 跳过当前,继续下一个循环 |
typedef | 给数据类型换名 |
sizeof | 计算数据类型和变量长度 |
goto | 无条件跳转 |
return | 返回 |
define | 定义 |
3 标识符
给变量起名称,只能用字母、数字、下划线组成,数字不可以打头,注意,要用英文输入法码代码,例:_ab12、a2、a4d
4 注释
// 单行注释
/* */ 多行注释
/*
加法运算
*/
int main(void)
{
int a=3,b=4,c=0;
c=sum(a,b);//求和
printf("和:%d\n",c);
return 0;
}
5 数据类型
6 运算符
7 进制
8 转义字符
9 格式符
10 原码,反码,补码
补码意义:可以将加减乘除运算都当成加运算
如:
3-2=1
3: 0011
2: 0010
-2: 1010 反:1101 补:1110
0011+1110=10001 去掉最高位就是0001,即1
任何数值在内存中的存在形式都是以补码存在
11 函数
函数在主函数上方不用声明,在主函数下方要声明。
#include "stdio.h"
int max(int a,int b);//声明
int sum(int a,int b)
{
return a+b;
}
int main(void) //主函数
{
int a=0,b=0;
a=sum(3,4);
b=max(3,4);
printf("求和:%d\n",a);
printf("大数:%d\n",b);
return 0;
}
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
12 创建新的c文件并引用
新建一个c工程,然后再添加两个文件,名称一样,一个是.c文件,一个是.h文件。(有的工程很大,代码在一个文件看起来会很难受)
13 ASCII
原值 | ASCII对应值 |
---|---|
0 | 48 |
A | 65 |
a | 97 |
14 数组
包前不包后,如array[3],索引值为0—2
数组的地址是首个元素地址
15 枚举
#include "stdio.h"
enum season
{
spring,
summer,
autumn,
winter
};
int main(void)
{
printf("spring:%d\n",spring);
printf("summer:%d\n",summer);
printf("autumn:%d\n",autumn);
printf("winter:%d\n",winter);
return 0;
}
结果
注:如果自己不定义的话,每一个值默认是在前一个值的基础上加1,如果让summer=3,那么autumn=4,winter=5,spring不变
16 指针
指针是重点,指针没学会相当于c语言没学会。
计算机的内存是以字节为单位的存储空间
每一个字节都有一个编号,编号称为地址
*p指针不能直接赋值,只能指向一个地址
成员访问运算符 ‘.’
#include "stdio.h"
int main(void)
{
int a=10,b=0;
int *p;
p=&a; //&是取址符
b=a;
printf("a:%d,p:%d,b:%d\n",a,*p,b);
a=12;
printf("a:%d,p:%d,b:%d\n",a,*p,b);
return 0;
}
结果:
可以发现,*p和a的值一起变化的,而b不行
p是一个指针,指向的是a的地址,那个地址里的值发生变化,自然 *p的值会跟着发生变化
注:
int a=10;
int *p=&a; //对 1
p=&a; //对 2
*p=&a; //错 3
以上三种方式,第三种是错误的
int *p其实是 int * 和 p
#include "stdio.h"
int main(void)
{
int array[]={1,2,3,4,5};
int *p;
int i=0;
p=array;//指向首地址,即第一个元素的地址
printf("p:%d\n",*p);//输出结果为1
printf("========\n");
for(i=0;i<5;i++)
{
printf("p:%d\n",*(p+i));//这里就要求数组和指针定义类型相同
}
return 0;
}
函数指针
#include "stdio.h"
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
int main(void)
{
int (*p)(int,int)=&max; //函数指针 &可以省略
int a=0;
a=p(4,5);
printf("a:%d\n",a);
return 0;
}
17 字符串
#include "stdio.h"
int main(void)
{
char season[]="spring";
char *p;
p=season;
printf("first,%s\n",season);
printf("*p:%c\n",*p);
return 0;
}
#include "stdio.h"
#include "string.h"
int main(void)
{
char a1[]={'1','2','3','4'};
char a2[]={'a','b','c'};
char a3[]={'7','7','7'};
int t=0;
printf("a1:%s,a2:%s,a3:%s\n",a1,a2,a3);
//strcpy(a1,a2);//复制
strcat(a1,a2); //连接
t=strlen(a1); //字符串长度
printf("a1:%s,a2:%s,a3:%s\n",a1,a2,a3);
printf("t:%d\n",t);
t=strcmp(a2,a1); //比较是否相同
printf("t:%d\n",t);
return 0;
}
strchr用法
#include "stdio.h"
#include "string.h"
int main(void)
{
char a1[]={'1','2','3','4'};
char a2[]={'a','b','c'};
char a3[]={'7','7','7'};
char *t;
t=strchr(a1,'2');//返回字符2所在位置的指针
printf("a1:%s,a2:%s,a3:%s\n",a1,a2,a3);
printf("a1:%s,a2:%s,a3:%s\n",a1,a2,a3);
printf("t:%s",t);
return 0;
}
18 结构体
#include "stdio.h"
#include "string.h"
/*
struct students //students相当于给结构体一个分类,毕竟内容不一样需要区分
{
char *ID;
int score;
}student,s2; //student相当于名称
*/
/*
struct
{
char *ID;
int score;
}student;
*/
/*
struct students
{
char *ID;
int score;
};
struct students s1,s2,s3;
*/
typedef struct
{
int english;
int chinese;
int math;
}SCORE;
typedef struct
{
int ID;
SCORE score;
}STUDENT;//将结构体定义成student
void cpy(int ID,int english,int chinese,int math,STUDENT *student)//给结构体赋值
{
student->ID = ID;//这里只能用->,而不能用.
student->score.english = english;
student->score.chinese = chinese;
student->score.math = math;
}
STUDENT s1[10],s2,s3;
int main(void)
{
cpy(123,88,90,100,&s1[1]);
printf("id:%d\n",s1[1].ID );
printf("chinese:%d\n",s1[2].score.chinese);
return 0;
}
如何通过函数给结构体赋值字符串没有解决
#include "stdio.h"
typedef struct
{
char *name;
int id;
}stu;
stu s1,s2;
int main(void)
{
s1.name ="afdjgsas";
printf("name:%s\n",s1.name );
return 0;
}
19 共用体
可以在相同的位置存储不同的数据类型。
共用体的多个数据类型同一时间只能使用一种类型。
共用体占有的内存按最大的数据类型算。
用途:存在两个数据不会同时用,用union会节省空间,少占一份空间
#include "stdio.h"
typedef union
{
int a;
float b;
char c[20];
}data;
data a1,a2,a3;
int main(void)
{
printf("size:%d\n",sizeof(a1));
a1.a =10;
a1.b =20.0;
printf("a1.a:%d\n",a1.a );
printf("a1.b:%10.2f\n",a1.b );
printf("发现a的值出错,b的值正常\n");
printf("=========\n");
printf("下面这种使用方法是正确的\n");
a2.a=20;
printf("a2.a:%d\n",a2.a );
a2.b =30.0;
printf("a2.b:%0.2f\n",a2.b );
return 0;
}
20 typedef
给类型重新定义一个名字。
在51单片机中,经常见:
typedef unsigned char u8;
typedef unsigned int u16;