总结
前端资料汇总
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
-
框架原理真的深入某一部分具体的代码和实现方式时,要多注意到细节,不要只能写出一个框架。
-
算法方面很薄弱的,最好多刷一刷,不然影响你的工资和成功率😯
-
在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。
-
要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!
喜欢这篇文章文章的小伙伴们点赞+转发支持,你们的支持是我最大的动力!printf("%d ",n%10);
}
int main()
{
int num = 0;
scanf("%d",&num);//1234
print(num);
}
### []( )回调函数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//void qsort(void *base, //base中存放的是待排序数据中的第一个对象的地址
// size_t num, //排序数据元素的个数
// size_t size,//排序数据中一个元素的大小,单位是字节
// int (cmp)(const void,const void*)//是用来比较待排序数据中的2个元素的(一个)函数
// );
int cmp_int(const void* e1,const void* e2)
{
return *(int *)e1-*(int *)e2;//因为参数类型是void,我们用(*int)强制类型转换
/*返回值 意义
<0 所指向的元素在所指向的元素之前p1p2
0 指向的元素等效于 指向的元素p1p2
>0 指向的元素位于 指向的元素之后p1p2
*/
}
void print(int arr[],int sz)
{
int i= 0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void test1()
{
//整形数据的排序
int arr[]={9,8,7,6,5,4,3,2,1,0};
int sz=sizeof(arr)/sizeof(arr[0]);
//排序
qsort(arr,sz,sizeof(arr[0]),cmp_int);
//打印
print(arr,sz);
}
struct Stu
{
char name[20];
int age;
};
int sort_by_age(const void* e1,const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;//转换结构体类型指针,e1指向age成员
}
void test2()
{
//排序结构体数据
struct Stu s[3]={ {"zhangsang",30},{"lisi",34},{"wangwu",20}};
int sz=sizeof(s)/sizeof(s[0]);
//按照年龄来排序
qsort(s,sz,sizeof(s[0]),sort_by_age);
}
int sort_by_name(const void* e1,const void* e2)
{
return strcmp(((struct Stu*)e1)->name ,((struct Stu*)e2)->name);
}
void test3()
{
//排序结构体数据
struct Stu s[3]={ {"zhangsang",30},{"lisi",34},{"wangwu",20}};
int sz=sizeof(s)/sizeof(s[0]);
//按照名字来排序
qsort(s,sz,sizeof(s[0]),sort_by_name);
}
int main()
{
//test1();
//test2();
test3();
return 0;
}
* * *
[]( )数组
--------------------------------------------------------------
* 数组的长度单位是常量表达式表示
* 数组在内存中连续存放的,
![请添加图片描述](https://img-blog.csdnimg.cn/b85453b4db1f4167b4ce444cef5de561.png)
int n =10;
int arr[n]={1,2,3,4,4,};//error
* * *
### []( )下标
> 如果下标是从那些已知正确的值计算得来,那么就无需检查它的值。如果一个用作下标的值是根据某种方法从用户输入的数据产生而来的,那么在使用它之前必须进行检查,确保它们位于有效的范围之内。
[]( )指针
==============================================================
### []( )指针,间接访问和变量
![请添加图片描述](https://img-blog.csdnimg.cn/796c8cad2dce4df99b845d5699c2b553.png)
#include<stdio.h>
int main()
{
int a=7;
int *d = &a;
*d = 10-*d;//*d==a -- a=10-a(7)
//d= 10- *d;//err,因为d是个指针变量
//整形变量不能存储一个指针变量
*&a=*d;//说明变量a==*d,不建议这种表达式
printf("a==%p \n",a);
printf("*a==%p \n",*d);
printf("d==%p\n",d);
printf("&a==%p\n",&a);
return 0;
}
### []( )函数指针
void test(int **p2)
{
**p2=20;
}
int test_p(int x,int y)
{
return x+y;
}
#include<stdio.h>
int main()
{
int a =10;
int * pa=&a;//pa是一级指针
int **ppa=&pa;//ppa是二级指针
//二级指针传参
test(ppa);
test(&pa);//传一级指针的地址
int* arr[10]={0};
test(arr);
printf("%d ",a);
//pf函数指针变量
int (*pf)(int ,int )=&test_p;
return 0;
}
int Add(int x,int y)
{
return x+y;
}
#include<stdio.h>
int main()
{
//int (*pf)(int,int )=&Add;
int (*pf)(int,int )=Add;//Add == pf
//int ret=(Add)(3,5);//3
//int ret=(*pf)(3,5)//1 ;*是摆设,可以int ret=(*****pf)(3,5)结果依然正确
//int ret=*pf(3,5)//err;优先级 pf会先和(3,5)结合,任何*对函数的返回值8解引用肯定会错
int ret = pf(3,5);//2
printf("%d ",ret);//
return 0;
}
### []( )函数指针数组
int add(int x,int y)
{
return x+y;
}
int sub(int x,int y)
{
return x-y;
}
#include<stdio.h>
int main()
{
int (*pf1)(int ,int)=add;
int (*pf2)(int ,int)=sub;
int (*pfarr[2])(int ,int )={add,sub};//pfarr就是函数指针数组,{}里可以是pf1,pf2,*注意是花括号
//add函数和sub函数的形参因为一样,内存存放也是一样,而数组前提就是内存类型一样;
//所以可以同数组存放到函数指针,故叫做函数指针数组。
return 0;
}
### []( )函数指针数组的使用
#include<stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("**************************\n");
printf("**** 1. add 2. sub ****\n");
printf("**** 3. mul 4. div ****\n");
printf("**** 0. exit ****\n");
printf("**************************\n");
}
int main()
{
int input = 0;
//计算器-计算整型变量的加、减、乘、除
//a&b a^b a|b a>>b a<<b a>b
do {
menu();
int x = 0;
int y = 0;
int ret = 0;
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入2个操作数>:");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("ret = %d\n", ret);
break;
case 2:
printf("请输入2个操作数>:");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("请输入2个操作数>:");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("请输入2个操作数>:");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
优化后的代码:
#include<stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("**************************\n");
printf("**** 1. add 2. sub ****\n");
printf("**** 3. mul 4. div ****\n");
printf("**** 0. exit ****\n");
printf("**************************\n");
}
int main()
{
int input = 0;
//计算器-计算整型变量的加、减、乘、除
//a&b a^b a|b a>>b a<<b a>b
do {
menu();
//pfArr就是函数指针数组
//转移表 - 《C和指针》
int (*pfArr[5])(int, int) = { NULL, Add, Sub, Mul, Div };
int x = 0;
int y = 0;
int ret = 0;
printf("请选择:>");
scanf("%d", &input);//2
if (input >= 1 && input <= 4)
{
printf("请输入2个操作数>:");
scanf("%d %d", &x, &y);
ret = (pfArr[input])(x, y);
printf("ret = %d\n", ret);
}
else if(input == 0)
{
printf("退出程序\n");
break;
}
else
{
printf("选择错误\n");
}
} while (input);
return 0;
}
### []( )回调函数\_qsort函数的使用
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//void qsort(void *base, //base中存放的是待排序数据中的第一个对象的地址
// size_t num, //排序数据元素的个数
// size_t size,//排序数据中一个元素的大小,单位是字节
// int (cmp)(const void,const void*)//是用来比较待排序数据中的2个元素的(一个)函数
// );
int cmp_int(const void* e1,const void* e2)
{
return *(int *)e1-*(int *)e2;//因为参数类型是void,我们用(*int)强制类型转换
/*返回值 意义
<0 所指向的元素在所指向的元素之前p1p2
0 指向的元素等效于 指向的元素p1p2
>0 指向的元素位于 指向的元素之后p1p2
*/
}
void print(int arr[],int sz)
{
int i= 0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void test1()
{
//整形数据的排序
int arr[]={9,8,7,6,5,4,3,2,1,0};
int sz=sizeof(arr)/sizeof(arr[0]);
//排序
qsort(arr,sz,sizeof(arr[0]),cmp_int);
//打印
print(arr,sz);
}
struct Stu
{
char name[20];
int age;
};
int sort_by_age(const void* e1,const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;//转换结构体类型指针,e1指向age成员
}
void test2()
{
//排序结构体数据
struct Stu s[3]={ {"zhangsang",30},{"lisi",34},{"wangwu",20}};
int sz=sizeof(s)/sizeof(s[0]);
//按照年龄来排序
qsort(s,sz,sizeof(s[0]),sort_by_age);
}
int sort_by_name(const void* e1,const void* e2)
{
return strcmp(((struct Stu*)e1)->name ,((struct Stu*)e2)->name);
}
void test3()
{
//排序结构体数据
struct Stu s[3]={ {"zhangsang",30},{"lisi",34},{"wangwu",20}};
int sz=sizeof(s)/sizeof(s[0]);
//按照名字来排序
qsort(s,sz,sizeof(s[0]),sort_by_name);
}
int main()
{
//test1();
//test2();
test3();
return 0;
}
模仿qsort函数的通用算法
void Swap(charbuf1,charbuf2,int width)
{
int i = 0;
for(i=0;i<width;i++)
{
char tmp = *buf1;
*buf1=*buf2;
*buf2=tmp;
buf1++;
buf2++;
}
}
//模仿qsort实现一个冒泡排序的通用算法
void bubbble_sort(void *base,
int sz,
int width,
int (*cmp)(const void*e1,const void*e2)
)
{
最后
我可以将最近整理的前端面试题分享出来,其中包含HTML、CSS、JavaScript、服务端与网络、Vue、浏览器、数据结构与算法等等,还在持续整理更新中,希望大家都能找到心仪的工作。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
篇幅有限,仅展示部分截图: