C语言进阶第四课-----------指针的进阶----------指针和数组笔试解释

news2024/11/23 3:24:49

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


指针和数组笔试题解析

  • **作者前言**
  • 数组笔试解释
    • 整形数组
    • 字符数组
    • 二维数组
  • 指针笔试解释

数组笔试解释

我们前面学习过了数组,也了解数组名的大概意思

整形数组

#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;
}

上面代码中我定义了一个整形数组,大小为4,要做好这些题我们就要深刻理解数组名的含义
数组名的理解

  1. sizeof(arr)单独传入数组名,这里的数组名代表的是整个整数,计算的是整个数组的元素大小,不是元素个数,单位为字节
  2. &arr代表的是整个数组,取出的是数组的地址
  3. 除上面两个例外,数组名代表都是数组首元素的地址

解释1
在这里插入图片描述
这里的sizeof(a)数组名是单独传入进去的,所以代表的是整个数组,计算的是整个数组的大小,结果为16

解释2
在这里插入图片描述
数组名不是单独传入的,所以a代表数组首元素的地址,地址的大小是由环境决定的,大小为4或者8

解释3
在这里插入图片描述
数组名a不是单独的放入到sizeof中,所以数组名代表数组首元素的地址,*为解引用操作符,找出数组首元素,数组首元素是一个int类型的数,大小为4个字节,其中下面就可以解释了
在这里插入图片描述

解释4
在这里插入图片描述
这里a+1是数组第二个元素的地址,大小是4个字节

解释5
在这里插入图片描述
a[1] ==*(a + 1),所以大小是4个字节
解释6
在这里插入图片描述
这里可能有小可爱就不明白了,为啥这里不和sizeof(a)的结果一样?前面我已经讲得很清楚了,只要数组名单独放入sizeof才是代表整个数组,计算的是整个数组的大小,&a虽然代表的是整个数组,但是取的却是数组的地址,所以&a就是数组的地址,既然是地址,就是一个数,这个数的类型是int(*)[4] ,地址的大小是4或者8个字节,记住,指针的类型的大小是4或者8个字节,地址就是一个数,用十六进制表示而已,没有啥高大尚的,如果这个&a 加1就会跳过16个字节,主要是这里很容易搞混淆,指针的大小 4或者8 字节,不同的指针类型加1跳过的字节会不相同,所以上面的结果是4或者8字节,
数组元素的地址和数组的地址的区别:是类型的区别,不是大小的区别,因为地址的大小都是4或者8个字节,

解释7
在这里插入图片描述
这里我们可以拆分一下,*(&a),对数组的地址解引用,得出的是整个数组,计算整个数组的大小,或者我们可以这样理解为 *&会抵消掉,结果为16

解释8
在这里插入图片描述
&a的类型为int(*)[4],数组地址加1 跳过整个数组,
在这里插入图片描述
所以跳过16字节,但总归还是地址,是地址那就是4/8字节
解释9
在这里插入图片描述
这里是取出元素a[0]的地址,是地址,就是4/8个字节
最终的结果如下:
在这里插入图片描述

字符数组

#include<stdio.h>
int main()
{
	//字符数组
	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));
	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));
	return 0;
}

这里我定义了一个字符数组,我们来看看
解释1
在这里插入图片描述
这里数组名是单独的放的,代表整个数组,所以是计算数组的大小,单位为字节,结果是6

解释2
在这里插入图片描述
这里是地址,结果是4/8.不要认为是一个字节啊,指针变量的大小和类型无关,不管是啥类型的指针变量,大小都是4/8个字节

解释3
在这里插入图片描述
arr没有单独传入,所以代表的是数组首元素的地址,加上*解引用操作,所以计算的是是首元素的大小

解释4
在这里插入图片描述
这里和上面的类似,虽然&arr是代表整个数组,但是&arr取出的是数组的地址,是地址,那大小就是4或者8个字节,类型是char (*)[6]

解释5
在这里插入图片描述
这里和上面还是一样的,数组的地址加1,跳过整个数组,但还是地址,地址的大小是4/8个字节

解释5
在这里插入图片描述
strlen函数,计算字符串的长度,计算的是‘\0’前的字符个数
在这里插入图片描述
参数是一个字符指针
这里的arr是没有‘\0’的,所以是随机值

解释6
在这里插入图片描述
这里传入的是首元素的地址,因为strlen函数计算的是‘\0’前的字符个数,传入的只是从哪里开始计算的地址,所以大小为随机值

