C语言进阶之笔试题详解(1)

news2024/11/29 14:54:49

引言:

对指针知识进行简单的回顾,然后再完成笔试题。

158c3f50b199454985017a51dbef9841.png               ✨ 猪巴戒:个人主页✨

               所属专栏:《C语言进阶》

        🎈跟着猪巴戒,一起学习C语言🎈

目录

引言:

知识简单回顾

指针是什么

指针变量的大小?

指针类型的意义

指针的运算

指针数组

数组名是什么

数组指针

函数指针

函数指针数组

回调函数 

笔试题

一维数组

题目:

解析:

总结:

字符数组

题目1:

解析:

题目2:

解析:

 总结:

题目3:

解析:

总结:

题目4:

解析:

总结:

题目5:

答案:

题目6:

答案:


知识简单回顾

指针是什么

内存 ->内存的单元(1byte)->编号->地址

我们有一块很大的内存空间,内存空间被分为一个一个的单元,一个内存单元的大小是1byte(字节),每个字节都有它的编号,这个编号就是地址,地址又叫做指针

指针就是一个地址。

我们口头语说的指针一般指:指针变量

指针变量就是一个变量,就是一块内存空间,指针变量用来存放地址。

&a就是内存的编号,也是地址.
这个指针变量叫做pa,int*是类型(整形指针),通过这个类型创造的变量叫做pa

*pa就是对pa进行解引用,通过pa存放的地址找到它所指向的对象(a),pa存的是a的地址所以pa指向a,*pa其实就是a

*pa = 20;就相当于 a = 20;将 a 的值改变了。

int main()
{
    int a = 0;

    int* pa = &a;

    *pa = 20;

    return 0;
}

指针变量的大小?

——4/8个字节,取决于编译器是x86环境还是x64环境


指针类型的意义

两件事情:

1.指针类型进行+1/-1的操作时,它会跳过几个字节。

2.进行解引用操作的时候,决定了解引用操作时候的权限,(访问多少个字节)


指针的运算

1。+-整数

2.指针-指针

3.指针的关系运算


指针数组

本质上就是数组,数组中存放的是指针(地址)。

arr 存放了三个元素,每个元素都是int*类型,也就是指针,那么arr就是指针数组。

int main()
{
    int *pa;
    int *pb;
    int *pc;
    int* arr = { pa,pb,pc };
    return 0;
}

0c3c5e59992d496b988dad0d0c445584.png


数组名是什么

1.数组名在大部分情况下表示数组首元素的地址,

但是有两个例外:

a)sizeof(数组名),表示的是整个数组的大小

b)&数组名,取出的是整个数组的地址


数组指针

&数组名,这里的parr ,存放的是数组的地址,parr为数组指针。

数组指针:int (*parr)[10],parr与*结合,代表parr为指针,[10]表示parr指向数组,数组中元素的类型是int。

指针数组:int* parr[10],没有括号,parr与[10]结合,表示parr为数组,数组中元素的类型是int*(整形指针)

数组指针类型的表示:int (*)[10];

int arr[10] = {1,2,3};
int (*parr)[10] = &arr;

函数指针

函数指针就是函数的地址,函数也有地址,我们可以通过函数的地址去使用函数。

函数的地址存放在函数指针变量中,

函数指针类型表示:

int (*)(int,int)

int (*pf)(int ,int)pf*结合,表示pf是指针,指针指向的是(int , int)参数是两个整形的函数,函数的返回类型是int

int Add(int x,int y)
{
    return x + y;
}

int main()
{
    int (*pf)(int ,int) = &Add;
    int sum = (*pf)(2,3);
    //Add 和 &函数名一样,Add也可以直接表示为地址,因此也可以写成这种形式
    //int (*pf)(int ,int) = Add;
    //Add传给了pf,pf 等同于 Add ,那么我们也可以这样写。 
    //int sum = pf(2.3)
    return 0;
}


函数指针数组

存放函数指针的数组。

我们将函数指针数组命名为arr,arr数组的每个元素的类型是:int (*)(int,int)

