【C习题】经典数组与指针面试题(万字)
文章目录
- 一. 一维数组
- 二.字符数组
- 三.字符指针
- 四.二维数组
- 五.指针笔试题
一. 一维数组
首先说明:需熟记以下三个规则。
规则1.&数组名指的是取出整个数组的地址。
规则2.数组名被单独放在sizeof内部,计算的是整个数组的大小。
说明:这里的单独指的是不参与运算,如果不单独,按数组首元素的地址进行计算。
规则3.只要是地址的大小,就是4/8个字节(32位——X86,是4个字节,64位上是8个字节)
注意:
1.sizeof的返回值是 unsigned int
2.sizeof是操作符也是关键字,但不是函数。
3.sizeof在预编译的时候就已经处理好了,调试是看不到求解过程的!
#include<stdio.h>
int main()
{//一维数组int a[] = {1,2,3,4};printf("%d\n",sizeof(a));//运用规则1,我们直到这里的a是整个数组的大小——>4个整形——>16个字节//所以答案是:16printf("%d\n",sizeof(a+0));//运用规则2,a不是被单独放在sizeof内部,所以里的a是数组首元素的的地址,//再运用规则3,可知地址在32位——4,64位——8,所以答案是4/8printf("%d\n",sizeof(*a));//*a运用规则2,这里的a不是单独出现,所以是数组首元素的地址,对数组首元素解引用//得出*a是数组首元素——1——>类型为int——>4个字节//答案:4printf("%d\n",sizeof(a+1));//运用规则2,a不是被单独放在sizeof内部,所以里的a是数组首元素的的地址,//对a+1得到的是数组第二个元素的地址//再运用规则3,可知地址在32位——4,64位——8,//答案是4/8printf("%d\n",sizeof(a[1]));//运用规则2,这里的a不是单独出现,所以是数组首元素的地址,这里表示的是数组的第//二个元素——2——>类型为int——>大小为4个字节//答案是:4printf("%d\n",sizeof(&a));//运用规则1,这里的&a表示的整个数组的大小,再运用规则3,只要是地址,大小就为4或//8个字节//答案是:4/8printf("%d\n",sizeof(*&a));//运用规则1:这里&a得到的是整个数组的地址,对整个数组的地址解引用,得到的为数组//名,运用规则2:数组名在sizeof内部是整个数组的大小——>4个整形->16个字节//答案:16printf("%d\n",sizeof(&a+1));//运用规则1:这里的&a指的是整个数组的地址,对整个数组加一跳过的是一个数组的大小//也就是跳过了4个整形(16个字节),但结果还是数组指针的类型——>地址——>运用规则3,//再运用规则3,可知地址在32位——4,64位——8//答案是:4/8//说明:这里的+1之后得到的是野指针,但是我们只是计算,并不访问和修改//所以是没有问题的printf("%d\n", sizeof(&a[0]));//a首先与[]结合([]的优先级大于&)得到是数组第一个元素,对数组的元素取地址得到的//第一个元素的地址,是地址——>运用规则3->地址为4或8个字节//答案:4/8printf("%d\n",sizeof(&a[0]+1));//a首先与[]结合([]的优先级大于&)得到是数组第一个元素,对数组的元素取地址得到的//第一个元素的地址,对第一个元素的地址加一,得到的是第二个元素的地址是地址——>//运用规则3->地址为4或8个字节//答案:4/8个字节return 0;
}
到这里我们的一维数组就讲完了,再看看下面的代码思考一下,是否豁然开朗?
#include<stdio.h>
int main()
{//一维数组int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));printf("%d\n", sizeof(a + 0));printf("%d\n", sizeof(*a));printf("%d\n", sizeof(a + 1));printf("%d\n", sizeof(a[1]));printf("%d\n", sizeof(&a));printf("%d\n", sizeof(*&a));printf("%d\n", sizeof(&a + 1));printf("%d\n", sizeof(&a[0]));printf("%d\n", sizeof(&a[0] + 1));return 0;
}
二.字符数组
#include<stdio.h>
int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr));//利用规则2:arr被单独放在sizeof内部,说明arr代表的是整个数组->6个字符->6字节//答案:6printf("%d\n", sizeof(arr + 0));//利用规则2:arr没有被单独放在sizeof内部,说明arr代表的是数组首元素的地址,加0也是数组首元素的地址。//利用规则3: 只要是地址就是4/8个字节//答案:4/8printf("%d\n", sizeof(*arr));//利用规则2:arr没有被单独放在sizeof内部,说明arr代表的是数组首元素的地址,对arr解引用是数组//首元素->字符类型—>1//答案:1printf("%d\n", sizeof(arr[1]));//利用规则2:arr没有被单独放在sizeof内部,说明arr代表的是数组首元素的地址,arr[1]是数组的//第二个元素->字符类型->1//答案:1printf("%d\n", sizeof(&arr));//利用规则1:&arr是取出了整个数组的地址,利用规则3:只要是地址就是4/8个字节//答案:4/8printf("%d\n", sizeof(&arr + 1));//利用规则1:&arr是取出了整个数组的地址,&arr+1跳过整个数组,利用规则3:只要是地址就是4/8个字节//答案:4/8printf("%d\n", sizeof(&arr[0] + 1));//利用规则2:这里的先与[]结合,arr[0]代表的是第一个数组的元素,对第一个数组元素取地址是第一个元素的地址//,加一是数组第二个元素的地址。利用规则3:只要是地址就是4/8个字节//答案:4/8return 0;
}
回顾:
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
#include<stdio.h>
int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", strlen(arr));//注意此arr是数组首元素的地址,类型匹配,但是数组内部的元素,没有\0,因此求出的是大于等于6的随机值//答案:大于等于6的随机值printf("%d\n", strlen(arr + 0));//arr+0还是数组首元素的地址,类型匹配,但是数组内部的元素,没有\0,因此求出的是大于等于6的随机值//答案:大于等于6的随机值printf("%d\n", strlen(*arr));//*arr对数组首元素地址解引用得到的是字符'a'——>97,类型不匹配,但是会被函数接收当做97的地址,内存//中有些空间是不能被访问的,所以会报错//答案:报错printf("%d\n", strlen(arr[1]));//arr[1]是数组的第二个元素字符'b'->98,与strlen类型不匹配,但是会被函数接收当做98的地址,内存//中有些空间是不能被访问的,所以会报错.printf("%d\n", strlen(&arr));//&arr取出的是整个数组的地址(与数组首元素的地址相同),与strlen类型不匹配,但是会被strlen识别为//数组首元素的地址,所以跟arr相同,但是数组内部的元素,没有\0,因此求出的是大于等于6的随机值//答案:大于等于6的随机值printf("%d\n", strlen(&arr+1));//&arr取出的是整个数组的地址(与数组首元素的地址相同),加1,跳过整个数组,与strlen类型不匹配,//但是会被strlen识别为,数组最后一个元素的下一个元素的地址,未知空间,因此求出的是随机值//答案:随机值printf("%d\n", strlen(&arr[0]+1));//arr先与[]结合表示的是,数组第一个元素,对数组第一个元素取地址再加1,得到的是数组第二个元素的地址//但是数组内部的元素,没有\0,因此求出的是大于等于5的随机值//答案:大于等于5的随机值return 0;
}
回顾:
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
#include<stdio.h>
int main()
{char arr[] = "abcdef";printf("%d\n", sizeof(arr));//利用规则2,arr被单独放在sizeof内部表示的是整个元素的大小,注意字符串最后有个\0,所以是7个字符——>7//答案:7printf("%d\n", sizeof(arr+0));//利用规则2:arr没有被单独放在sizeof内部,arr+0表示的是数组首元素的地址,利用规则3,只要是地址就是4/8//答案:4/8printf("%d\n", sizeof(*arr));//利用规则2:arr没有被单独放在sizeof内部,*arr表示的是数组第一个元素,也就是字符类型——>1个字节//答案:1printf("%d\n", sizeof(arr[1]));//这里的arr[1]表示的数组第二个元素——‘b’——>类型为char->1字节//答案:1printf("%d\n", sizeof(&arr));//利用规则1:&arr指的是整个数组的地址,运用规则3,只要是地址就是4/8个字节//答案:4/8printf("%d\n", sizeof(&arr+1));//利用规则1:&arr指的是整个数组的地址,加1跳过了整个数组,运用规则3,只要是地址就是4/8个字节//答案:4/8printf("%d\n", sizeof(&arr[0]+1));//arr先与[0]结合表示的是第一个数组的元素,对数组的第一个元素取地址,表示的是数组首元素的地址,对数组//的首元素加1,表示的是数组第二个元素的地址,利用规则3:只要是地址就是4/8个字节//答案:4/8return 0;
}
回顾:
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
strlen(函数)的补充:
1.返回值为:size_t(unsigned int)
2.函数参数为const char * str
3.strlen求的只能数字符串长度,不带\0
4.strlen遇到\0就停止运算了
4.strlen数组名单独放在里面是数组首元素的地址(要跟sizeof区分开)
strlen的实现
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char*str)
{assert(str);char* ret = str;while (*str++){;} return (str - ret -1);
}
#include<stdio.h>
int main()
{char arr[] = "abcdef";printf("%d\n", strlen(arr));//arr是数组首元素的地址,字符串的结尾是有\0的,所以最后求的结果是6//答案:6 printf("%d\n", strlen(arr+0));//arr+0是数组首元素的地址,字符串的结尾是有\0的,所以最后求的结果是6//答案:6printf("%d\n", strlen(*arr));//arr对数组首元素地址解引用得到的是字符'a'——>97,类型不匹配,但是会被函数接收当做97的地址,内存//中有些空间是不能被访问的,所以会报错。//答案:报错printf("%d\n", strlen(arr[1]));//arr[1]是数组的第二个元素字符'b'->98,与strlen类型不匹配,但是会被函数接收当做98的地址,内存//中有些空间是不能被访问的,所以会报错.//答案:报错printf("%d\n", strlen(&arr));//&arr取出的是整个数组的地址(与数组首元素的地址相同),与strlen类型不匹配,但是会被strlen识别为//数组首元素的地址,所以跟arr相同,所以求的是字符串的长度——6//答案:6printf("%d\n", strlen(&arr+1));//&arr取出的是整个数组的地址(与数组首元素的地址相同),加1,跳过整个数组,与strlen类型不匹配,//但是会被strlen识别为,数组最后一个元素的下一个元素的地址,未知空间,因此求出的是随机值//答案:随机值printf("%d\n", strlen(&arr[0]+1));//arr先与[]结合表示的是,数组第一个元素,对数组第一个元素取地址再加1,得到的是数组第二个元素的地址//所以求出的是从b开始数遇到\0停止,所以是5//答案:5return 0;
}
回顾:
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
三.字符指针
#include<stdio.h>
int main()
{char *p = "abcdef";//说明:字符串返回的是字符串首元素的地址。printf("%d\n", sizeof(p));//p是指针就是4/8个字节//答案:4/8printf("%d\n", sizeof(p+1));//p+1是字符串第二个字符的地址,是地址就为4/8//答案:4/8printf("%d\n", sizeof(*p));//*p解引用得到的是第一个字符'a',大小为1个字节//答案:1printf("%d\n", sizeof(p[0]));//p[0]指的是字符串的第一个元素,'a',大小为1个字节//答案:1printf("%d\n", sizeof(&p));//对p取地址,得到的是p的地址,是地址就是4/8个字节//答案:4/8printf("%d\n", sizeof(&p+1));//对p取地址,得到的是p的地址,是地址就是4/8个字节//答案:4/8printf("%d\n", sizeof(&p[0]+1));//p[0]表示的是字符串的第一个元素'a',对字符串的第一个元素取地址,是字符串的第一个元素的地址,//+1是字符串第二个元素的地址,是地址就是4/8个字节//答案:4/8return 0;
}
回顾:
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
#include<stdio.h>
int main()
{char *p = "abcdef";printf("%d\n", strlen(p));//p这里指的是指针也是字符串首元素的地址,所以求的是字符串的长度->6//答案:6printf("%d\n", strlen(p+1));//p+1这里指的是字符串第二个元素的地址,所以求的是从b开的长度->5//答案:5printf("%d\n", strlen(*p));//*p求的是第一个字符'a',这里的'a'是被放在变量中的,所以是1个字节//答案:1printf("%d\n", strlen(p[0]));//p[0]表示的是第一个字符‘a’,这里的'a'是被放在变量中的,所以是1个字节//答案:1printf("%d\n", strlen(&p));//&p指的是二级指针,也就是p的地址,所以传p的地址,得出的是随机数//答案:随机数printf("%d\n", strlen(&p+1));//&p指的是二级指针,也就是p的地址,然后对p的地址+1,所以传p+1的地址,得出的还是随机数//答案:随机数printf("%d\n", strlen(&p[0]+1));//p先与[0]结合,说明的p[0]指的是字符串的第一个元素,对字符串的第一个元素取地址相当于字符串首元素的地址//对首元素的地址+1得到的是第二个字符的地址,也就是从'b’往后数——长度为5//答案:5return 0;
}
回顾:
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));
四.二维数组
#include<stdio.h>
int main()
{//二维数组int a[3][4] = {0};//表示的是三行四列的数组printf("%d\n",sizeof(a));//数组名单独放在sizeof内部表示的是整个数组,也就是12个整形,是48个字节//答案:48printf("%d\n",sizeof(a[0][0]));//a[0][0]表示的是第一个元素,类型为int,大小为4个字节printf("%d\n",sizeof(a[0]));//a[0]表示的第一行的数组名,数组名被单独放在sizeof内部指的是第一行的元素,//4个整形,大小为16个字节//答案:16printf("%d\n",sizeof(a[0]+1));//a[0],表示的是第一行的数组名,数组名没有别单独放在sizeof内部,a[0]表示的是//第一行第一个元素的地址,加1是第二个元素的地址,是地址就是4/8//答案:4/8printf("%d\n",sizeof(*(a[0]+1)));//a[0],表示的是第一行的数组名,数组名没有别单独放在sizeof内部,a[0]表示的是//第一行第一个元素的地址,加1是第二个元素的地址,对第一行第二个元素解引用得到//第一行第二个元素,类型为int ,大小为4//答案:4printf("%d\n",sizeof(a+1));//a没有被单独放在sizeof内部,二维数组的数组名表示的是数组第一行的地址,加1得到//第二行的地址,只要是地址就是4/8//答案:4/8printf("%d\n",sizeof(*(a+1)));//a没有被单独放在sizeof内部,二维数组的数组名表示的是数组第一行的地址,加1得到//第二行的地址,对第二行的地址进行解引用得到的是第二行第一个元素的地址,只要//是地址就是4/8个字节//答案:4/8printf("%d\n",sizeof(&a[0]+1));//a[0]是第一行的数组名,a[0]没有被单独放在sizeof内部,表示的是第一行第一个元素//的地址,对数组名取地址得到的是第一行的地址,加1是第二行的元素的地址,只要是地//址就是4/8//答案:4/8printf("%d\n",sizeof(*(&a[0]+1)));//a[0]是第一行的数组名,a[0]没有被单独放在sizeof内部,表示的是第一行第一个元素//的地址,对数组名取地址得到的是第一行的地址,加1是第二行的元素的地址,对第二行//地址解引用得到第二行第一个元素的地址,只要是地址就是4/8//答案:4/8printf("%d\n",sizeof(*a));//*a指的是对第一行的地址解引用得到的是数组第一个元素的地址,只要是地址就是4/8//答案:4/8printf("%d\n",sizeof(a[3]));//a[3]指的是第四行的数组名,数组名单独出现在sizeof内部表示的是第四行元素的大小//大小为4个整形->16字节//答案:4/8return 0;
}
回顾:
int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
五.指针笔试题
#include<stdio.h>
int main()
{int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);printf( "%d,%d", *(a + 1), *(ptr - 1));//看下面图解可得*(a+1)是2,*(ptr-1)就为5return 0;
}
图解:
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
printf("%p\n", p + 0x1);
//p+1跳过的是一个结构体的大小20个字节
//也就是0x100000+0x014
//答案: 0x00110014
printf("%p\n", (unsigned long)p + 0x1);
//p转换为unsigned long 加1就真的加一
//答案:0x00100001
printf("%p\n", (unsigned int*)p + 0x1);
//p的类型为unsigned int *加1跳过4个字节
//答案:0x00100004
return 0;
}
int main()
{
int a[4] = { 1, 2, 3, 4 };
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf( "%x,%x", ptr1[-1], *ptr2);
//ptr[-1]相当于*(ptr-1)也就是4,((int)a+1)还跳过1个字节,由下图可知访问内存
//00 00 00 02小端存储->转换成16进制就是->02 00 00 00
//答案:4 2 00 00 00
return 0;
}
#include <stdio.h>
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };//逗号表达式最后的结果为逗号表达式的最后一个值的结果,所以存的数为//1 3 //5 0 //0 0int *p;p = a[0];//是第一行的地址printf( "%d", p[0]);//访问的是第一个元素为:1return 0;
}
int main()
{int a[5][5];int(*p)[4];p = a;//注意a的类型为int(*)[5]printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//p[4][2]指的是第五行第3个元素(按每行四个来算),所以是第4*4+3=19个元素
//a[4][2]指的第第五行第3个元素(按每行5个计算),所以是5*4+3=23个
//对他们分别取地址,相减的绝对值是相差元素的个数,
// &p[4][2] - &a[4][2]:-4,用%p打印(补码):
//1111 1111 1111 1111 1111 1111 1111 1100
//16进制:0xFF FF FF FC
//&p[4][2] - &a[4][2],19-23=-4
//-4
//答案:0xFF FF FF FC -4 return 0;
}
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *ptr1 = (int *)(&aa + 1);
int *ptr2 = (int *)(*(aa + 1));
printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
//由图可知,ptr1-1可得是10的地址,a+1解引用是第二行第一个元素的地址,对ptr2-1
//是5的地址,对其解引用得到的是5.
//答案:10 5
return 0;
}
图解:
#include <stdio.h>
int main()
{char *a[] = {"work","at","alibaba"};char**pa = a;//一级指针数组的数组名用二级指针进行接收pa++;printf("%s\n", *pa);//由图可知打印的是at
return 0;
}
图解:
#include<stdio.h>
int main()
{char *c[] = {"ENTER","NEW","POINT","FIRST"};char**cp[] = {c+3,c+2,c+1,c};char***cpp = cp;printf("%s\n", **++cpp);//对++cpp(前置++)解引用得到的是c+2,再解引用得到POINT首元素的地址//打印就是:POINTprintf("%s\n", *--*++cpp+3);//我们要注意上面的++对cpp已经产生了影响,所以再++cpp指的是c+1,所以对++cpp//解引用得到的是c+1,指的是NEW首元素的地址,再减减得到的是ENTER的地址//解引用得到的是ENTER首元素的地址,再加3得到的是E的地址。//所以最后为ERprintf("%s\n", *cpp[-2]+3);//这里再看cpp指向了c+1,但由于c+1在上一段代码已被更改成c,*(cpp-2)跟cpp[-2]//一样,所以指向的是c+3再解引用得到的是FIRST的首字母的地址,加3的到的是S的地址//解引用得到的是STprintf("%s\n", cpp[-1][-1]+1);//由于上面的cpp[-2]并没有更改cpp的值,所以这里的cpp指向c+1,但由于c+1在//上一段代码已被更改成c,因为cpp[-1][-1]可以解释为*(*(cpp-1)-1)cpp-1指的//是c+2,减1得到的是c+1解引用得到的是NEW的首字符的地址,加1得到的是E的地址,//所以最后为EWreturn 0;
}
图解:
相关文章:
【C习题】经典数组与指针面试题(万字)
文章目录一. 一维数组二.字符数组三.字符指针四.二维数组五.指针笔试题一. 一维数组 首先说明:需熟记以下三个规则。 规则1.&数组名指的是取出整个数组的地址。 规则2.数组名被单独放在sizeof内部,计算的是整个数组的大小。 说明:这里的单…...
【ArcGIS Pro二次开发】(13):ProWindow的用法
ProWindow是ArcGIS Pro SDK中的一个WPF控件,具有以下特点: 可扩展性:ProWindow提供了丰富的API和样式,可以轻松地扩展和自定义ArcGIS Pro应用程序的UI。 可定制性:ProWindow支持多种UI控件和布局方式,可以…...
HTML/CSS/JS 基本语法
前端一、HTNL1、文件结构2、文本标签(1)块元素:div(2)行内元素:span(3)格式标签3、图片、音频、视频(1)图片(2)音频< audio >&a…...
对于从事芯片行业的人来说,有哪些知识是需要储备的?
近两年芯片行业大火,不少同学想要转行,却不知道该如何下手,需要学习哪些基础知识,下面就来看看资深工程师怎么说? 随着工艺的发展,芯片肯定是尺寸越来越小,至于小到什么样的程度是极限…...
测试场景设计
测试场景设计 又叫做场景法。其实对于场景法是测试用例中面临最多的,但是这种模式不是很容易总结,有时候是基于经验,有时候是我们对系统的了解。所以在这种情况下,我们强硬的用场景法对其进行规范。 场景法原理 现在的软件几乎…...
《重构》增强代码可读性
文章目录重构原则何为重构为何重构何时重构重构会影响性能吗实例原始类进行重构分解statements方法提取函数搬移函数提炼“积分计算”功能去除临时变量(以查询取代临时变量)运用多态取代与价格相关的条件逻辑代码迁移Movie类Price类 状态模式搬移函数以多…...
数据分析自学路线
数据分析作为近几年火起来的IT技术岗位,在大数据时代的浪潮下迅速发酵膨胀,席卷了众多互联网企业,漫延到了金融、教育、医疗、消费等传统行业,在新经济领域也有重要作用,比如人工智能、新能源、电子芯片、企业数字化服…...
蓝桥杯C++组怒刷50道真题
🌼深夜伤感网抑云 - 南辰Music/御小兮 - 单曲 - 网易云音乐 🌼多年后再见你 - 乔洋/周林枫 - 单曲 - 网易云音乐 50题才停更,课业繁忙,有时间就更,2023/3/14/15:06写下 目录 👊填空题 🌼一…...
【期末小作业】HTML、CSS前端静态网页
分享一个可以“趁别人喝咖啡的功夫“”写的一个静态网页,纯纯练手小项目,适合前端刚入门的小白练练手。 前端练手静态页面 实现效果图展示 CSS代码 HTML 代码 环境:VScode编辑器 语言:HTML 、CSS 一、实现效果图 仅仅通过…...
Windows逆向安全(一)之基础知识(二)
反汇编分析C语言 空函数反汇编 #include "stdafx.h"//空函数 void function(){}int main(int argc, char* argv[]) {//调用空函数function();return 0; }我们通过反汇编来分析这段空函数 函数外部 12: function(); 00401048 call ILT5(func…...
Python 基础教程【2】:条件语句和循环语句
本文已收录于专栏🌻《Python 基础》文章目录1、流程控制语句1.1 顺序语句1.2 条件语句1.2.1 if语句注意事项1.2.2 三元运算符1.2.3 自动类型转换1.3 循环语句1.3.1 while 循环1.3.2 for-in 循环1.3.3 for...else 循环1.3.4 break 和 continue 的区别2、实践——猜数…...
【React避坑指南】useEffect 依赖引用类型
前言 如果你是一个入行不久的前端开发,面试中多半会遇到一个问题: 你认为使用React要注意些什么? 这个问题意在考察你对React的使用深度,因为沉浸式地写过一个项目就会发现,不同于一些替你做决定的框架,“…...
Android binder通信实现进程间通信
一.binder通信原理Binder 是 Android 系统中用于跨进程通信的一种机制,它允许一个进程中的组件与另一个进程中的组件进行通信,从而实现进程间通信 (IPC)。Binder 机制是基于 Linux 内核提供的进程间通信机制 (IPC) 实现的。在 Binder 机制中,…...
2023年BeijngCrypt勒索病毒家族最新变种之.halo勒索病毒
目录 前言:简介 一、什么是.halo勒索病毒? 二、.halo勒索病毒是如何传播感染的? 三、感染.halo后缀勒索病毒建议立即做以下几件事情 四、中了.halo后缀的勒索病毒文件怎么恢复? 五、加密数据恢复情况 六、系统安全防护措施建…...
【LeetCode】BM1 反转链表、NC21 链表内指定区间反转
作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 BM1 反转链表 描述: 给定一个单链表的头结点pHead(该头节点是有值的,…...
拼多多24届暑期实习真题
1. 题目描述: 多多开了一家自助餐厅,为了更好地管理库存,多多君每天需要对之前的课流量数据进行分析,并根据客流量的平均数和中位数来制定合理的备货策略。 2. 输入输出描述: 输入描述: 输入共两行&#x…...
JS高级知识总结
文章目录1. this指向问题2. 对象进阶2.1 对象的定义和使用2.2 对象访问器2.2.1 Getter2.2.2 Setter2.3 对象构造器2.4 对象原型2.4.1 prototype属性2.4.2 \_\_proto\_\_ 属性2.4.3 constructor属性2.4.4 原型链2.5 Object对象2.5.1 管理对象2.5.2 保护对象3. 函数进阶3.1 函数的…...
Jenkins+Docker+Maven+gitlab实现自动构建、远程发布
前言 一个项目完整的生命周期是从开发的coding阶段和coding阶段的质量测试,再到多次发布投入使用。目前大部分的测试阶段并不是从coding结束后开始的,而是和coding同步进行的。可能今天早上coding完成一个功能,下午就要投入测试。在这期间&a…...
centos7克隆虚拟机完成后的的一些配置介绍
系列文章目录 centos7配置静态网络常见问题归纳_张小鱼༒的博客-CSDN博客 文章目录 目录 系列文章目录 前言 一、配置Hadoop要下载的压缩包 1、下载对应版本的Hadoop压缩包 2、我们如何查看自己电脑的端口号 3、下载jdk对应的版本 二、虚拟机centos7克隆虚拟机完成后的一些基本…...
C语言/动态内存管理函数
C程序运行时,内存将被划分为三个区域,而动态开辟的内存区间位于堆区。 文章目录 前言 一、内存划分 二、malloc函数 三、calloc函数 四、realloc函数 五、free函数 总结 前言 在使用C语言编写程序时,使用动态内存是不可避免的&#x…...
华为OD机试题,用 Java 解【任务调度】问题
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不要…...
河南农业大学2023春蓝桥杯赛前训练第一场
A 滑板上楼梯 贪心 要求最少次数,尽量多跳三阶的,不能连续跳三阶,三阶后面一定要跟着一个一阶,相当于直接跳四阶 每次跳四阶都是两步(3、1),如果 % 4 之后,正好剩下 3 ,…...
docker-dockerfile
1.常用保留字指令 FROM : 基础镜像MAINTAINER: 维护者姓名和邮箱RUN : Run ["可执行文件",参数1]; Run [shell命令]EXPOSE: 暴露出的端口号WORKDIR: 登录后的位置USER: 执行用户,默认是rootENV: 构建过程的环境变量ADD: 将宿主机的文件拷贝到…...
【JavaEE】浅识进程
一、什么是进程1.1 操作系统学习进程之前首先要了解我们的操作系统(OS),我们的操作系统实际上也是一款软件,属于系统软件的范畴,操作系统早期采用命令提示框与用户交互,我们启动某个软件,打开某…...
Java_Spring:1. Spring 概述
目录 1 spring 是什么 2 Spring 的发展历程 3 spring 的优势 4 spring 的体系结构 1 spring 是什么 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspec…...
使用Maven实现第一个Servlet程序
目录 前言: Maven 什么是Maven 创建Maven项目 Mevan目录介绍 Servlet程序 引入Servlet依赖 创建目录结构 编写代码 打包程序 部署程序 验证程序 idea集成Tomcat 下载Tomcat插件 配置Tomcat的路径 Smart Tomcat工作原理 小结: 前言&#…...
【MySQL】MySQL的优化(一)
目录 查看SQL执行频率 定位低效率执行SQL 定位低效率执行SQL-慢查询日志 定位低效率执行SQL-show processlist 查看SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当…...
win kubernetes dashbord部署springboot服务
文章目录前言一、新建springboot工程二、制作镜像1.编写dockerfile2.使用阿里云镜像仓库3.使用dashbord部署服务总结前言 使用win版docker desktop安装的k8s,kubenetes dashbord。 一、新建springboot工程 就是简单一个接口。没什么说的 二、制作镜像 1.编写dock…...
Linux之进程终止
本节目录1.进程终止2.exit与_exit函数1.进程终止 进程终止时,操作系统做了什么? 释放进程中申请的相关内核数据结构和对应的数据和代码。本质就是释放系统资源。 进程终止的常见方式 a.代码跑完,结果正确 b.代码跑完,结果不正确…...
全网独家首发|极致版YOLOv7改进大提升(推荐)网络配置文件仅24层!更清晰更方便更快的改进YOLOv7网络模型
有不少小伙伴和我交流YOLO改进的时候,都说YOLOv7的网络配置文件长达104层,改起来很费力,数层数都要数很久,还很容易出错,而且基于YOLOv5代码架构,Debug起来也确实比较费时,所以博主对YOLOv7网络…...
网站页码/品牌seo主要做什么
本周周五下午,周六,周日我在家加班忙着重新写我们项目的收集数据程序。 原来的程序是由我属下用C写的,在运行一段时间后出现假死的请求,找来找去没有发现问题。后来决定用perl重写,用perl重写的原因是: perl的优势是解…...
学做app软件在哪里学/优化seo教程技术
2019独角兽企业重金招聘Python工程师标准>>> 如今,智能手机已经迎来了一个新的时代——移动应用程序开发。如今,移动应用程序能够帮助大家简化很多日常事务。使用移动应用程序,您能在线支付账单、在线观看视频以及玩游戏等等&…...
wordpress 缓存用什么/陕西网站建设网络公司
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕上,本文是读 UCDOS 16点…...
vps建设网站/站长工具seo综合查询官网
一、基本思想 ArrayList的一个变体,通过对原来数组的拷贝,来保证不同操作情况下的线程安全。 这个容器类内部有大量的数组拷贝操作 二、源码解析 2.1 基本数据结构 /** The lock protecting all mutators */transient final ReentrantLock lock new Ree…...
网站管理和维护的主要工作有哪些/2345网址导航下载桌面
一、SIFT特征原理描述 参考博客:https://blog.csdn.net/wp1351553202/article/details/80876796 , https://blog.csdn.net/lingyunxianhe/article/details/79063547 , SIFT的主要步骤是构建尺度空间,提取出特征点,为特…...
武汉做网站知名的公司/指数基金怎么买才赚钱
一、源码特点 asp.net 在线音乐点播系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发,开发环境为vs2010,数据库为sqlserver2008,或者更高版 asp.net在线音乐点播系统VS开发sqlser…...