解释7
在这里插入图片描述
因为strlen函数的参数是一个字符指针,所以传入的任何数据都会被当成地址,而这里传入的是数组首元素,会转换成对应的ASCII值,然后转换成对应的十六进制,访问对应的内存,但是访问的内存不知道有没有,非法访问,所以会报错

解释8
在这里插入图片描述
这里传入的是数组的地址,虽然数组首元素的地址和数组的地址是一样的,但是类型不一样,数组的地址的类型为char (*)[6],而strlen的参数类型为 const char *,这里就会发生类型转换,编译器会报警告
在这里插入图片描述
解释9
在这里插入图片描述
这里会跳过整个数组,结果是随机值
另一种写法

#include<stdio.h>
int main()
{
	//字符数组
	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));
	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));

	return 0;
}

这里的情况和上面的类似,这里就不讲解了

另一种写法

#include<stdio.h>
int main()
{
	//字符数组
	char* p = "abcdef";
	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));
	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));
	
	return 0;
}

在解释之前要好好看看以下的图
在这里插入图片描述
可以看出p存放的是字符a的地址,而不是整个字符串

解释1
在这里插入图片描述
p里面存放的是字符a的地址,是地址,大小就是4/8个字节

解释2
在这里插入图片描述
p + 1 相当于是字符a的地址加1,偏移1个字节,地址指向的是第二个元素的地址,大小为4/8个字节

解释3
在这里插入图片描述
*p取出字符a,大小为1个字节

解释4
在这里插入图片描述
前面我们知道arr[0] <==>*(arr + 1),这里的p存储的是字符串的首元素地址,(字符a的地址),字符串相当于一个数组arr, 首元素的地址,大小为4/8个字节
解释5
在这里插入图片描述
这里的大小为4/8个字节,类型是char**

解释6
在这里插入图片描述
这里的结果是4/8个字节,&p + 1跳过4/8个字节,类型是char**
在这里插入图片描述
解释7
在这里插入图片描述
前面我们讲过p[0] ==> arr[0],也就是字符串的首元素的, &p[0] == > &arr[0] ,所以这里访问的是第二个元素的地址 ,大小为4/8个字节
解释8
在这里插入图片描述
p存放的是字符a的地址,所以计算的长度为6,计算’\0’前的字符个数
解释9
在这里插入图片描述
这里传入的是p的地址,所以大小是随机值

二维数组

#include<stdio.h>
int main()
{
	
	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]));
	
	return 0;
}

在这里插入图片描述
相同颜色的相当于一个一维数组,二维数组相当于是一维数组的数组,我们可以理解二维数组的元素个数是一维数组的个数,但是我们可以想象成以下场景
在这里插入图片描述
a[0]、a[1]、a[2]可以认为是数组名,一一对应第几行,a[0]第一行, a[1]第二行,a[2]第三行
解释1
在这里插入图片描述
这里单独传入了数组名,代表整个数组,计算整个数组的大小,单位为字节,大小为48字节
解释2
在这里插入图片描述
这里arr[0][0]是一个整形数据,大小为4字节
解释3

这里相当于传入了一个数组名,代表的是a[0]的一维数组,计算的是a[0]一维数组的大小,就是16字节
解释4
在这里插入图片描述
首先,a[0]相当于一个一维数组的数组名,没有单独放在sizeof里,所以代表的是这一维数组的首元素地址,加1,得出第二元素的地址,是地址,大小就是4/8字节

解释5
在这里插入图片描述
前面我们已经知道a[0]是一维数组的数组名,数组名加1,得到第二元素的地址,地址解引用指向第二元素,第二元素是一个整形,大小为4

解释6
在这里插入图片描述
可以看出这里传入的是数组a首元素的地址,加一是第二元素的地址,是地址大小就是4/8个字节,类型是int(*)[4]

解释7
在这里插入图片描述
a数组首元素的地址,加1,是第二元素的地址,解引用得到第二元素, (a + 1) = a[1], 因为数组a是二维数组,相当于是一维数组的数组a[1],传入数组名,计算的是一维数组的大小,所以结果为16字节
解释8
在这里插入图片描述
这里是取出a[0]的地址,加1 就是a[1]的地址,是地址,那就是4/8字节,类型为int(*)[4],或者我们可以换个思路,a[0]是一维数组名, 加个&就变成了取出一维数组的地址,然后加1,跳过这个数组,因为二维数组的存储是连续,会指向第二个一维数组地址
解释9
在这里插入图片描述
上面我们已经讲过了(&a[0] + 1)是第二个一维数组 的地址,加上
就是a[1],是数组名,计算的是一维数组的大小,结果16字节