函数指针数组的类型表示:

  int (*[4])(int,int)

怎么理解这函数指针数组的形式?

  arr与[4]结合,说明arr是数组,这个数字的每个元素是int(*)(int,int),而这正好是函数指针类型。

int (*arr[4])(int,int) = {Add,Sub,Div,Mul};

7f747b1e3e234bfea78e57b5b34e0ecf.png


回调函数 

通过函数指针调用的函数就是回调函数。

这里的函数指针是pf,pf指向的函数是Add,通过pf调用Add,我们称Add为回调函数。

int Add(int x,int y)
{
    return x + y;
}

int main()
{
    int (*pf)(int ,int) = Add;
    int sum = pf(2.3);
    return 0;
}

笔试题

一维数组

题目:

以下打印的结果分别是什么?

 int a[] = {1,2,3,4};
1|printf("%d\n",sizeof(a));
2|printf("%d\n",sizeof(a+0));
3|printf("%d\n",sizeof(*a));
4|printf("%d\n",sizeof(a+1));
5|printf("%d\n",sizeof(a[1]));
6|printf("%d\n",sizeof(&a));
7|printf("%d\n",sizeof(*&a));
8|printf("%d\n",sizeof(&a+1));
9|printf("%d\n",sizeof(&a[0]));
10|printf("%d\n",sizeof(&a[0]+1));

数组名的理解,指针的运算和指针类型的意义

解析:

1.printf (" %d\n ", sizeof ( a ) );  16

  sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节

2.printf (" %d\n ", sizeof( a+0 ) );  4 / 8

  a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地址。是地址,大小就是4 / 8个字节。地址的大小和环境有关,32位的系统环境就是4个字节,64位系统环境就是8个字节。

3.printf (" %d\n ", sizeof( *a ) );  4

   *a中的a是数组数组首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素,

   首元素是整形,所占内存大小是4个字节

4.printf (" %d\n ", sizeof( a+1 ) );  4 / 8

  a不是单独放在sizeof的内部,a表示的是首元素的地址,a+1就是数组第二个元素的地址

  地址的大小是4个字节或者8个字节。

5.printf (" %d\n ", sizeof( a[1] ) );  4

 a[1]表示的是数组的第二个元素,作为整形元素的大小为4个字节

6.printf (" %d\n ", sizeof( &a ) );   4 / 8

&a,&数组名,这里的a表示的是整个数组的地址,一共4个元素,地址的大小是4个字节。虽然说是整个数组的地址,但是还是通过首元素的地址来表达。

注意:首元素的地址和数组的地址虽然表现是同一个地址,但是它们的运算的结果是不一样的。

比如:&a+1和a+1,一个表示的是跳过了一个(4个整形元素的)数组的地址,一个表示的是数组第二个元素的地址

28e8fa60560a4df6bef26378a712c082.png

44445ab63d2e4185a4fa0ec1a52a5f48.png

7.printf (" %d\n ", sizeof( *&a ) );  16 

&a取的是整个数组的地址,对&a进行解引用,得到的是整个数组,一共4个元素,一个整形元素的大小为4个字节,一共是16个字节

8.printf (" %d\n ", sizeof( &a+1 ) );  4 / 8

&数组名,取的是整个数组的地址,&a再加上1,就是跳过一个数组的位置,然后再取了一个相同大小数组的地址。&a+1还是地址,地址的大小就是4 / 8个字节。

f4300d1fb13a4d5ca2ce296cc73a35a3.png

9.printf (" %d\n ", sizeof( &a[0] ) );  4 / 8

&a[0]取的是数组第一个元素的地址,大小是4个字节或者8个字节。

10.printf (" %d\n ", sizeof( &a[0]+1 ) );  4 / 8

&a[0],取的是数组第一个元素的地址,&a[0]+1就是数组第二个元素的地址。大小是4个字节或者8个字节。

8576a460e35346ad96f67c087fb32bc7.png

总结:

1.数组名大多数表示首元素的地址,有两个例外:1.sizeof(数组名)2.&数组名。数组名表示的是整个数组 。

