C知识体系:
C语言数据类型,关键字,运算符,表达式,语句
1.类型字节大小(指针在32位和64位)
2.ASCII,UTF-16,UTF-8编码的区别
ASCII码:大小写字母,数字,符号与二进制之间的关系,一个字节,只能表示英文字符
Unicode:2个字节,可变长编码UTF-8,但是浪费空间
UTF-8:1-6个字节,英文字母,汉字,节省空间
3.算数位移和逻辑位移
算数位移和逻辑位移都是:左移右补0,右移左补0,区别为:算数位移要看符号位
4.for和while的区别
从内存考虑:局部变量在栈内存中存在,当for循环语句结束,那么变量会及时被gc(垃圾回收器)及时的释放掉,不浪费空间
如果使用循环之后还想去访问循环语句中控制那个变量,使用while循环
从应用场景:需求明确循环几次,用for
需求不明确的话,用while
5.什么时候用switch比if else高效
switch...case会生成一个跳转表(case最大数+1)来指示实际的case分支的地址,不用遍历分支,只需用索引,适用于分支多
if else比较灵活
6.默认类型转换
7.volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。
数组,函数,指针
《C语言深度剖析》第4,6章
字符串操作
1.字符串常见
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>
//拼接,比较,拷贝,反转,整型字符相互转换,整型输出单个数字
//拼接函数
char *Mystrcat(char *des,const char *src)
{
assert(des!=NULL && src!=NULL);
if(des==NULL || src==NULL)
{
return NULL;
}
char *p = des;
while(*des != '\0')
{
des++;
}
while(*des++ = *src++) ;
return p;
};
//字符串比较
int Mystrcmp(const char *str1,const char *str2)
{
assert(str1!=NULL && str2!=NULL);
int tmp;
while((tmp=*str1-*str2)==0 && *str1!='\0')
{
str1++;
str2++;
}
return tmp;
}
//字符串拷贝
void Mystrcpy(char *des,char *src)
{
int i=0;
for(;*(src+i)!='\0';i++)
{
*(des+i) = *(src+i);
}
*(des+i) = '\0';
}
void Mystrcpy0(char *des,char *src)
{
int i;
for(i=0;src[i]!='\0';i++)
{
des[i] = src[i];
}
des[i] = '\0';
}
void Mystrcpy2(char *des,char *src)
{
while(*src != '\0')//
{
*des = *src;
src++;
des++;
}
*des = '\0';
}
//字符串转整型 "123"->123,"123a4"->123
int Myatoi(const char *str)
{
assert(str != NULL);
int tmp = 0;
while(isdigit(*str))
{
tmp = tmp * 10 + *str - '0';
/*tmp = *str - '0';//error
tmp *= 10;*/
str++;
}
return tmp;
}
//反转字符串 "abcd"->"dcba"
void StrReverse(char *str)
{
char *p ;
for(p=str;*p!='\0';p++) ;
p--;//'\0'不交换
char tmp;
for(;str<p;str++,p--)
{
tmp = *str;
*str = *p;
*p = tmp;
}
}
//整型转字符串 1234->"4321"->"1234"
void Myitoa(char *str,int n)
{
assert(str != NULL);
int i = 0;
if(n < 0)
{
str[i++] = '-';
n = -n;
}
while(n != 0)
{
str[i++] = n%10 + '0';
n /= 10;
}
str[i] = '\0';
if(str[0] == '-')
{
str++;
}
StrReverse(str);
}
char *GetMaxWord(const char *str)
{
char strcur[100];
char strmax[100];
int cur = 0;
int max = 0;
int i = 0;
while(*str != '\0')
{
if(isalpha(*str))
{
strcur[i++] = *str;
cur++;
}
else if(cur > 0)
{
strcur[i] = '\0';
if(cur > max)
{
strcpy(strmax,strcur);
max = cur;
}
i = 0;
cur = 0;
}
str++;
}
//bug
//printf("%s\n",strmax);
return strmax;
}
//给一个整型数字,输出单个数字
void Show(int n)//输出n 483->4 8 3
{
if(n < 10)
{
printf(" %d",n);
}
else
{
Show(n/10);
printf(" %d",n%10);
}
}
int main()
{
Show(12345);
/*char str[20];
Myitoa(str,123456789);
printf("str=%s\n",str);
Myitoa(str,-123456789);
printf("str=%s\n",str);*/
/*char str1[] = "abc";
char str2[] = "abcd";
StrReverse(str1);
StrReverse(str2);
printf("%s,%s\n",str1,str2);*/
/*printf("%d\n",Myatoi("123456789"));
printf("%d\n",Myatoi("12345adf6789"));
printf("%d\n",Myatoi("1adf23456789"));
printf("%d\n",Myatoi("adf123456789"));*/
/*printf("%d\n",Mystrcmp("abcd","x"));
printf("%d\n",Mystrcmp("abcd","abcde"));
printf("%d\n",Mystrcmp("abcd","xyz"));
printf("%d\n",Mystrcmp("abcd","abc"));
printf("%d\n",Mystrcmp("abcd","abcd"));
char str1[10];
strcpy(str1,"abc");*/
//char str1[] = "abcde";//1
//char *str2 = "abcde";//2,字符串常量
//str1[0] = 'z';//3
//str2[0] = 'z';//4
/*char str1[10] = "abcde";
char str2[] = "xyz";
char *p = Mystrcat(str1,str2);*/
/*char *str1 = "abcde";
char *str2 = "xyz";
char *p = Mystrcat(str1,str2);
strcpy(str1,str2);
printf("%s,%s\n",p,str1);*/
return 0;
}
3.字符串匹配算法
单独总结:
4.寻找最长不重复子串
单独总结:
结构体,联合体,枚举,typedef
1.typedef与#define区别
#define预处理命令,进行简单替换,不做类型检查
typedef在编译,一个别名,要加;
2.检测当前的大小端
3.struct与class区别
struct:不面向对象,聚合数据类型
4.struct与union的区别
union:数据格式,能存储不同的类型
5.struct结构体内存对齐问题
struct:注意到最小偏移量的最小整数倍
6.空结构体占的内存,能不能来定义变量,变量有没有地址,多个空结构体变量是线性还是相同的
空结构体:linux:0;windows:1
文件操作
1.外排序(大数据排序)
单独总结:
2.海量数据问题
单独总结:
动态内存开辟
1.malloc与new,delete,free,new[].delete[]问题
单独总结:https://blog.csdn.net/kkkwinter/article/details/81178528
2.pmalloc,tcmalloc
单独总结:
3.内存泄漏与内存非法访问
内存泄漏:用完不归还
内存溢出:你要的内存空间超过了系统实际分配给你的空间
内存非法访问:
4.伙伴系统
单独总结:
5.slab分配器
单独总结:
深入编译链接:
单独总结:
深入函数调用堆栈
单独总结:
进程内存模型,虚拟地址空间
虚拟地址空间