解释10
在这里插入图片描述
a为二维数组名,没有单独传入,所以是首元素的地址,&a[0],加上*就是一维数组名了,计算的是一维数组的大小,结果为16字节
解释11
在这里插入图片描述
有小可爱看到这里,越界了?,越界是要去访问对应的内存,sizeof不会去访问对应的内存,我们前面测试过sizeof(int)和sizeof(1)的大小是一样的,sizeof是根据类型来判断大小的,a[3]的类型和a[0]的类型是一样的, 所以不会去访问内存,不访问内存,就不存在越界

总结:
数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。

指针笔试解释

笔试题1

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf( "%d,%d", *(a + 1), *(ptr - 1));
    return 0;
}

结果:
在这里插入图片描述

可能看到这里有写些小可爱就会很困惑,
不急,我来讲解
在这里插入图片描述 这道题是把&a + 1强转成int类型,加1减1都会越过4个字节,这就是(ptr - 1)最终指向的元素5的地址并解引用 ​

笔试题2

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);
 printf("%p\n", (unsigned long)p + 0x1);
 printf("%p\n", (unsigned int*)p + 0x1);
 return 0;
}

这里结构体的大小涉及到内存对齐,后面会讲解,

我们知道这个结构体类型的大小为20字节,所以创建出来的结构体变量的大小也是20字节,

  1. 0x1转换成十进制是1,p + 1 跳过20个字节,因为前面已经定义了变量p是结构体指针变量
    注意一下,p的数组从没有被改变
  2. p强转成unsigned long 类型,加1就是我们正常的十进制加1
  3. p强转成unsigned int *类型,加1 跳过4个字节
  4. %p是打印格式

笔试题3

#include<stdio.h>
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);

	return 0;
}

在这里插入图片描述
前面我们讲过 a[0] <==> a + 0,那这里的ptr1[-1]相当于ptr +(-1),因为ptr = &a + 1,又被强转成int类型,所以减1就指向4的地址,%x为十六进制输出。
(int
)((int)a + 1)这里主要是首元素的地址的类型被强转为int, 加1就是数学的加1,
在这里插入图片描述
我们知道int*类型是访问4个字节,这里少了一个字节,那就会往后再访问一个字节,既然我们知道会这样访问,那我们还要知道这些内容是啥,前面我们还理解过内存的存储在vs编译器时小端存储,有不懂的可以看看我的这篇博客C语言进阶第一课,
在这里插入图片描述
在这里插入图片描述
可以看到vs编译器的存储是十六进制的,一个字节是8bit 每4个bit表示一个十六进制位,所以ptr2访问的是 00 00 00 02 ,因为是小端存储,要写成我们认识的补码就是 02 00 00 00

笔试题4

#include <stdio.h>
int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
	int* p;
	p = a[0];
	printf("%d", p[0]);
	return 0;
}

这里主要涉及到逗号表达式,化简得int a[3][2] = {1, 3, 5}
在这里插入图片描述
前面我们知道二维数组是一维数组的数组, a[0]是第一行一维数组的数组名,元素,所以p存储的是元素1的地址,又因为p[0] <==> *(p + 0)所以这里的结果为1

笔试题5

#include <stdio.h>

int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
	return 0;
}

这里定义了一个二维数组a和一个 数组指针变量p, p = a 所以p存储的是 &a[0],也就是二维数组名

在这里插入图片描述
可以看到a[4][2]是一个元素 ,&a[4][2]就是该元素的地址,而p变量的类型是int(*)[4] ,加1 就是跳过16字节, 而a[0]的类型是int(*)[5], 所以&p[4][2]是18格子,也就是&a[3][3],而 a[4][2] 是22格,而我们知道数组的内存存储是从小到大存储的,所以p[4][2]是小地址 ,两者相减就是-4,-4要在内存存储是以补码的形式存储,即:
11111111111111111111111111111100,因为是%p输出,不会去区分补码和原码,所以直接打印补码0xfffffffc,
%p是打印地址的,认为内存存储的补码就是地址,

笔试题6

#include <stdio.h>
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));
	return 0;
}

定义一个二维数组 , &aa的类型是 int(*)[2][5];

在这里插入图片描述
&aa + 1 跳过40个字节, aa数二维数组的首元素的地址, 也就是 &aa[0] , aa + 1就是第二行一维数组的地址,前面我讲过a[0] 等于*(a + 0), 那*(aa + 1) <==> aa[1],或者我们可以理解为二维数组的元素是一维数组名,解引用得到对应的数组名,所以ptr2存储的是6的地址,最终结果是 10 和5

