C语言篇

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分配器

单独总结:

深入编译链接:

单独总结:

深入函数调用堆栈

单独总结:

进程内存模型,虚拟地址空间

虚拟地址空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值