c语言总结
指针
detail
- 当指针作为一个函数的参数进行传递时,若传递的是p,即指针p存的地址,那么在函数中对p的值进行修改并不会影响原本p的值,因为传递的不是p本身的地址,而是它指向的地址,这实际上是一种值传递。
对于一个指针变量,无论它指向的那个变量占多少字节,它本身都只有4字节
(针对32位系统,64位则占8字节),无论一个地址占据多少字节,它的地址都只用首字节的地址表示- 当一个变量被const定义时,不能通过任何方式修改它的值,即便通过地址进行修改
函数指针
**
定义:返回类型 (指针变量名) (参数列表)*
例如:
声明一个函数指针:
int (*a)(int,int);//指针变量名为a,加括号是为了提升指针的优先级
声明一个返回int指针的函数
int *a(int,int);//函数名为a
使用函数指针
int (*a)(int) = 函数名;//声明一个函数指针并初始化
(*a)(实际参数);//函数调用
detail
- 指针变量名两端的括号不能省略,否则就不是函数指针了,而是一个返回某指针类型的函数声明
- 函数指针不能进行++、–的操作
- 声明函数指针指向某一函数时,参数列表可以不设置类型,c语言会自动根据指向的函数进行匹配,但是存放参数列表的括号一定不能省略
指针作为参数传递
-
当一个指针作为参数进行传递时,属于地址传递,在被调函数中可以通过传递过来的地址
更改值
,且对外界有影响,但是若是针对其地址进行改变
,则和值传递一样,并不会影响原本的地址
//函数声明 fun(int *c,int *a) { //创建一个新数组 int arr[] = {5,4,3,2,1}; //对传递的地址进行修改 c=c+3; //对传递的数组地址进行修改 a=arr; } int main() { int a[4] = {1,2,3,4},*p=a; printf("%d %d\n",*p,a[2]); // 1 3 fun(p,a); printf("%d %d",*p,p[2]); // 1 3 }
二维数组与指针
int arr[5] [5]; arr和arr[0]的地址值相等,但是arr是二级指针类型,arr[0]是一级指针类型 ;
且arr+1也属于二级指针,故而不能使用(arr+1)[0]来获取元素,实际上(arr+1)[0]相当于arr[1],使用了[]之后就是一级指针了,[]能够穿过一层指针,从第二层来到第一层
它的执行顺序为arr[0]+1——>arr+1——>arr[1] ([]与*属于第一梯队,但结合方向为左往右)
,所以**(arr+1)[0]是一级指针类型,而不是arr[1]的第一个元素**,
这部分常考的是利用(arr+n)[m]来误导你进行选择,让人以为是arr[n][m],然后利用n+m越界引起数据错误。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a9G5Uch6-1655471091182)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220611221328276.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bg544X4u-1655471091183)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220614200709829.png)]
数组
不能使用**int arr[]**,必须指定长度
- int arr[10] = {1},只初始化一部分,其余的为0
- int arr[10],此时数组里均为随机值
- 不能使用int arr[5]; arr={1,2,3,4,5},
数组的直接初始化仅在声明时可以
,其他情况都不能够直接初始化 - 声明数组时长度
仅能为常量或常量表达式
:5-3、const或define定义的常量,变量一律不能用作数组的长度
- 若要对字符数组进行字符的赋值,则必须整体赋值,否则后面无法进行直接赋值,因为
字符占2字节
,无法被1字节的char类型接收.若要赋值汉字,要么在定义时初始化,要么使用strcmp函数进行整体赋值
字符串函数
字符复制函数:strcpy(char c1* ,char c2*)
**function&instruction:**strcpy的功能是将c2的地址复制到c1中去,完全覆盖c1原有的数据,使用时c1的长度必须大于等于c2,其返回值为c1的地址
**other explain:**虽然说c1长度必须大于c2,但假设c2比c1长,也是可以完全复制的,输出也不会有问题,只是违背了c1原有的长度,对于程序开发来说这是一种隐 患,故而原则上认为c1必须大于c2,但若从结果来说,3个长度的c1一样能够接收5个长度的c2,且输出为c2的全部字符,不会出现乱码等异常。
部分字符复制函数:strncpy(char c1* ,char c2* ,m)
function&instruction: 将字符串c2的前m个字符赋值到c1中去,其他于前者相同
字符拼接函数:strcat(char c1* ,char c2*)
function&instruction: 将字符串c2拼接到字符串c1的末尾,c2会覆盖掉c1后面的’\0’,c1的长度必须大于等于c1+c2的字符长度,其返回值为完成拼接后c1字符 串地址
**other explain:**the same of strcpy,虽然c1的长度原则上必须足够大,能容纳c1+c2的字符长度,但是并不影响输出,因为c语言没有对下标进行限制,所以是可 以通过连续的地址找到后面的值的,故而使用strcat函数拼接1个长度的c1和3个长度的c2时,c1的长度不足以容纳c1+c2,但是并不影响它输出 c1+c2的拼接字符。
字符串比较函数:strcmp(char c1* ,char c2*)
function&instruction:比较字符串c1与c2的大小,返回一个整数值,c1==c2,返回0;c1>c2,返回正整数,c1<c2,返回负整数。其比较规则对两个字符串为 从左往右逐字比较字符的ascii码值,直到出现(第一个不同字符)或(其中一个字符串结束)为止。
**other explain:**字符串不运行通过关系运算符直接进行比较,例如c1== c2,这是错误的。只能通过strcmp(c1,c2)==0的方式进行比较
分支
switch
switch(a):这里的a可以是任何表达式,但其值必须是整形或可以转化为整形,浮点数不能使用
case 整形表达式:1+2、5*3
总之,结果必须是整形常量
另外,default的位置并不会影响值行
,其后面的case照常值行;还有就是case中
不管表达式是否相同,具体的值只能存在唯一一个
,即3和1+2不能同时存在
switch最喜欢挖的坑:悄咪咪的在switch后面放一个;分号,其次就是switch里面放double类型的常量或变量
switch中break和continue的区别
- 当switch没有外层循环时,在switch中不允许使用continue语句,否则会出现语法错误
- 当switch有外层循环时,在switch中可以使用continue语句,此时continue与break作用相同,都可以跳出switch,但需要注意的是,break控制的对象是switch,而continue控制的对象是外层循环。
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VPA91dNu-1655471091184)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220601110357725.png)]
结构体
概念问题
- 因为结构体类型中的成员是由程序员人为定义的,所以
结构体类型是由我们人为定义的数据类型
- struct是声明结构体的关键字,
不可缺省
- 结构体名是由程序员自己定义的,通过struct将其标识为一个结构体,这样就可以有各种不同的结构体类型,它们和int、double等都属于数据类型,它们不同的是
结构体并非一种固定的类型
,而int、char等属于固定的类型 - 结构体名是结构体的标志,对于
结构体内的成员都要进行声明
,但仅仅是声明了一个类型
,并不会为之分配内存
,就像系统不会为int类型分配内存一样。只有在使用这个类型创建的变量的时候,系统才会为其分配内存
。所以,在声明时不可以对成员进行初始化
,因为不会分配内存。对于结构体类型同样如此
- “结构体类型的声明” 必须放在 “结构体类型定义结构体变量” 的前面
- 结构体类型的变量
不能做加减乘除的运算
,但相同类型的结构体变量可以相互赋值
- 因为结构体变量内有多个成员,所以结构体变量不能单独作为所有成员的整体被引用,只能通过结构体变量来引用单个成员
结构体变量名的首地址就是结构体第一个成员的在内存中的首地址
,虽然它们地址相同,但是类型不一样,所以不能相互替换,虽然有时候某些编辑器会认为&student = student.name,当那只是个别编译器,并不具备通用性。一般情况我们还是使用student.name.- 结构体变量名可以和结构体类型名相同,结构体变量名可以和结构体成员名相同,因为在引用成员时需要通过.来引用,由此可以区分它们
- 在取结构体第一个元素时,
不可使用&结构体变量的形式
,虽然它们地址一样,但取出来的类型和结构体第一个成员类型不同 - 在结构体中,以最大存储空间的数据类型为标准进行字节对齐,当结构体中存在一个数组,最大的数据类型并不按数组来定义标准
- 使用结构体指针,指针类型必须与结构体保持一致,使用结构体指针引用结构体成员变量时必须用->,而不能直接用 . ,如果用 . 必须使用(*p).成员名的形式,且括号不能省略,因为
. 的优先级大于 *
- 结构体变量.成员名 == (*指针变量).成员名 == 指针变量->成员名 == 指针变量[index].成员名
结构体的定义
``方式一:先定义结构体类型,再定义结构体变量`
struct [结构体类型]{
/成员变量/
};
struct [结构体类型] [结构体变量];
//声明一个结构体类型
struct Student{
int age;//成员1
char[10] name; //成员2
};
//定义一个结构体变量stu1
struct Student stu1
方式二:同时定义结构体类型和结构体变量
struct [结构体类型]{
成员1;
成员2;
} stu1,stu2…stun;
struct Student{
char[10];
int age;
} stu1,stu2;
方式三:使结构体类型名缺省,此时在声明结构体时必须同时定义结构体变量
结构体的初始化
结构体只有在定义时才能够一次性全部初始化,像数组那样,如果是定义之后再初始化,同样也只能像数组那样一项一项的赋值。
//声明一个结构体类型
struct Student{
int age;
char name[10];
};
//定义结构体变量
struct Student st = {20,"金木研"};
------------------------------------------------
//声明、定义、初始化一条龙
struct Student{
int age;
char name[10];
}st = {20,雾岛董香};
结构体成员的引用
结构体变量名.成员名
其中,'.'
是成员运算符
,它在所有的运算符中优先级最高
,所以,当使用成员变量名来引用成员时,for example:st.age,可以将其看做一个整体
,在于其他表达式进行运算时。
机构体的中字节对齐
结构体中的所有成员在分配内存时都要与所有成员中占内存最多的数据类型所占内存空间的字节数对齐
有一个需要说明点是:当结构体出现数组时,并不是将数组作为一个整体,而是当做多个类型的数据处理,也就是说,当上一个单位的存储还有而外空间时,数组中的一个元素可以继续往这个空间存储,而不是数组整体开辟空间。
结构体数组
和普通数组一样,其定义方式为
//声明结构体类型
struct Student{
int age;
};
//定义结构体数组
struct Student stu1[10];
---------------------------------------
//也可以直接一起定义
struct Student{
int age;
}student[10];
结构体指针
定义:struct 结构体类型名 * 指针变量名
struct Student{
int age;
char name[10];
};
//定义一个Student类型的结构体指针变量
struct Student *p;
使用结构体指针变量引用结构体成员方式:(*指针变量名).成员名
共用体
datail
- 共用体内所有的成员变量共用一块内存,其内存大小取决于最大的成员变量所占据的内存大小,每个成员都是从低地址开始使用内存单元。
- 因为共用体所有的成员变量使用的是同一块内存,所以对任意一个成员进行修改都会导致其他成员的值发生变化
共用体的字节计算
beacuse of 共用体是所有成员共享一个内存空间,所以这个个空间必须足够大,能够单独容纳每一个成员。共用体的内存大小和结构体一样,都是以最大的数据类型为单位量
,且都按照字节对齐的方式存储
,举个🌰:
union U{
int a;
double b;
char c;
}uu;
上面我们定义了一个共用体,有三个成员变量,其中最大的是double类型,为8个字节,因为共用体是共享存储空间,所以上面的共用体占据的内存大小为8个字节。虽然但是,上面这个例子没有体现到我们上面提到的以最大数据类型为单位量的概念,而且这个字节对齐也没有体现到,下面我们举第二个🌰:
unoin U{
int a;
double b;
char c[10];
}
在这个例子中我们可以看到,最大的数据类型任然是double,占8字节,但是它下面有一个长度为10的数组,按照结构体中的概率,数组相当于10个单独的char类型,但是在共用体里,不能这样做,它们必须看做一个整体,那么这时候8个字节就不够了,那怎么办呢?根据字节对齐的存储方式,这时候我们就需要再开辟一个8字节的空间,这样一来,就有16个字节了,刚好可以单独
存储每一个成员.另外需要强调的一点是,做单位量的只能是最大的数据类型,而不是占字节最大的变量,char类型的数组本质上还是char类型,只能当做1字节看。
共用体的输出
函数
概念问题
- 函数的定义可以放在函数调用的后面,但是声明需要在函数调用前面
- 当函数的返回值是int时,函数类型可以省略
- 一个c程序可以由多个源文件组成
- c的函数是独立的,不能嵌套定义(函数内不能有函数)
- main不可调用
函数形式参数类型说明
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gXDwoZGI-1655471091184)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220604094716656.png)]
关于函数调用中形参的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HqLLJv6C-1655471091185)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220604095116546.png)]
scanf && printf
detail
-
输入时,若%c与前一个输入控制符之间没有空格,则一定不能使用空格或enter键,则在输入%c前的数据之后一定不能使用space键或enter键,因为都会背%c当做字符接收;若**%c和前一个输入控制符之间有空格**,则输入时既可以加space键或enter键,也可以不加,因为只要输入控制符之间有空格,那么系统就会根据你输入的数据自动匹配相应的数据,并且,这种情况下,使用多个空格或回车,都不会影响%c的数据接收。
//有空格的情况 char c1,c2; scanf("%c %c",&c1,&c2); 输入:zz / z z / z z / z回车z / z空格回车 都是能有效被接收的 --------------------------------------------- //没有空格的情况 scanf(“%c%c”,&c1,&c2); 输入:zz 有效 输入:z z / z回车z 无效,第二个字符无法被获取
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9AABKJtw-1655471091186)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220601094454496.png)]
-
常用格式:
printf(“格式控制字串”,输出表列)
;scanf(“格式控制字串”,变量地址表列) -
常用格式字符表
格式字符 功能含义(必须用%d做前导,否则仅是普通字符) d或i 输出有符号int/short类型十进制整数(+号省略) ld 输出有符号long类型十进制整数(+号省略) u 输出无符号int/short十进制整数 lu 输出无符号long十进制整数 o 输出无符号int/short八进制整数(不包括前导0) -
scanf中,只允许设置读取长度,不能设置精度,例如%0.2f,%6.2lf等等,都是不对的
-
printf中,设置输出长度时若数据达不到设置的长度,则默认补空格,正数向右补,负数向左补,小数点和负号以及小数部分均单独算一个长度。例如-3.2的长度为4,假设设置的输出长度为%6f,则需向左补两个空格。
-
%g是自动选择合适的表示法进行输出
,当输出值精度小于10的-4次方时,采用科学计数法,否则采取一般表示法,同时,舍去小数后无效的0
,例如:3.1400000——>3.14; 0.000005——>5e-6另外,关于%g的长度和宽度问题:
%0.2g: 0表示的是数据必须达到的最低长度,若没有达到,默认补空格(正右负左),2表示的是数据的宽度,若该浮点数的整数部分有数值,则2表示这个小数加上一位小数,例如3.222则为3.2.若整数部分没有数值,则按小数部分保留2位,例如0.233333则为0.23;
-
%* d
,忽略此控制符对应的整数,并输出对应的空格数; -
scanf("%4c",&a)
:表示将输入的4个字符放入&a,此时a的值为输入的第一个字符scanf("%4c%4c",&a,&b)
:表示将输入的前4个字符放入&a,输入的后4个字符放入&b因为a,b都只占一个字节,放4个字节会造成内存溢出,所以最后可能看到正确结果, 也可能得到错误结果。例如输入12345678,a,b的结果可能为1和4(可能性不大),也可能为45(可能性较大),
因为a b是连续地址, 第二次把6放进了a里面
-
使用printf输出转义字符,例如printf(“\106”);其结果一定是ascii对应的字符。另外,八进制的转义字符最多只有三位数。
-
格式控制符例题[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tUXFhXsM-1655471091187)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220531111439636.png)]
-
scanf函数不能对浮点数指定精度,但是可以指定宽度,指定宽度时,浮点数宽度只计算小数点之前的
scanf与gets的区别:
- scanf能够控制输入格式,gets无法控制
- scanf中空格会被当做结束,而gets不会,空格也会被当做一个字符,gets除了’\0’和回车以外、其他字符都能接受,包括空格
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2aq2EXOM-1655471091187)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220603105550637.png)]
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugx3JNfQ-1655471091187)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220603105611515.png)]
printf与puts的区别
- printf与puts最大的区别就是puts在输出时,会将最后’\0’转化为’\n’,所以puts是自带换行的
运算符
detail
- ++、–都是向左靠齐的,例如a+++b这个表达式,等价于(a++)+b,因为自增自减都默认从右到左,即左结合。但是当表达式为a+=++b这种形式时,等号左边的要当做一个整体来看待,可以脑补一个括号a+=(++b)
运算符优先级
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gW3GTmR7-1655471091188)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220601095402310.png)]
- 条件运算符优先级仅高于逗号、赋值运算符,所以在条件运算符中使用赋值表达式是错误的
常量
字符串常量
所有的字符串常量末尾自动补'\0'(终止字符)
,该字符不算入有效字符,所以使用strlen计算字符串长度时不包括终止字符
,但是计算字符串的存储大小时则需要算入终止字符,所以使用sizeof计算字符串的字节数时包括终止字符
。- 字符串末尾自动补’\0’是不可逆的,即便当前的字符串为"\0",系统也会自动在’\0’后补’\0’,如若需要判断,可使用sizeof查看字符串长度
字符常量
- ‘\0’与0是完全不一样的两个字符,’\0’的ascii码为0,0为48,空格为32,使用gets输入时,空格就是32,而scanf中空格表示结束,会被自动转化为’\0’
常用数据类型
浮点型
- 默认的浮点数为double类型,若要标记一个浮点数为float类型,需要在小数后面加上F或f。
- 浮点数的默认小数位数为6位,若没有输出宽度限制,输出一个浮点数一定是.000000,例如double b = 3;其值为3.000000;
- float转double,数值不变(存的下),double转float,截取前7位有效数字
整形
- 整数默认的类型是int,long型应使用尾缀L或l
- 将浮点型赋值给整形时,会进行自动转化,舍去小数部分,故不需要单独做强制转化
- char转整型,将char的二进制数传送到低8位,高位补0数值不变;整形转char,截取整形低8位的二进制传送到char中
c语言基本常识(背下来)
-
c语言语句可以分为五类:控制语句、表达式语句、函数语句(函数调用语句)、复合语句、空语句
-
#include、#define、printf均不属于c语言语句
-
数据内存溢出值规律:有符号数,以char为例,其取值范围为-128~127,下例分别为十进制数、补码(负数的二进制形式就是补码)、原码
1111 1111 1000 0000 ——> -128 1111 1110 1000 0001 ——> -127 1111 1101 1000 0010 ——> -126
-
转义字符的范围:八进制的转义字符最大只有三位数,其最大值为’\177’,十六进制的转义字符最大只有两位数,其最大值为\x7f
-
register和auto都属于局部变量,外部变量不能使用,当数据类型为int时可以省略int;extern用于引入其他变量,static只初始化一次,且使用static修饰的全局变量无法被其他文件引入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPRYTD5i-1655471091188)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220605094732489.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oDQvy6P-1655471091189)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20220605094824650.png)]
英语附赠
表否定的词汇(常用于倒装句)
- seldom 几乎不、不常、很少
- never 几乎不、从不
阅读理解常用词汇及短语
- refer 提及、谈到
- which of the following 以下哪一项
- according to the above information 根据以上信息
- probable 很可能、可能的
- such as 比如、诸如、像
- all right 顺利、好、正确的、令人满意的
- all right now 现在好了、现在没事了
- get along with 与…和睦相处、取得进展
- as a matter of fact 事实上
- like that 类似的、像那样的事
- days later 几天后
- in the same way 同样地
- to tell the truth 老实说
- speaking generally 一般来说
- student’ union 学生会
- what’s more 更重要的是
- take a short break 休息片刻
- from the above 综上所述
- conclution 结论
- the closing date 截止日期
- deadline 截止日期
你以为的不可数名词实际是可数名词
- suggestion:建议、提议;当它做这个意思时其实是可数名词
- decision:(做出的)决定;做此意思时是可数名词
- message:(书面或口头的)信息,电邮(或手机)信息;可数名词
不可数名词
- **advice 忠告、劝告、建议; ** 不可数名词
- information 信息、资料、情报; 不可数名词
不及物动词
- disagree 不同意
- agree 同意
虚拟语气
-
**it + is/was + ajd.(vital、necessary、imperative、desirable) + that…**句型中,that从句需要使用虚拟语气should do,should可省略
-
表示主张、命令、建议、要求等含义的动词后接宾语从句一般用虚拟语气,宾语从句应使用should+动词原形的形式,should可以省略,常见的词有:determine,decide,demand,command,insist,propose,order,recommend,request,require,suggest。
-
表示主张、命令、建议、要求等含义的名词被同位语从句/表语从句修饰,一般用虚拟语气,同位语 /表语从句应使用should+动词原形,should可省略
-
if引导虚拟语气
- 对过去的虚拟,主句用would/could/should/might have done,if从句用had done
- ere)**
在 if 引导的虚拟条件状语从句中,如果从句有 were, had(助动词),should,可以省略if 然后将它们置于句首。
-
动词 wish 后的宾语从句中,谓语动词须用虚拟语气,表示与事实相反或不大可能实现的愿望。通常有三种形式:
- ①
对将来发生的事情表示祝愿或愿望时,宾语从句的谓语用would(could, might)+动词原形。:
例:I wish he would try again. 我希望他再试一次。 - ②
表示与现在事实相反的愿望时,宾语从句的谓语用一般过去时或过去进行时。
例:I wish I knew how to program the new computer. 我希望我知道如何给这台新电脑编程。 - ③
对过去发生的事情表示遗憾或后悔时,宾语从句的谓语用“过去完成时
- ①
-
情态动词的虚拟语气用法
should/could have done结构表示本可以/应该做而没有做
-
as if引导虚拟语气
- 过去虚拟:过去完成时
- 现在虚拟:一般过去式
- 将来虚拟:一般过去式
倍数表达法
- A+be+倍数+(形容词/副词)的比较级+than+B
- A+be+倍数+as+形容词/副词/much+as+B
- A+be+倍数+the+size/length/height/weight+of+B
- the+size/length/height/weight+of+A+be+倍数+that+of+B
- A+be+倍数+as+形容词+a(n)+可数名词单数+as+B
- A+be+倍数+as+many/much/few/little+可数名词复数/不可数名词+as+B
主谓一致
-
在one of +复数名词+定语从句结构中,从句一般修饰复数名词,所以从句的谓语动词一般使用复数形式;但如果在one之前有the、the only、the mere、the very等修饰时,从句一般是修饰one的,所以从句的谓语动词应使用单数
-
分数/百分数+of+名词/代词作主语时,谓语动词应与of后面的名词或代词的数保持一致
-
many+a/an+可数名词单数,形式上为单数,但意义上为复数(意为许多xx),若用作主语,其谓语通常与形式一致而不与实际一致(即谓语用三单形式)
-
one、one of、every、everyone、everybody、each、many a、either、neither、no one、nobody、anyone、anybody、someone、somebody;当这些词用作主语或修饰主语时,谓语动词用单数
时态
常见时态标志词
- for+一段时间 :完成时
- Looking位于句首:现在进行时
- since:现在完成时
- so far :现在完成时
- by the time:完成时
时态用法
- 过去完成时:用于过去的过去发生的事情对过去的影响
固定句型
- (it/this/that) is the (best/worst/most/only) … + n. + that从句,that可省略,that引导的从句应使用现在完成时
- 在强调not…until…结构中表示时间状语的until短语或从句时,要使用固定的强调句型:It is/was not until…that…。
- too…to…:太…以至于…,当too前面有否定词时,too后面的形容词意为“不太…;当too前面有only、all、but时,意为“非常…“,相当于very
非谓语
不定式
-
当被修饰词是the first、the second、the last、the best、the only等词时,或被这些词修饰时,常用不定式作后置定语
-
使役动词(let、make、have)、感官动词(see、watch、look at、notice、observe、hear、listen to、smell、feel、find)后面的不定式要省略to,直接接动词原形
-
后面跟不定式的动词:
afford:买得起、负担的起 ask:询问、打听、请求 choose:选择、挑选 endeavor:努力、尽力 desire:渴望、愿望 happen:出现、发生、碰巧 mean:意味着、表示 prepare:使…做好准备 tend:倾向于、往往 aim:瞄准、对准 be:是、有、存在、成为 come:来、过来 determine:决定、确定、使下定决心 help to:有助于、促进 manage to:设法、达成 pretend to:假装 wait to:等待… appear to:好像、出现、似乎 decide to :决定… dare to:敢于… hope to:希望… hesitate to:犹豫、迟疑 offer to:提供、提出 promise to:承诺…答应… wish to:希望…想要… agree to:同意、接受 bother to:费心去… expect to:期待… learn to:得知、学会 ought to:应该 arrange to:安排…、布置… care to:愿意…、喜欢… demand to 要求… elect to:选择… fail to:未能、不能 long to:渴望… plan to:计划…、打算 seem to:似乎…、好像…、看起来… undertake to:承担、承诺、从事
分词
动名词
- 当need、want、require等动词作‘需要’的意思,且前面的主语是指物的名词或代词时,其后应用动名词的主动形式(doing)做宾语,表示被动意义,也可以用不定式的被动式(to being done)做宾语
代词
- another:即可作限定词,也可做代词,意为“另一、又一”,只能用于三个或三个以上的人或物,泛指同类中的另一个,也可用于another+数词+可数名词的结构中,表示“另外几…”
- other:作形容词意为“另外的、其他的”,表泛指,其后常跟名词;也可用于数词+other+可数名词结构中,表示“另外几…”;
- the other:作代词意为两人或物中的第二个,常与one搭配,one…the other 一…另一…
- others:其他人
- it:指同一类的同一个事物
- one:同一类的不同事物
- both 两者都… ;none 没有人、三者或三者以上;either 两者之一;neither:两者都不;all:三者或三者以上都…
定语从句
- 当并列的两个先行词分别表示人和物时,定语从句只能用that引导,而不能用which。
- that、which引导定语从句且在从句中做宾语时,均可省略不写,但当which前有介词时,则不能省略
- 当先行词是the only、the last、the very、形容词最高级、序数词或被这些词修饰时,定语从句只能使用that引导
- 当先行词是all、much、little、few、everything等不定代词或被这些词修饰时,定语从句只能使用that引导
- 当先行词中即有人又有物时,定语从句只能用that引导
- 当主句只有主谓时,且谓语特别短,定语从句可以不挨着先行词,及主句主语做先行词,定语从句位于主句谓语之后。
名词性从句
连接词区分
名词性从句中引导词的确定要根据从句的句子类型,如果从句是陈述句,引导词为 that,如从句是一般疑问句、选择疑问句、反意疑问句,则引导词为 if 或 whether,如果从句是特殊疑问句就用它原来的疑问代词或疑问副词作为引导词。做题步骤:
①分析主句 People crowd into…可知,本题考查宾语从句。②分析从句 cherry trees are blooming 不缺主语或宾语,那就不能填关系代词。③再根据翻译确定关系副词。
宾语从句
- 在含有宾语从句的主从复合句里,若主句用的是一般过去时,则从句也要用相应的过去时态,但当从句表示客观真理时仍可用一般现在时。太阳在东方升起,是一个客观事实。主语是第三人称单数。
当连接词不做任何成分时,表语从句用that引导、且不能省略。
感叹句
- what + a/an + 形容词 + 可数名词单数 + 主谓+(其他成分)
- what + 形容词 + 可数名词复数/不可数名词 + 主谓+(其他成分)
- how + 形容词/副词 + 主谓+(其他成分)
- how + 形容词 + a/an + 可数名词单数 + 主谓+(其他成分)
- how + 主谓+(其他成分)
介词
for & of 的区别
- for sb:常用于表示事物得特征特点,表示客观的形容词。如easy,hard,difficult…
- of sb:一般用于表示人的性格、品德
- ==辨别方法:==用介词后面的代词做主语,前面的形容词做表语,看是否通顺。如 nice of you ——> you are nice 通顺
- for一般与时间段连用,其句子时态多为完成时;
- until意为到…为止,常与延续性动词连用
- among在…之中,…之一
反义疑问句
前肯后否,前否后肯,前后的情态动词或动词需保持一致
1、含有从句的的反义疑问句
- 主句为第一人称:反问从句,忽略主句
- 主句为其他人称:反问主句,忽略从句
倒装句
- As有即使、虽然的意思,能够引导让步状语从句;从句应使用倒装结构:名词不带冠词/adj/adv/动词原形/+as+主+谓
数词
1、基数词的确指与概指
基数词hundred、thousand、million前面有具体的数字修饰时,表示确指,词尾一般不加-s,且不与of连用;当前面没有数字修饰时,表概指,词尾要加s且要与of连用
连词
- but 但是;转折连词,使用该词连接的两句话没有主从关系,是相互独立的两句话,所以不能用引导词去做前半句的先行词引导后半句
比较级
- 形容词/副词的比较级 + than
- more … than …比…更加…
词组/词汇辨析 5
时态 1
同位语从句 1
定语从句 1
词汇/词组辨析 1
同位语从句 1
让步状语从句 1