2.不同类型地址跳过的字节不一样,&a+1,&a表示的是整个数组,+1就会跳过一个数组的大小。&a[0]+1,&a[0]是数组第一个元素的地址,所以+1跳过的是一个元素的大小。

3.地址意义可能不同,但是地址的大小都是4 / 8个字节。


字符数组

题目1:

以下打印的结果是什么?

char arr[] = {'a','b','c','d','e','f'};
1|printf("%d\n",sizeof(arr));
2|printf("%d\n",sizeof(arr+0));
3|printf("%d\n",sizeof(*arr));
4|printf("%d\n",sizeof(arr[1]));
5|printf("%d\n",sizeof(&arr));
6|printf("%d\n",sizeof(&arr+1));
7|printf("%d\n",sizeof(&arr[0]+1));

解析:

1| printf (" %d\n " , sizeof ( arr ) )  6

sizeof(数组名),取的是整个数组的大小,字符数组arr一共6个元素,所以大小为6个字节。

2|printf (" %d\n ", sizeof( arr+0 ) )  4 / 8 

arr并没有单独放在sizeof内部,所以arr表示首元素的地址,arr+0也表示首元素的地址。是地址,那么大小就为4个字节或者8个字节。

3|printf (" %d\n ",sizeof ( *arr ) )  1

arr是首元素的地址,就是 ‘a’ 的地址,然后解引用,就是‘a’,char类型,大小是1个字节。

*arr 等价于arr [ 0 ]

*(arr+0) 等价于 arr [ 0 ]

4|printf (" %d\n ", sizeof( arr[1] ) )   1

 arr[1]是数组第二个元素,‘b',大小是1个字节。

5|printf (" %d\n ", sizeof( &arr ) )   4 / 8

&arr取的是数组的地址,是地址就是4 / 8 个字节。

6|printf (" %d\n ", sizeof( &arr+1 ) )  4 / 8

&arr取的是arr数组的地址,&arr+1跳过一个(6个字符元素的)数组,下图是&arr+1的地址位置,是地址,大小就是4个字节或者8个字节。

5777d152fa5247048a45c4926bbd3b8a.png

7|printf (" %d\n ", sizeof( &arr[0]+1 ) )   4 / 8

&arr[0]取的是数组第一个元素的地址,&arr[0]+1就是第二个元素的地址,是地址,就是4个字节或者8个字节。


题目2:

以下的打印结果分别是什么?

char arr[] = {'a','b','c','d','e','f'};
1|printf("%d\n",strlen(arr));
2|printf("%d\n",strlen(arr+0));
3|printf("%d\n",strlen(*arr));
4|printf("%d\n",strlen(arr[1]));
5|printf("%d\n",strlen(&arr));
6|printf("%d\n",strlen(&arr+1));
7|printf("%d\n",strlen(&arr[0]+1));

解析:

strlen

用来求字符串长度的库函数,参数是地址,从参数传来的地址开始,直到有' \0 '停止。

4e914baee0124f0c9d149f48f6dc6570.png

1|printf (" %d\n ", strlen ( arr ) )  随机值

arr为数组首元素的地址,字符数组没有' \0 ',strlen会运行完数组,还会继续运行,直到遇到' \0',但是数组外的元素不由数组控制,也就是说,' \0 '什么时候出现是不可知的,所以会打印随机值。

下图遇到' \0 '前一共19个元素,所以打印结果为19。

' \0 '的ASCII的数字就是0.

a930f1a963e84e2daec2a9d866209b2a.png

2|printf (" %d\n ", strlen ( arr+0 ) )  随机值

arr+0也是首元素的地址,其实和前面问题的随机值是一样的。这里也将会在第20个元素遇到 ‘\0’,所以这里的随机值与 1| 一样。 

3|printf (" %d\n ", strlen ( *arr ) )  访问冲突

strlen的参数是地址,而*arr传过去的是 ’a‘ ,’a'的ASCII值为97,,不是一个地址,就会发生访问冲突,也就是野指针问题。