笔试题7

#include <stdio.h>
int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

这里的a是一个指针数组 里面的元素类型是char , pa是一个二级指针
在这里插入图片描述
这样就很明了,我们需要注意的是%s遇到’\0’就停止了,因为pa++,所以是指向第二个元素的地址,因为 p是一个二级指针变量, 类型是 char
*, 加1跳过4个字节,而a的一个元素大小是4个字节,所以打印的是at

笔试题8

#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);
	printf("%s\n", *-- * ++cpp + 3);
	printf("%s\n", *cpp[-2] + 3);
	printf("%s\n", cpp[-1][-1] + 1);
	return 0;
}

在这里插入图片描述
这是关系图
这里我们要注意cpp会改变,**++cpp 就是cpp先加1,cpp指向c+2 的地址.解引用两次,结果是POINT
在这里插入图片描述
这里我们要清楚运算符的优先级,就是 + 的优先级很低 cpp 先加1 指向c + 1 的地址,然后解引用得出 c + 1 ,c + 1再减1,cp[2] = c,然后解引用得到字符E的地址, E的地址加3 ,结果为ER

在这里插入图片描述
前面的cpp = &cp[2]
*cpp[-2]相当于**(cp),然后加 3 ,结果为ST,注意一下,这里的cpp没有改变
cpp = &cp[2]
在这里插入图片描述
经过上面的操作 cp[2] = c
cpp[-1][-1] == cp[1][-1] == (c + 2)[-1] == c[1],最终结果为EW

在这里插入图片描述
C语言的进阶指针到这里就结束了,有不懂的小可爱可以私聊我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1045348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你集成环信ReactNative离线推送

前言&#xff1a;在集成ReactNative推送之前&#xff0c;需要了解ReactNative与Android原生交互 一、RN与Android原生交互 RN给原生传递参数 步骤&#xff1a; 1.用Android Studio打开一个已经存在的RN项目&#xff0c;即用AS打开 项目文件夹/android,如下图所示 2.在An…

如何将微信、支付宝、字节等小程序直接迁移到自有app中

简要回顾一下 FinClip Studio 的相关能力&#xff1a; FinClip Studio 是一款强大的小程序云端容器&#xff0c;它可以将小程序嵌入到您的原生 App 中&#xff0c;实现无缝的融合体验。不仅如此&#xff0c;FinClip 还提供了一系列的工具和功能&#xff0c;以简化小程序的开发…

大模型训练之加速篇 -> peft(Lora) -> accelerator -> deepspeed (Zero)

HUGGINFACE PEFT库&#xff1a; 实现LORA&#xff0c; prefix-tuning. prompttuning, AdaLoRA, LLaMA-Adapter训练的库 HUGGINFACE accelerator库&#xff1a; 是一个将pytorch模型迁移到CPU/GPU/Multi-GPUs/TPU/Fp16/bf16模式下训练的一个标准库 DeepSpeed Pytorch的分布式并…

正点原子lwIP学习笔记——TCP协议

1.TCP协议简介 TCP协议&#xff0c;是一种面向连接、可靠的、基于字节流的传输层通信协议。 主要就是要知道&#xff0c;TCP协议是需要连接才可以互发数据的&#xff0c;连接需要三次挥手&#xff0c;而断开连接需要四次挥手。 2.TCP协议报文结构 TCP协议的头部一共有20字节&…

网易一面:Eureka怎么AP?Nacos既CP又AP,怎么实现的?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; Eureka是AP还是CP&#xff1f; 说说其集群数据一致性…

有哪些ai智能写作是永久免费的

无论你是一个自媒体作者&#xff0c;企业家&#xff0c;还是一个博客写手&#xff0c;你都了解创作的挑战。创意和时间常常成为限制因素&#xff0c;而AI智能写作工具则旨在解决这些问题。 这些工具利用先进的自然语言处理技术&#xff0c;可以生成各种类型的文本&#xff0c;包…

Appium+python+unittest搭建UI自动化框架

阅读本小节&#xff0c;需要读者具备如下前提条件&#xff1a; 掌握一种编程语言基础&#xff0c;如java、python等。 掌握一种单元测试框架&#xff0c;如java语言的testng框架、python的unittest框架。 掌握目前主流的UI测试框架&#xff0c;移动端APP测试框架Appium&…

Java中的IO流的缓冲流

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 &#x1f334;IO流体系结构&#x1f334;缓冲流1.提高效率的原理2.缓冲流的类型3.字符缓冲流两个特有方法 &#x1f334;总结 &#x1f334;IO流体系…

