C语言易忘知识点以及常见问题
目录
五、字符串相关函数(gets在C11标准中去除了,部分学校机试不可用)
一、整型常量的不同进制表示
1.零碎知识
①int类型为4字节,32位2进制,最高位为符号位,0为正数,1为负数;
②十进制转换二进制,不断除2,得商继续除,余数为对应2进制位,从低到高
二、运算符
1.逻辑非 (!) > 算术运算符 > 关系运算符 > 逻辑与 (&&) 和逻辑或 (||)
2.sizeof不是函数,是运算符
3.|| 和 &&有需要注意的,当 || 左边的式子为真时,不执行右边的表达式,当 && 左边的式子为假时,不执行右边的表达式。
三、数组
1.数组传参给子函数时,形参获取的是首地址(指针),无法在子函数里面用sizeof(数组名)语句获取数组中存放的数据的真正大小,因为真正获取到的是指针的大小(8字节)。
2.scanf函数读入字符数组时,遇到空格会停止输入。
四、解决scanf函数缓冲区吃回车问题
简单粗暴的方法:
fflush(stdin);//直接清空标准输入缓冲区,让scanf没机会偷吃回车
五、字符串相关函数(gets在C11标准中去除了,部分学校机试不可用)
1.strlen函数
计算字符串长度,该返回值为长度值(其中不包含字符串的结束符“\0”)
2.strcat函数与strcpy函数(这两个函数的第一个参数不得为字符串常量!!!,原因是都会把操作后的值给到第一个参数,而字符串常量没有地址,所以不行)
①strcat函数直接拼接第二个参数到第一个参数后面。
②strcpy复制替换(切记,是完全替换,就算被替换的字符串比替换的字符串长,其比它长出来的部分也会消失,如char a[5] = "abcd", char b[2] = "e", strlen(a, b),结果a数组变成"e",a比b长的部分"bcd"会消失,也就是说,b复制到a上,不仅是相同的长度对应字符会被替换,原字符串长出来的部分也会被替换为无)
3.strcmp函数
比较两个字符串的大小(原理是按每位字符的ASCII码比较大小,也可以简单理解为,按学习中的字典顺序,排得越后则越大),第一个参数的字符串大,则返回值为1,相等为0,小则为-1)
六、指针
1.指针大小问题,若程序为64位,则寻址范围为64位即指针大小为8字节,若程序为32位,则寻址范围为32位即指针大小为4字节
2.malloc动态内存申请。
①用malloc函数可以申请空间。用法为,先定义指针变量,然后敲入语句:指针变量 = (需要的指针类型)malloc(需要的大小),然后就能获取了。需要头文件stdlib。
字符型空间例子:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char *c;
c = malloc(4);//多一位存结束符
c = "abc";
printf("*c = %s\n", c);
return 0;
}
运行结果:
整型空间例子:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int *c;
c = malloc(4);//int一个数即占4个字节,先只给一个
c[0] = 1; //只有一个整型数据,只能赋值一个
printf("*c = %d\n", *c);
return 0;
}
运行结果:
②注意void指针类型不能偏移、如果是字符型指针,malloc要多给一位长度用来存结束符/0。
七、结构体
1.结构体大小不是由成员总和,而是有对照最大成员对齐的规则。
八、中级知识(与数据结构相关)
1.栈从0开始,一次栈满是maxsize - 1.
2.队列
①循环队列队头队尾初始为0,队头为队头元素,队尾为队尾元素后一位
②链表队列队头队尾初始为NULL,队头指向第一个元素,队尾指向最后一个元素