0df30a8d1e5342439772e9eb7465fb73.png

4|printf (" %d\n ", strlen ( arr[1] ) )  访问冲突

和前面一个问题产生的结果一样,既然strlen函数的参数是地址,将值传过去就会产生野指针的问题。

1b2750333260499497d5800b89bfde10.png

5|printf (" %d\n ", strlen ( &arr ) )  随机值

&arr传过去的是整个数组的地址,strlen用const char* str来接收,那么strlen又是怎么运行的呢?这里的地址和1|、2|类型不同,但是地址的位置是相同的,strlen也应该是从首元素开始一个一个筛查,直到遇到 ‘\0’ ,求字符串才算结束。所以这里和1|、2|的结果应该是一样的。

6|printf (" %d\n ", strlen ( &arr+1 ) )  随机值 - 6

&arr+1,&arr取的是整个数组的地址,&arr+1会跳过一个(6个char类型元素的)数组,下图标记&arr+1的地址位置,strlen函数也就是从这里开始运行,直到遇到 ‘\0’ ,那么这里的结果就会比1|、2|、5|的结果少6个元素。结果:随机值 - 6

5777d152fa5247048a45c4926bbd3b8a.png

 c56cefbf1a0d41a4b20ac22e6866bfaa.png

7|printf (" %d\n ", strlen ( &arr[0]+1 ) )  随机值 - 1

&arr[0]取的是数组第一个元素的地址,&arr[0]+1就是数组第二个元素的地址,从第二个元素开始,strlen遇到 '\0' 停止,就会比1|、2|、5|的结果少1个元素。结果:随机值 - 1.

1420b7347ef945ceac46fbf170baa20d.png

 总结:

1.strlen(const char* str)传递的参数是地址,如果传递数值的话,就会产生访问冲突的问题。

2.strlen不管地址的类型,只管地址的位置,从地址的位置开始,逐个去数字符,直到遇到 \0 ,strlen就停止运行,求出字符串的长度。


题目3:

以下打印的结果是什么?

char arr[] = "abcdef";
1|printf("%d\n",sizeof(arr));
2|printf("%d\n",sizeof(arr+0));
3|printf("%d\n",sizeof(*arr));
4|printf("%d\n",sizeof(arr[1]));
5|printf("%d\n",sizeof(&arr));
6|printf("%d\n",sizeof(&arr+1));
7|printf("%d\n",sizeof(&arr[0]+1));

解析:

char arr[] = "abcdef",这个数组的元素为[ a b c d e f \0 ],一共7个元素,字符串默认以 \0 结尾。

1|printf (" %d\n ", sizeof ( arr ) )   7

sizeof(数组名),这里的数组名表示的是整个数组,因为字符串默认为 ‘\0’ 结尾,所以这个数组有7个元素,结果为7个字节。

2|printf (" %d\n ", sizeof ( arr+0 ) )  4 / 8

arr表示的是首元素的地址,arr+0表示首元素的地址,是地址,地址的大小为4个字节或者8个字节。

3|printf (" %d\n ", sizeof ( *arr ) )   1

arr表示首元素的地址,*arr取的是‘a’,大小为1个字节。

4|printf (" %d\n ", sizeof ( arr[1] ) )  1

arr[1]为数组的第二个元素,‘b’,大小为1个字节。

5|printf (" %d\n ", sizeof ( &arr ) )  4 / 8

&arr取的是整个数组的地址,地址的大小为4个字节或者8个字节。

6|printf (" %d\n ", sizeof ( &arr+1 ) )  4 / 8

&arr取的是整个数组的地址,&arr+1跳过1个(7个元素)的数组,跳过一个数组,但是地址的类型是不变的,是还是一个数组的地址,不过既然是地址,地址的大小为4个字节或者8个字节。

7|printf (" %d\n ", sizeof ( &arr[0]+1 ) )  4 / 8

&arr[0]取的是数组第一个元素的地址,&arr+1就是数组第二个元素的地址,地址的大小为4个字节或者8个字节。

