参考书:谭浩强,C程序设计(第4版),清华大学出版社
范围:
顺序程序设计
选择结构程序设计
循环结构程序设计
利用数组处理批量数据
用函数实现模块化程序设计
善于利用指针
对文件的输入输出
写代码
写出主函数(main函数)
C语言是从主函数的第一行开始执行的
C语言中必须有主函数,相当于入口
一个工程中可以有多个.c文件,但是只能有一个main函数
printf 库函数 在屏幕上打印信息的
printf的使用,需要引用头文件(别人写的,使用时候需要打招呼)
代码如下(示例):
#include
int main()
{
printf("hello world\n");
return 0;
}
编译+链接+运行代码
快捷键fn+F11(DEV-C++)
\n代表换行
计算机语言->写程序->解决生活问题
必须有能力来描述生活中的问题
char | 字符数据类型 1字节 |
short | 短整型 2字节 |
int | 整型 4字节 |
long | 长整型 4字节 |
long long | 更长整型 8字节 |
float | 单精度浮点型 4字节 |
double | 双精度浮点型 8字节 |
计算机中的单位:
bit - 比特位 一个二进制位
byte - 字节 = 8 bit
kb - = 1024 byte
mb - = 1024 kb
gb - = 1024 mb
tb - = 1024 gb
pb - = 1024 tb
生活中有些数据是不能变的,有些值是一定可变的,年龄,体重
C语言怎么描述:
常量 - 不能改变的量
变量 - 能被改变的量
%d 整型
%c 字符
%s 字符串
%f float
%lf double
变量分类:局部变量 全局变量
{}外是全局变量 {}内是局部变量
当局部变量和全局变量冲突时,局部优先
不建议把全局和局部的名字写一样的
求两个数的和
#include
int main(){
int a = 0;
int b = 0;
int sum = 0;
scanf("%d %d",&a,&b);
sum = a+b;
printf("sum = %d\n",sum);
return 0;
}
局部变量作用域:变量在哪里可以使用,说明他的作用域就在哪
全局变量作用域:整个工程
执行性的代码必须在大括号里面
如果在一个工程,不同文件里面
需要声明一下 extern 。。。
变量的生命周期:变量的创建和销毁之间的时间段
局部变量的生命周期:进入局部范围生命开始,出去 生命结束
全局变量的生命周期:程序的生命周期
字面常量
“3.14” “abcd”
const 修饰常变量
//num是常变量 具有常属性(不能被改变)
const int num = 10;
int arr[10]={0};//对
const int n = 10;
int arr2[n]={0};//n是变量 这里不对!!!
#define MAX 100
可以一一列举的常量
#include
enum Sex{
//枚举类型的变量未来的可能取值
Male=3,//附初值
Female,
Secret
};
int main(){
enum Sex s = Male;
printf("%d\n",s);//3
printf("%d\n",Male); //3
printf("%d\n",Female); //4
printf("%d\n",Secret); //5
return 0;
}
字符串就是一串字符 用双引号括起来的一串字符
注:字符串的结束标志是一个\0的转义字符。在计算字符长度的时候\0是结束标志,不算作字符串内容。
字符串在结尾的位置隐藏个\0的字符
//里面其实有4个元素 a b c \0
char arr1[]="abc";
//里面3个元素 打印可能会出现乱码
//可以在后面加‘\0’
char arr2[]={'a','b','c'};
printf("%s\n",arr1);
printf("%s\n",arr2);
//求一下字符串的长度 string length
printf("%d\n",strlen(arr1));//3 求长度不算\0
printf("%d\n",strlen(arr2));//随机值 c向后一直找\0
转变了它原来的意思
printf("C:\test\test.c") ;
//输出:C: est est.c
printf("C:\\test\\test.c") ;
//输出:C:\test\test.c
printf("ab\ncd");
//\n 转变为换行
printf("%c\n",'\130');
//八进制的130是十进制的X
//X ---ASCII码值是88
printf("%c\n",'\x30');
//0 ---ASCII码值是48
转义字符 | 释义 |
---|---|
? | 在书写连续多个问号时使用,防止他们被解析成三字母词 例:??)解析为 ] |
\‘ | 用于表示字符常量’ |
\ " | 用于表示一个字符串内部的双引号 |
\ \ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,峰鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 tab键 |
\v | 垂直制表符 |
\ddd | ddd表示1-3个八进制数字 |
\xdd | dd表示2个十六进制数字 |
例题:
printf("%d",strlen("c:\test\328\test.c"));
//答案:14
\t算一个 \328不能算一个,因为八进制数中不能出现8.所以算\32和8
int main(){
int input=0;
printf("好好学习(1/0)?");
scanf("%d",&input);
if(input ==1)
printf("上岸\n");
else
printf("失败\n");
return 0;
}
int main(){
int line = 0;
while(line<100){
printf("写代码:%d\n",line);
line++;
}
if(line = 100){
printf("上岸");
}
return 0;
}
正常写法
int main(){
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d%d",&num1,&num2);
//scanf里面不能加\n
sum = num1 + num2;
printf("%d\n",sum);
return 0;
}
函数写法
int Add(int x, int y){
int z = 0;
z = x + y;
return z;
}
int main(){
int num1 = 0;
int num2 = 0;
scanf("%d%d",&num1,&num2);
//scanf里面不能加\n
int sum = Add(num1,num2);
printf("%d\n",sum);
return 0;
}
数组 --一组相同类型的元素的集合
//10个整形 1-10 存起来
//数组是用下标来访问的
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
char ch[5] = {'a','b','c'};//不完全初始化,剩余的默认为0
int i = 0;
while(i<10){
printf("%d\n",arr[i]);
i++;
}
return 0;
算数操作符 | + - * / % |
移位操作符 | >> << |
位操作符 | &(按位与) |
赋值操作符 | = += -= *= /= ^= |
单目操作符 | ! - + & sizeof ~ – ++ (类型)强制类型转换 |
逻辑操作符 | && 逻辑与 II逻辑或 |
条件操作符 | exp1 ? exp2 :exp3 |
//算数操作符
int a = 9/2;
float b = 9/2;
float c = 9/2.0;
int d = 9%2;//取余数
printf("%d",a);//4
printf("%f",b);//4.000000
printf("%f",c);//4.500000
printf("%d",d);//1
//移位操作符
int e = 2;
int f = e<<1;//左移操作符,移动的是二进制位
printf("%d",f);//4
//0表示假,非0就是真
int arr [10]={0};
printf("%d\n",sizeof(arr));//40
//计算的是数组的总大小,单位是字节;
printf("%d\n",sizeof(arr[0])) ;//4
int sz = sizeof(arr)/sizeof(arr[0]);
printf("%d\n",sz);//10
int a = 0;
printf("%d\n",~a);// -1
//~是按位取反
//把所有二进制位中的数字,1变成0,0变成1
// 0的二进制是32个0
// 整数在内存中存储的是补码
//一个整数的二进制表示有三种:原码,反码,补码
// 正整数:原码、反码、补码相同
//符号位不变,其他位按位取反叫反码
// 反码加一是补码
int a = 10;
int b = ++a;//前置++ 先++ 后使用
int c = a++;//后置++ 先使用 后++
printf("%d\n",b);//11
printf("%d\n",a); //12
printf("%d\n",c); //11
return 0;
int a = 0;
int b = 3;
int c = 5;
int d = (a=b+2,c=a-4,b=c+2);
// a=5 c=1 b=3
//逗号表达式,从左到右依次计算
//整个表达式的结果是最后一个表达式的结果
printf("%d",d);//结果为3
关键字不能做变量名
break case const continue default do
extern float goto if register(寄存器关键字)
1.内存是怎么编号的?
32位 — 32根地址线 — 物理线 — 通电 —1/0
电信号转换成数字信号:1和0组成的二进制序列 例如:32个0 32个1 作为内存编号
共有2的32次方个序列作为内存编号,并将编号称为内存单元的地址。
2.一个这样的内存单元是多大空间?
2的32次方个内存单位
一个内存单位占1byte(字节)
指针就是地址
指针大小是相同的,指针是用来存放地址的,指针需要多大空间取决于地址的存储有多大
32位 32bit 4byte
64位 64bit 8byte
int main ()
{
int a = 10;
printf("%P\n",&a);//%p专门用来打印地址
int * pa = &a;//pa用来存放地址的,在c语言中pa叫指针变量
//* 说明pa是指针变量
// int 说明这个pa执行的对象是int类型的
*pa = 20//* 解引用操作 *pa就是通过pa里面的地址找到a 将a改成20
char ch = "w";
char * pc = &ch;
return 0;
}
结构体使得C语言有能力描述复杂类型
比如描述学生,学生包括 :姓名+年龄+性别+学号 这几项信息
//学生
struct Stu
{
char name[20];//成员变量
int age;
double score;
}
//书
struct Book
{
char name[20];
float price;
char id[20];
}
int main()
{
struct Stu s = {"zhangsan",20,90};//结构体的创建和初始化
printf("1:%s %d %lf\n",s.name,s.age,s.score);
//结构体变量.成员变量名
struct Stu * ps = &s;
printf("2:%s %d %lf\n",(*ps).name,(*ps).age,(*ps).score);
printf("3:%s %d %lf\n",ps->name,ps->age,ps->score);
//结构体指针->成员变量名
return 0 ;
}