第一章:
1.在一个源程序中,main函数的位置可以是任意的位置
2.源程序必须经过,编译,连接处理后才能被计算机执行
3.一个变量代表:内存中的一个存储单元
4.结构化程序:1.顺序结构 2.选择结构 3.循环结构三种构成
5.各种进制之间的相互转换
第二章:
1.关键字:
C语言中的关键字分为两类1.数据类型 2.流程控制
2.用户标识符:
C语言中用户标识符:只能由数字,字母,下划线组成,且数字不能开头,而且不能以关键字作为用户标识符
八进制和16进制
八进制:以数字0开头,如032表示八进制
16进制:以0x开头,如0xff表示一个16进制
%的用法
关于"%"记着只能用于整数之间的计算就好了,不能用于浮点数(实型)计算
字符理解
对c2=‘A’+‘6’-‘3’的计算,要知道’6’-‘3’=3,而不是字符’3’
对char c=‘\72’,这个的理解是\72转为八进制,得到一个数,再比对ascll表,得到那个字符,只有一个字符
对char c=‘\x72’,这个理解是转为16进制,再同理找ascll码
对char c=‘72’,这就是直接10进制,再同八进制
ascll码必须是八进制或者是十六进制,不能为十进制
对char类型数据在内存中的存储形式是ASCLL码.
逗号运算符
逗号表达式的运算过程为:从左往右逐个计算表达式。 (2) 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。 (3) 逗号 运算符 的优先级别在所有运算符中最低
绝对值
abs、fabs、fabsf三个函数都是用来求一个数的绝对值,区别如下:
1)int abs(int a); // 处理int类型的取绝对值
2)double fabs(double a); //处理double类型的取绝对值
3)float fabsf(float a); //处理float类型的取绝对值
都是用来求绝对值的
字符串
1.c语言中没有字符串变量
2.字符串所占有的字节数总是比它的长度大一,字节数中多了一个\0
位运算
1.与&运算,9&5=1,将9和5换为二进制再与起来
2.或|运算
3.异或运算,9^5=12,分别拆成二进制之后,不同为1,相同为0
4.按位取反,~9=-10,计算机中的数据是按照补码来储存的,正数的补码和原码一样
5.左移<<,3<<4是指把3左移四位,空位补0
6.右移>>,3>>4把3右移四位,一样补位为0
第三章:
输入输出
c语言中没有输入输出语句,所有输入输出都是调用库函数来完成的,现在我们来总结一下各种输入输出的库函数以及用法
1.putchar(单个字符输出函数) 输出单个字符到显示器上面,每次只能输出一个字符
如putchar(‘A’),把A放到显示器上,putchar(‘a’+1) 此时输出b
2.getchar函数 (在计算机中看得到字符的函数) 读入用户在键盘中输入的一个字符
如char A; A=getchar(); 此时用户输入一个a,则 A=a
注意的是如果输入abc,A还是为a,getchar每次只能得到一个字符,且可以为回车字符
3.printf函数,记住常用格式字符串就行
%d,%o,%x
%u(unsign表示无符号十进制整数)
%ld(long十进制)
%f(单双都可以,这里注意跟scanf进行区别)
%e(以指数来输出单双实数)
%g(表示自动选择较小的那个%f,%e)
%c,%s(字符串)
4.scanf函数,同样记住常用的格式字符串
%d,%hd,%ld(分别表示短整数和长整数),
%o,%x
%i(全能,十进制八进制16进制都可以)
%u
%f,%e(只能是单精度的实数float,注意和printf区分)
%lf,%le(只能是双精度的double)
%c,%s
注:严格注意格式化输入,中间是逗号还是空格,需要注意
常见数学函数运用
sqrt(x),x为取的算术平方根
exp(x),为e的x次方
pow(x,y)为x的y次方
逻辑运算符
或与非三种逻辑运算(&&,||,!)
在逻辑运算中有一种方法很关键,那就是短路操作,在逻辑运算中或||运算前面为真则后面的运算式都不会进行,类似的在与运算中&&前面已经判定为非是后面的表达式也不会继续运算。
第四章
if语句
if语句中必须要有一个子语句,语句可以为空。
else if和else都不可以单独使用,必须跟一个if语句
分析程序:首先找到else,else总是跟前面最近的if进行配对,分析问题从外到内
switch语句
在switch语句中,case里面记得带有break,case更像一个书签。如果没有break会继续向下执行直到执行完所有的情况。
第五章
while和do while,for三循环
while语句中的表达式可以是任何类型的表达式,不必多说
for循环,for循环中三个空格都是可以省略的,省略第二个表示循环永真,省略第三个表示不执行表达式三直接进行表达式2来判断真假,省略表达式1就直接进入表达式2。
表达式1一般定为开始,二为终止条件,三为每次循环条件。
continue 和break,return
continue表示跳出本次循环,break直接跳出整个循环,return 跳出整个函数
第六章数组
数组定义时不能用变量进行定义只可以用常数
数组内容不足时会自动补充0元素
操作数组
1.删除某个数组下标,从该下标开始数组整体向前移动,数组个数减少一个
2.在数组中插入某个元素,移动整体数组,从最后一个元素开始移动,以此向后移动,如a[5]={1,2,3,4,5};,在2之前加一个8变成a[6]={1,8,2,3,4,5};以a[6]为基准
for(i=5;i>=2;i–),数字2下标为2,b[i]=b[i-1],b[1]=8;
3.素数的断定
判断50到100之间的素数
int b[50],n,i,j=0;
for(n=50;n<=100;n++)
{
for(i=2;i<n;i++)
{
if(n%i==0)break;//先确定不是素数,确定不是素数直接跳过就行
if(n==i)b[j++]=n;
}
}
printf("素数")
4.处理数组中存在的相同数字
int main()
{
int a[10] = { 1,1,2,2,3,3,4,4,5,5 };
int flag = -1, i, j=0,n;//设置标志
for (i = 0; i < 10; i++)
{
if (a[i] != flag)
{
a[j] = a[i];
j++;
flag = a[i];
}
}
n = j;
}
5.二分法查找数据
6.二维数组
第七章和第八章函数与指针
1.函数返回值
被调函数的返回值有两种返回方式
一.通过return进行返回,c语言中函数返回值只能有一个
二.通过地址进行返回,在被调函数中如果形参中有指针变量,那么被调函数结束后指针变量的改变会返回给主调函数。
如 void fun(int m,int*p)
int m=2;p=m;
这样传给intp的那个变量会改变
2.函数返回值的类型
如:int* fun(int m,int*p),表示函数返回值类型是一个指针,指针的类型是int类型
当return m和前面函数形式有冲突以函数前面的类型为准,如:m为double,但函数是
int fun()这种的,m直接转为int类型
3.函数指针
直接用指针的形式来调用函数
如现在有函数int fun(int m,int n),指针函数定义形式为int (*p)();
p=fun,z=p(a,b)直接进行调用就可以
4.指针和数组
现有int a[10],*p;
p=a;这样是可以的
a=p;这样不行,a不可以被更改
a为数组名可以认为是一个假象的指针,注意a是不能更改的
两个指针的加减表示中间数据元素的个数
语法糖的使用就不多说
5.行指针和二维数组
现有int a[3][4],注:二维数组中列数是不可以被忽略的,所以列数是很重要的这在行指针中也能体现出来
int(*p)[4],这是行指针的定义,p=a,此时a与p是等价的,注意行指针后面必须是4需要跟a保持一致要不然会直接出错
行指针的设计就是专门为二维数组服务的,注:只能为二维数组服务
6.二级指针和指针数组
现有二级指针int **p,和指针数组int *q[5]
指针数组表示给定一个5元素的数组每个元素都是一个指针保存一个地址,二级指针服务于指针数组
7.字符串指针和字符串数组
给定一个字符串数组 char a[]=“abc123”,该字符串长度为6,字节数为7.
在给定一个字符串指针char *p,p=a,指针p指向字符a,当我们解引用p时,会一直输出直到找到字符串中的\0,如果是char a[]={‘a’,‘b’,''c}这样是没有\0的这样的char a[]我们不认为是字符串而是当一个数组用。
输入输出字符串的方式
输出:
printf(“%s”,p);需要注意的是这是printf唯一特别的,后面需要跟一级地址会从p指向的地方一直输出到\0
puts§,跟前面的printf几乎一样,唯一的一点区别是会自带换行功能\n
输入:
scanf(“%s”,a);使用scanf时需要注意的是,当从键盘中输入了空格和回车键都会暂停输入
gets§同scanf函数不同的是空格不会暂停输入,只有回车会停止
如输入“iphone 5”,用scanf就只能看到iphone 空格会进入缓存区,再用gets就会得到 5s
8.字符串处理
找到字符串的\0:while(*p) p++;此时p指向\0
在平常计数时,通常可以用变量的正负变换来处理
在处理字符串时一般用指针来处理
strlen(地址):统计字符串长度一直找到\0
strcat(串1地址,串2地址):1=1+2,将两个字符串直接进行连接
strcpy(1地址,2地址);1=2复制
strcmp(1地址,2地址);比较用的,1>2,则返回值大于0
1<2,返回值<0,1=2,返回值等于0
char 的二维数组字符串处理a[3][9],表示a中可以存三个字符串
第九章结构体和联合体
1.结构体之间允许彼此直接赋值,如boy1=boy2
2.typedef运用
typedef struct student
{
int age;
char sex;
}Stu;
是直接用str进行替代了struct student
struct student
{
int age;
char sex;
}st1,st2;
表示直接定义了两个变量。
还有结构体指针和变量名的运用,在此就不多说
3.共用体
union un
{
int i;
char c;
double d;
}ul;
共用体所有的东西都公用里面最大的,sizeof(union un)=8,sizeof(ul)=8
4.动态分配
会常用于链表创建
常用两个方法
1.malloc如:p=(int*)malloc(sizeof(int))
2.calloc如p=(int*)calloc(n,size),n为分配的块数,size为大小,字节总数为n*size
3.free§是指删除掉p指针指向的空间,后面通常跟p=0
5.链表创建