总结:

1.不管地址的类型是什么,只要是地址,地址的大小就是4个字节或者8个字节。

2.字符串相当于普通的字符数组,但是字符串通常默认 \0 为结尾。

3.sizeof 只关注占用内存空间的大小,不在乎内存中放的是什么。


题目4:

以下打印的结果是什么?

char arr[] = "abcdef";
1|printf("%d\n",strlen(arr));
2|printf("%d\n",strlen(arr+0));
3|printf("%d\n",strlen(*arr));
4|printf("%d\n",strlen(arr[1]));
5|printf("%d\n",strlen(&arr));
6|printf("%d\n",strlen(&arr+1));
7|printf("%d\n",strlen(&arr[0]+1));

解析:

char arr[] = "abcdef",这个数组的元素为[ a b c d e f \0 ],一共7个元素,字符串默认以 \0 结尾。

strlen是求字符串长度的,关注的是字符串中的 \0 ,计算的是 \0 之前出现的字符的个数。

1|printf (" %d\n" , strlen ( arr ) )   6

arr是首元素的地址,遇到 \0 停止。结果:6

2|printf (" %d\n ", strlen ( arr+0 ) )  6

6cef88ae4add4d9bb256ec7e860278be.png

3|printf (" %d\n ", strlen ( *arr ) )  访问冲突

传递的不是地址。

4|printf (" %d\n ", strlen ( arr[1] ) )  访问冲突

传递的不是地址。

5|printf (" %d\n ", strlen ( &arr ) )  6

取的是整个数组的地址,但是地址位置是首元素的地址。

a6189cc5e1184190a12252cc0e059635.png

6|printf (" %d\n ", strlen ( &arr+1 ) )  随机值

跳过了一个数组,\0也包括在这个数组里面,strlen就会往下去寻找 \0 ,结果会是随机值。

ce5c6a377b0b410d9212e4e7725448c7.png

7|printf (" %d\n ", strlen ( &arr[0]+1 ) )  5

从第二个元素开始,后面遇到 \0,一共是5个元素。 

26bbfc0f3d2e4029af0c6c7168fa0383.png

总结:

1. strlen是求字符串长度的,关注的是字符串中的 \0 ,计算的是 \0 之前出现的字符的个数。

2.sizeof 只关注占用内存空间的大小,不在乎内存中放的是什么。


题目5:

char* p = "abcdef";
1|printf("%d\n",sizeof(p));
2|printf("%d\n",sizeof(p+1));
3|printf("%d\n",sizeof(*p));
4|printf("%d\n",sizeof(p[0]));
5|printf("%d\n",sizeof(&p));
6|printf("%d\n",sizeof(&p+1));
7|printf("%d\n",sizeof(&p[0]+1));

答案:

这里的“abcdef”并不是数组,而是常量字符串,常量字符串在内存中有独立的地址。p接收的是首元素’a‘的地址。 

1|printf (" %d\n ", sizeof ( p ) )  4 / 8

p是 指针变量,存放的是’a‘的地址。地址的大小为4个字节或者8个字节。

2|printf (" %d\n ", sizeof ( p+1 ) )  4 / 8

p+1是地址。

3|printf (" %d\n ", sizeof ( *p ) )  1

*p是 ’a‘,大小是1个字节 

4|printf (" %d\n ", sizeof ( p[0] ) )  1

p[0]是’a‘,大小是1个字节。

5|printf (" %d\n ", sizeof ( &p ) )  随机值

&p是地址,p是指针变量,p存放的是常量字符串首元素’a‘的地址,但是p的地址与常量字符串没有关系,p的地址属于二级指针,一级指针的地址。所以是随机值。

218abad8da964427a1eb6ccacf597e57.png

6|printf (" %d\n ", sizeof ( &p+1 ) )  4 / 8

&p+1是地址。所以大小为4个字节或者8个字节。

41a6ad4d76e74a068636f77aebff53d2.png

7|printf (" %d\n ", sizeof ( &p[0]+1 ) )  4 / 8

