------------------------预祝考试顺利,成功上岸------------------------
//--------------理论部分--------------//
一、进制转换
1、八进制:以0作为八进制数的前缀,取值为0~7,例如:
012(八进制) --> 十进制:2*8^0+1*8^1=10
023(八进制) --> 十进制:3*8^0+2*8^1=19
换算方法:
例如八进制012,换成十进制为:第一位数2乘8的零次方+第二位数1乘8的一次方等于10
2、十六进制:前缀为0X或0x作为十六进制的开头,取值为0~9,A~F或a~f,例如:
0x09(十六进制)--> 十进制:9
0x0C(十六进制)--> 十进制:12
0x3B(十六进制)--> 十进制:11*16^0+3*16^1=59
换算方法:
例如十六进制0x3B,B是11,换成十六进制为第一位数B乘16的零次方+第二位数3乘16的一次方,等于59
二、数据类型及常量变量
char | 1字节 |
short | 2字节 |
int | 4字节 |
long | 4字节 |
long long | 8字节 |
float | 4字节 |
double | 8字节 |
1、sizeof 是关键字,是操作符,用于计算类型或者变量所占空间的大小
2、被const修饰的变量是不能改的,称为常变量. 其本质还是变量
3、#define 定义的标识符常量不可更改
4、字符串在结尾的位置隐藏了一个\0的字符,求字符串长度时不会计算\0,字符串的结束标志是\0
char dog[] = "wang\0miao";
求字符串大小:printf("%d\n", sizeof(dog)); //输出结果是10,分别是:w a n g \0 m i a o \0
求字符串长度: printf("%d\n", strlen(dog)); //输出结果是4,因为遇到\0结束
5、#define定义常量的使用易错点:
#define MAX(x,y) (x)>(y)?(x):(y)
main()
{
int a = 5, b = 2, c = 3, d = 3, t;
t = MAX(a+b,c+d) * 10;
printf("%d\n", t);
}
在该代码中,t=MAX(a+b,c+d) * 10,其实是t=(a+b)>(c+d)?(a+b):(c+d)*10
所以最终结果是7
三、转义字符
\n 换行
\\ 反斜杠,转义\
\ddd ddd表示三个八进制的数字 打印出来的是转换为十进制数对应的ASCII码值的字符
\xdd dd表示两个十进制的数字
易错点:
printf("%c\n",'\109'); //9不属于八进制,所以不在\ddd转义字符当中
所以只有\10被转义
四、操作符与关键字
1、=是赋值运算符,==是关系运算符
if(x==1) 正确写法
if(x=1) 错误写法
2、float a =9 / 2;
a的结果是4;想要得到4.5,需被除数或除数任意一个加上小数点,如:
float a =9 / 2.0;
3、sizeof 是一个单目操作符 不是函数
4、前置++ , 先++,后使用。后置++,先使用,后++。
例如:
前置++
int a = 10;
int b = ++a;
printf("%d\n", b);
//b等于11
后置++
int a = 10;
int b = a++;
printf("%d\n", b);
//b等于10
5、强制类型转换的写法是:
float a = 3.14;
int b = (int)a;
printf("%d",b);
//b的结果为3
6、条件操作符(三目操作符)的写法是exp1 ? exp2 : exp3
exp1成立,exp2计算,整个表达式的结构是 exp2的结果
exp1不成立,exp2不计算,exp3计算,整个表达式的结构是 exp3的结果
7、逗号表达式,是从左向右依次计算,整个表达式的结果是最后一个表达式的结果
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\n", d); //d结果为b=3
8、define和include 不是关键字,是预处理指令
五、选择循环语句
1、不能单独在switch语句中使用continue!
2、while 循环可能一次都不会执行;do...while循环至少执行一次。
3、c语言的三种基本结构是:顺序结构、选择结构、循环结构。
4、switch语句中case后必须是整形常量表达式。
5、switch语句中如果没有break,程序进入后会一直运行下去。
6、switch语句中超出switch范围的数可以用default来提醒,default所在位置没有规定。
7、在while循环中,break用于永久的终止循环;continue的作用是跳过本次循环。
六、函数
1、strcat(s1,s2) 将字符串s2追加到字符串s1后面,s2不变
2、strcpy(s1,s2) 将字符串s2复制给字符串s1,字符串s1变为字符串s2的内容,s2不变
3、strcmp(s1,s2) 将字符串s1与s2进行比较,自左向右对字符的ASCII码逐个比较,若s1等于s2则返回0,若s1大于s2则返回一个正数,若s1小于s2则返回一个负数
4、strlen()函数 求字符串长度,遇到结束符'\0'为止
5、实参和形参:
(1)定义函数时,系统不会给形参分配存储单元,形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
(2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
(3)实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。
(4)函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
6、函数不可以嵌套定义,但是可以嵌套调用
7、printf()的返回值是打印在屏幕上的字符个数(太偏不考)
8、当自定义函数写在主函数后面的时候,需要在主函数前面或者使用函数前声明该函数
七、数组
1、定义数组时,括号内是[常量表达式],不能是变量。
错误写法:int n = 8; int arr[n];
2、[]是下标引用操作符
3、数组名是数组首元素的地址
4、在二维数组的创建与初始化中,行可以省略,列不可以省略!
八、指针
1、指针指向位置不可知时被称为野指针
2、指针减指针的运算得到的是两个指针之间的元素个数
3、给指针变量赋值时,要将一份数据的地址赋给它,不能直接赋给一个整数
九、结构体与共用体
结构体:
struct stu
{
char name[10];
int age;
char id[11];
double score;
}stu1;
1、struct是关键字 ,stu是结构体名,stu1是结构体变量。
2、对结构体成员赋值时,对字符串类型的赋值需要使用strcpy()函数,例如:
strcpy(stu1.id, "111222");
3、求结构体的大小:最大类型的整数倍
如上述结构体中,最大类型为double类型,所以需要以8为基础,对内存中的数据存放:
char name[10]占10字节,放10个1
int age占4字节,放一个4
char id[11]占11字节,放11个1
double score占8字节,放1个8
由图可知,共占用5行,故5*8=40
运行结果如下:
4、求结构体+共用体大小
union data
{
int a;
char c[17];
double b;
}u1;
struct stu
{
int id;
char name[9];
double socre;
union data u1;
}stu1;
int main()
{
printf("%d", sizeof(stu1));
return 0;
}
结构体的大小依旧是如上方法计算:
4 1 1 1 1
1 1 1 1 1 (1) (1) (1)
8
结构体大小为3*8=24
共用体大小计算:最大类型的整数倍,所有成员共用一段内存
char c[17]占了17个字节,double类型8字节,需要3*8=24字节才能放得下char c[17]
所有共用体u1的大小是3*8=24
所以上述代码中,结构体+共用体大小的大小是24+24=48
运行结果为 48
十、文件
fopen() 文件打开函数
fclose() 关闭文件函数
fputc() 文件写函数,把一个字符写到指定函数中
fgetc() 文件读函数,从指定文件读取一个字符
feof() 判断读取的文件是否读完的函数,未遇到结束标志时,feof()函数返回值为0;否则feof()函数返回值为1
------------------后续内容接下文:C语言考试知识点汇总(实践知识点)------------------