如何查阅下载美国物理学会(APS)文献

APS美国物理学会数据库简介&#xff1a; The American Physical Society (APS)成立于1899年&#xff0c;是世界上最具声望的物理学专业学会之一。APS不仅为用户带来今日尖端研究&#xff0c;同时为全球各研究单位提供自1893年以来&#xff0c;在“PHYSICAL REVIEW”上刊载的所…

2020年12月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 执行以下代码中&#xff0c;输出的结果是&#xff1f;&#xff08; &#xff09; sum0 for i in range(1,10,3):sumsumi p…

88、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->Set相关命令

本次讲解要点&#xff1a; ** Set相关命令&#xff1a;是指value中的数据类型** 启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe …

智慧能源:引领未来的能源革命

在当今世界&#xff0c;能源问题是一个备受关注的焦点话题。随着全球人口的不断增长和工业化进程的加速&#xff0c;对能源的需求也日益增加&#xff0c;同时&#xff0c;传统的能源资源面临着日益严重的枯竭和环境污染问题。在这一背景下&#xff0c;智慧能源应运而生&#xf…

vite跨域proxy设置与开发、生产环境的接口配置,接口在生产环境下,还能使用proxy代理地址吗

文章目录 vite的proxy开发环境设置如果后端没有提供可以替换的/mis等可替换的后缀的处理办法接口如何区分.env.development开发和.env.production生产环境接口在生产环境下&#xff0c;还能使用proxy代理地址吗&#xff1f; vite的proxy开发环境设置 环境&#xff1a; vite 4…

服务断路器_服务雪崩解决方案之服务隔离

那显而易见&#xff0c;做服务隔离的目的就是避免服务之间相互影响。毕竟谁也不能说自己的微服务百分百可用&#xff0c;如果不做隔离&#xff0c;一旦一个服务出现了问题&#xff0c;整个系统的稳定性都会受到影响&#xff01; 因此&#xff0c;做服务隔离是很有必要的。 什么…

消费者偏移量_consumer_offsets相关解析

1.概述 __consumer_offsets 是 kafka 自行创建的&#xff0c;和普通的 topic 相同。它存在的目的之一就是保存 consumer 提交的位移。 __consumer_offsets 的每条消息格式大致如图所示: 可以想象成一个 KV 格式的消息&#xff0c;key 就是一个三元组&#xff1a;group.idtopi…

成都睿趣科技:抖音开通橱窗带货需要钱吗

随着社交媒体和电子商务的蓬勃发展&#xff0c;抖音作为一种流行的短视频平台&#xff0c;也推出了自己的“抖音橱窗”功能&#xff0c;让内容创作者能够通过视频展示和销售产品&#xff0c;从而实现商业化。那么&#xff0c;抖音橱窗带货是否需要费用呢? 首先&#xff0c;要开…

现代数据架构-湖仓一体

当前的数据架构已经从数据库、数据仓库&#xff0c;发展到了数据湖、湖仓一体架构&#xff0c;本篇文章从头梳理了一下数据行业发展的脉络。 上世纪&#xff0c;最早出现了关系型数据库&#xff0c;也就是DBMS&#xff0c;有商业的Oracle、 IBM的DB2、Sybase、Informix、 微软…

关于坐标的旋转变换和坐标系的旋转变换

不管是坐标的旋转变换还是坐标系下的旋转变换&#xff0c;只和旋转的顺时针和逆时针有关。然坐标系间的顺时针和逆时针是根据当前坐标系在目标坐标系下的相对位置确定。 一。逆时针旋转belta角度的公式 二。顺时针旋转belta角度的公式 三。坐标的旋转变换 1.坐标的旋转变换相…

一文了解企业如何实现文件自动化实时同步

在当今的数字化时代&#xff0c;数据是企业的核心资产&#xff0c;也是企业竞争力的重要体现。数据的传输、共享、协作、备份等都需要依赖文件同步技术&#xff0c;实现数据在不同平台和设备之间的一致性和可用性。文件同步是指将一个或多个文件夹中的内容复制或更新到另一个或…

网络安全攻防:软件逆向之反汇编

网络安全是当今社会中一个非常重要的问题&#xff0c;而软件逆向工程是网络安全攻防中常用的一种技术手段。在软件逆向工程中&#xff0c;反汇编是一种基础而重要的技术。通过反汇编&#xff0c;我们可以将二进制程序转换为汇编语言&#xff0c;从而更好地理解程序的执行流程和…