&p[0]+1是地址。&p[0]就是‘a’的地址,+1就是‘b’的地址。


题目6:

char* p = "abcdef";
1|printf("%d\n",strlen(p));
2|printf("%d\n",strlen(p+1));
3|printf("%d\n",strlen(*p));
4|printf("%d\n",strlen(p[0]));
5|printf("%d\n",strlen(&p));
6|printf("%d\n",strlen(&p+1));
7|printf("%d\n",strlen(&p[0]+1));

答案:

1|printf (" %d\n ", strlen( p ) )  6

p是首元素‘a’的地址,往后6个元素,到 \0 停止。

53218d81d5c947378c779058678b5e6f.png

2|printf (" %d\n ", strlen( p+1 ) )  5

p+1是第二个元素的地址,往后5个元素,到 \0 停止。

19f9e1612a884cfc85179ef79f1c61ce.png

3|printf (" %d\n ", strlen ( *p ) )  访问冲突

strlen的参数为地址。

4|printf (" %d\n ", strlen ( p[0] ) )  访问冲突

strlen的参数为地址。

5|printf (" %d\n ", strlen ( &p ) )  随机值

p是一级指针,&p就是二级指针。p的地址和常量字符串“abcdef”没有关系。

3ab1a2eb9f5d484daff9fbd688f8d289.png

6|printf (" %d\n ", strlen( &p+1 ) )  随机值 - 1

&p取的是p的地址,&p指向p的下一位。

a00d0a1fcb7240288ce80d832e386aea.png

7|printf (" %d\n ", strlen ( &p[0]+1 ) )  5

p[0]就是’a‘,&p[0]取出了’a‘的地址,&p[0]+1就是’b‘的地址。

strlen从’b‘开始往后数,一直数到 \0为止,一共是5个元素。

28952f72d15d4243bff649cee8d86318.png

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

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

相关文章

分布式篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、如何将长链接转换成短链接,并发送短信?二、长链接和短链接如何互相转换?三、长链接和短链接的对应关系如何存储?四、如何提高系统的并发能力?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一…

航天宏图——宏图1号样例数据0.5米-5米分辨率(上海部分)

简介: 作为航天宏图“女娲星座”建设计划的首发卫星,航天宏图-1号可获取0.5米-5米的分辨率影像,具备高精度地形测绘、高精度形变检测、高分辨率宽幅成像以及三维立体成像等能力,在自然资源、应急管理、水利等行业与领域具有极高的…

【开源】基于Vue和SpringBoot的数字化社区网格管理系统

项目编号: S 042 ,文末获取源码。 \color{red}{项目编号:S042,文末获取源码。} 项目编号:S042,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5…

LCM-LoRA模型推理简明教程

潜在一致性模型 (LCM) 通常可以通过 2-4 个步骤生成高质量图像,从而可以在几乎实时的设置中使用扩散模型。 来自官方网站: LCM 只需 4,000 个训练步骤(约 32 个 A100 GPU 小时)即可从任何预训练的稳定扩散 (SD) 中提取出来&#…

【深度学习笔记】03 微积分与自动微分

03 微积分与自动微分 导数和微分导数解释的可视化偏导数梯度链式法则自动微分非标量变量的反向传播分离计算 导数和微分 假设我们有一个函数 f : R → R f: \mathbb{R} \rightarrow \mathbb{R} f:R→R,其输入和输出都是标量。 如果 f f f的导数存在,这个…

按需引入 ElMessage,没有样式且类型检查失败

文章目录 ElMessage 弹框没有样式问题描述解决方案 ts 类型检查失败问题描述解决办法 eslint 检查失败问题描述解决办法 ElMessage 弹框没有样式 问题描述 Element-plus 在使用 ElMessage 消息弹框的时候没有样式,按照官方的按需加载的方式引入的 import { ElMes…

Kafka系列 - Kafka一篇入门

Kafka是一个分布式流式处理平台。很多分布式处理系统,例如Spark,Flink等都支持与Kafka集成。 Kafka使用场景 消息系统:Kafka实现了消息顺序性保证和回溯消费。存储系统:Kafka把消息持久化到磁盘,相比于其他基于内存的…

PropertyTokenizer属性解析器实现,So Easy

PropertyTokenizer是Mybatis中的属性解析器,其主要实现原理如下: public PropertyTokenizer(String fullname) {// 判断是否以“.”分隔int delim fullname.indexOf(.);if (delim > -1) {name fullname.substring(0, delim);children fullname.su…

1 时间序列模型入门: LSTM

0 前言 循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好…

抖音小店开店指南:流程、准备和营销策略一站解析

抖音小店已成为一个热门的社交电商平台,为商家提供了一个快速、方便、低成本的开店通道。下面四川不若与众将介绍抖音小店开店的流程和需要准备的工作,帮助商家顺利开启自己的电商之路。 一、开店准备工作: 1. 产品准备:确定出售…

系列十五、BeanDefinition

一、BeanDefinition 1.1、概述 BeanDefinition是一个接口,主要负责存储bean的定义信息,决定bean的生产方式,是一个定义态的bean,类似于说明书。后续BeanFactory就可以根据这些信息生产bean了。比如实例化:可以通过反射…

浅析基于物联网的远程抄表系统的设计及应用

安科瑞 华楠 摘 要:本文基于物联网的概念,使用 ZigBee、通用分组无线服务技术两种无线通信技术相结合的方式实现远程抄表并对数据进行存储和管理。此系统设计主要分为硬件方面的设计和软件方面的设计,硬件方面的设计需要完成三个部分的硬件制…

快速认识Linux的几个指令

我们先简单认识几个指令,为之后的指令学习打好基础 打开XShell并登录云服务器 01.pwd指令 pwd命令的作用是显示当前在Linux系统中所处的路径 02.ls指令 ls命令的作业是罗列出当前路径下的文件名(即pwd的路径下),由于我们没有新…

人工智能-注意力机制之Transformer

Transformer 比较了卷积神经网络(CNN)、循环神经网络(RNN)和自注意力(self-attention)。值得注意的是,自注意力同时具有并行计算和最短的最大路径长度这两个优势。因此,使用自注意力…

【H5 Canvas】一篇通

文章目录 Canvas的创建(HTMLCanvasElement)图形绘制&#xff1a;H5为Canvas对应的2D上下文Context提供了一系列的画图接口保存save、恢复restore、变换Transformations Canvas的创建(HTMLCanvasElement) 定义canvas HTML元素&#xff0c;默认长宽300x150 <canvas width&qu…

利用chart.js来完成动态网页显示拆线图的效果

<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><%! String list"[一月份, 二月份, 三月份,四月份, 五月份, 六月份, 七月]"; String label"我的一个折线图"; String data &qu…

RocketMq架构和源码解析

NameServer&#xff1a;作为注册中心&#xff0c;提供路由注册、路由踢出、路由发现功能&#xff0c;舍弃强一致&#xff0c;保证高可用&#xff0c;集群中各个节点不会实时通讯&#xff0c;其中一个节点下线之后&#xff0c;会提供另外一个节点保证路由功能。 Broker&#xf…

为什么网上大量程序员卡35岁年龄招聘,而从来不报道测试、技术支持、售前售后工程师呢?

其实&#xff0c;网上只报道程序员卡35岁&#xff0c;这个说法并不成立。 而是普遍卡35岁&#xff0c;但并没有明确的一个职业类别。 随便搜一下&#xff0c;一眼望过去&#xff0c;其实已经波及很多行业了。 但如果你把IT从业人员合并报道&#xff0c;确实容易给人一种“程序…

Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

【Go实现】实践GoF的23种设计模式:备忘录模式

上一篇&#xff1a;【Go实现】实践GoF的23种设计模式&#xff1a;命令模式 简单的分布式应用系统&#xff08;示例代码工程&#xff09;&#xff1a;https://github.com/ruanrunxue/Practice-Design-Pattern–Go-Implementation 简介 相对于代理模式、工厂模式等设计模式&…