学C的第二十七天【指针的进阶(三)】

news2024/11/24 20:02:38

=========================================================================

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com)

 =========================================================================

接上期

学C的第二十六天【指针的进阶(二)】_高高的胖子的博客-CSDN博客

 =========================================================================

                     

复习巩固:

数组名:

数组名数组首元素的地址

但是有两个例外

                

1 . sizeof(数组名) :这里的数组名表示整个数组计算的是整个数组的大小单位字节

                

2 . &数组名 :这里的数组名表示整个数组取出的是整个数组的地址

                  

9. 指针和数组笔试题解析

补充(回顾):

  • sizeof() 是一个运算符,而 strlen() 是一个函数
  • sizeof() 计算的是变量或类型所占用的内存字节数,而 strlen() 计算的是字符串中字符的个数
  • sizeof() 可以用于任何类型的数据,而 strlen() 只能用于以空字符 '\0' 结尾的字符串
  • sizeof() 计算字符串的长度包含末尾的 '\0'strlen() 计算字符串的长度不包含字符串末尾的 '\0'

                  

(1). 一维数组相关题:

           

对应代码:

#include <stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));
	//特殊情况,这里的a为整个数组,为4*4=16字节

	printf("%d\n", sizeof(a + 0));
	//数组名a是首元素地址,a+0还是首元素地址,地址的大小为4/8字节

	printf("%d\n", sizeof(*a));
	//数组名a为首元素地址,*a就是首元素,大小是4个字节

	printf("%d\n", sizeof(a + 1));
	//数组名是首元素地址。a+1是第二个元素地址,为4/8字节

	printf("%d\n", sizeof(a[1]));
	//a[1]是数组的第二个元素,为4个字节

	printf("%d\n", sizeof(&a));
	//&a是整个数组的地址,数组地址也只是个地址,为4/8字节

	printf("%d\n", sizeof(*&a));
	//解引用整个数组的地址,相当于sizeof(a),为16个字节

	printf("%d\n", sizeof(&a + 1));
	//相当于跳过了整个数组,虽然跳过了整个数组,&a+1依然是个地址,为4/8个字节

	printf("%d\n", sizeof(&a[0]));
	//取数组首元素的地址,为4/8个字节

	printf("%d\n", sizeof(&a[0] + 1));
	//&a[0]是首元素地址,&a[0]+1就是第二个元素的地址,是地址就为4/8个字节

	return 0;
}

                

(2). 字符数组和指针相关题:

(2.1). 明确赋值的字符数组(无结束符\0):

                

对应代码:

char arr[] = { 'a','b','c','d','e','f' };
	//六个字符的字符数组,没有结束符\0
	
	printf("%d\n", sizeof(arr));
	//数组名单独放在sizeof中,这里的arr为整个数组,计算的是整个数组大小,为6个字节 -- char[6]

	printf("%d\n", sizeof(arr + 0));
	//arr表示数组首元素地址,arr+0还是数组首元素地址,是地址就为4/8个字节 -- char*
	
	printf("%d\n", sizeof(*arr));
	//arr表示数组首元素地址,*arr就是首元素,为1个字节 -- char

	printf("%d\n", sizeof(arr[1]));
	//arr[1]就是第二个元素,为1个字节 -- char

	printf("%d\n", sizeof(&arr));
	//&arr是整个数组的地址,数组地址也是地址,是地址就为4/8个字节

	printf("%d\n", sizeof(&arr + 1));
	//&arr+1是跳过整个数组后的地址,是地址就为4/8个字节

	printf("%d\n", sizeof(&arr[0] + 1));
	//为第二个元素的地址,为4/8个字节

	printf("%d\n", strlen(arr));
	//因为字符数组arr中没有\0,所以在求字符串长度时,
	//会一直往后数到未知的\0为止,是不确定的,所以会产生随机值

	printf("%d\n", strlen(arr + 0));
	//arr+0是首元素地址,所以和上面的一样会产生随机值

	printf("%d\n", strlen(*arr));
	//arr是数组首元素地址,*arr是数组的元素,是 'a' ,ACSII码为97,
	//所以strlen会从 '97' 的地址开始统计字符串长度,为非法访问内存

	printf("%d\n", strlen(arr[1]));
	//arr[1]为数组首元素,即 'a' ,所以和上面一样为非法访问内存

	printf("%d\n", strlen(&arr));
	//&arr是数组地址,数组地址和数组首元素的地址,两者的值是一样的,
	//数组地址类型char*[6],会强制转化为char*类型,所以依然从数组的首元素开始向后统计,结果为随机值

	printf("%d\n", strlen(&arr + 1));
	//&arr+1为跳过这个数组,所以从这个数组后的地址开始统计,结果为随机值

	printf("%d\n", strlen(&arr[0] + 1));
	//&arr[0]+1是第二个元素的地址,往后统计直到遇到\0,结果为随机值

                 

(2.2). 未明确赋值的字符数组(有结束符\0):

              

对应代码:

	char arr[] = "abcdef";
	//未明确定义的字符数组,有结束符\0
	//		{a b c d e f \0}

	printf("%d\n", sizeof(arr)); 
	//sizeof(数组名):计算整个数组的大小,为7个字节,包含\0 -- char [7]

	printf("%d\n", sizeof(arr + 0));
	//arr+0是首元素的地址,是地址就是4/8个字节 -- char*

	printf("%d\n", sizeof(*arr));
	//*arr为数组首元素,为1个字节 -- char

	printf("%d\n", sizeof(arr[1]));
	//arr[1]为第二个元素,为1个字节 -- char

	printf("%d\n", sizeof(&arr));
	//&arr是数组的地址,是地址就是4/8个字节 -- char* [7]

	printf("%d\n", sizeof(&arr + 1));
	//&arr为跳过arr这个数组后的地址,是地址就是4/8个字节 -- 随机地址

	printf("%d\n", sizeof(&arr[0] + 1));
	//&arr[0]+1是第二个元素的地址,是地址就是4/8个字节 -- char*

	printf("%d\n", strlen(arr));
	//统计到\0为止,即 a b c d e f ,所以结果为6

	printf("%d\n", strlen(arr + 0));
	//和上题一样,都是从数组首元素开始,\0结束,所以结果为6

	printf("%d\n", strlen(*arr));
	//strlen应该接收一个地址,从这个地址向后计算长度,
	//这里接收的是数组首元素字符'a'(char),不是地址,所以会报错

	printf("%d\n", strlen(arr[1]));
	//这里和上面一样接收的也是数组首元素字符'a',不是地址,会报错

	printf("%d\n", strlen(&arr));
	//接收数组指针char*[7],但是会被强制转化为const char*类型,
	//值还是首元素的地址,所以统计的长度还是6

	printf("%d\n", strlen(&arr + 1));
	//&arr+1是跳过这个数组后的一个地址,从这个地址往后不知道什么时候后有\0,所以结果为随机值

	printf("%d\n", strlen(&arr[0] + 1));
	//&arr[0]+1为数组的第二个元素地址,从后计算长度直到\0,所以结果为5

              

(2.3). 未明确赋值的字符指针(有结束符\0):

             

对应代码:

	char* p = "abcdef";
	//这样写是把字符串的首字符地址放入指针中,即‘a’的地址

	printf("%d\n", sizeof(p));
	//p为一级指针,存放的是地址,是地址就是4/8个字节

	printf("%d\n", sizeof(p + 1));
	//p+1是字符'b'的地址,是地址就是4/8个字节

	printf("%d\n", sizeof(*p));
	//相当于‘b’的地址,是地址就是4/8个字节

	printf("%d\n", sizeof(p[0]));
	//p[0]相当于*(p+0),即*p,为字符‘a’,为1个字节

	printf("%d\n", sizeof(&p));
	//取出一级指针p的地址,相当于p的二级指针,存放的是指针p的地址,是地址就是4/8个字节

	printf("%d\n", sizeof(&p + 1));
	//相当于指针p地址的后面一个地址,是地址就是4/8个字节

	printf("%d\n", sizeof(&p[0] + 1));
	//相当于a的地址的后一个地址,即b的地址,是地址就是4/8个字节

	printf("%d\n", strlen(p));
	//指针p存放的是‘a’的地址,所以从a的地址往后数,所以长度为6

	printf("%d\n", strlen(p + 1));
	//p+1是‘b’的地址,所以长度为5

	printf("%d\n", strlen(*p));
	//*p是字符‘a’,strlen的参数应该是const char*指针,所以会报错

	printf("%d\n", strlen(p[0]));
	//字符串可以理解为一个字符数组,所以p[0]相当于字符‘a’,会报错

	printf("%d\n", strlen(&p));
	//&是一级指针p的地址,从该地址往后数直到\0,所以结果为随机值

	printf("%d\n", strlen(&p + 1));
	//从一级指针的地址的后一个地址开始数直到\0,结果为随机值

	printf("%d\n", strlen(&p[0] + 1));
	//相当于a的地址的后一个地址,即b的地址,直到\0,所以结果为5

                

(3). 二维数组相关题:

                

对应代码:

//二维数组
	int a[3][4] = { 0 };
	//创建三行四列的二维数组

	printf("%d\n", sizeof(a));
	//三行四列每个4个字节,所以一个是3*4*4=48字节

	printf("%d\n", sizeof(a[0][0]));
	//求该二维数组0行0列的元素大小,为4个字节

	printf("%d\n", sizeof(a[0]));
	//a[0]是二维数组的第一个元素地址,即第一行地址(第一行数组的数组名)
	//相当于把数组名放入sizeof中,所以计算的是整个数组的大小,为16个字节

	printf("%d\n", sizeof(a[0] + 1));
	//这里a[0]不是单独放在sizeof中的,所以是第一行数组的首元素地址,即a[0][0]地址
	//所以a[0]+1是第一行第二个元素的地址,是地址就是4/8个字节

	printf("%d\n", sizeof(*(a[0] + 1)));
	//相当于解引用第一行数组的第二个元素地址,元素是int类型,为4个字节

	printf("%d\n", sizeof(a + 1));
	//a是二维数组首元素地址,即第一行的地址 -- int(*)[4]
	//a+1就是第二行的地址,是地址就是4/8个字节

	printf("%d\n", sizeof(*(a + 1)));
	//a+1是第二行地址--int(*)[4],*(a+1)解引用后是4个int类型的元素
	//为16个字节

	printf("%d\n", sizeof(&a[0] + 1));
	//&a[0]是二维数组第一行数组地址--int(*)[4]
	//&a[0] + 1是第二行的地址,是地址就是4/8个字节

	printf("%d\n", sizeof(*(&a[0] + 1)));
	//&a[0] + 1是第二行的地址,解引用后是4*4=16个字节

	printf("%d\n", sizeof(*a));
	//*a是解引用二维数组首元素地址,即第一行地址,为4*4=16个字节

	printf("%d\n", sizeof(a[3]));
	//a[3]看起来是越界了,但sizeof()运行时是不会访问内存的(类型属性),只看类型
	//这里a[3]的类型是int[4],为4*4=16个字节
	
	//表达式都有两个属性:1.值属性  2.类型属性
	//代码运行时:编译+链接 --> 可执行程序 --> 运行 --> 结果
	//sizeof是在 编译 时就已经有结果了(类型属性),根据类型为16个字节
	//a[3]是在 运行 是才有结果(值属性),根据运行结果应该为数组越界报错

         

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             

10. 指针笔试题

(1). 笔试题一:

             

对应代码:

#include <stdio.h>
int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };

	int* ptr = (int*)(&a + 1);
	//&a+1: 跳过该数组后的地址,再强制转化成int*类型,方便后面移动时是4个字节

	printf("%d,%d", *(a + 1), *(ptr - 1));
	//*(a+1): 是数组的第二个元素 -- 2
	//*(ptr-1): ptr刚好在整个数组后,ptr-1后指针在 5 的地址位置,所以解引用后是5

	return 0;
}

                

(2). 笔试题二:

                

对应代码:

#include <stdio.h>
//结构体的大小是20个字节(x86)
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}* p = (struct Test*)0x100000;//结构体指针变量
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
	printf("%p\n", p + 0x1); 
	//结构体指针 +1 跳过一个结构体(20个字节)
	//所以 结果 == 0x100000 + 0x14(20的十六进制数)
	//         == 0x100014

	printf("%p\n", (unsigned long)p + 0x1);
	//把原来的结构体指针的类型强制转化为(unsigned long)整数,
	//相当于普通的数值计算,+1 就是 +1
	// 结果 == 0x100000 + 0x1 == 0x100001

	printf("%p\n", (unsigned int*)p + 0x1);
	//转化为无符号整型指针,所以每次跳过4个字节(x86)
	// 结果 == 0x100000 + 0x4 == 0x100004


	return 0;
}

                

(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);
	//ptr1[-1] 等价于 *(ptr1-1)
	//%x : 以十六进制打印

	return 0;
}

                

(4). 笔试题四:

                

对应代码:

#include <stdio.h>
#include <stdio.h>
int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
	//注:这里用的是(),而不是{},()表达式的结果是最后一个
	//所以a的实际情况是:{1,3,5,0,0,0}

	int* p;
	p = a[0];
	//a[0]是二维数组的第一行第一列的地址,相当于a[0][0]

	printf("%d", p[0]); 
	//p[0] 相当于 *(p+0),即*p -- *a[0][0],解引用后为 1

	return 0;
}

                

(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]);
	//%d:
	//这里是小地址-大地址,两个相差4,又因为以%d打印
	//所以是 -4 (把补码转换为原码后打印)

	//%p:
	//以 %p 打印的话,就不考虑无符号和有符号了,直接以补码打印:
	//-4是负数,内存中存的是补码:
	//原码:10000000000000000000000000000100
	//反码:11111111111111111111111111111011
	//补码:1111 1111 1111 1111 1111 1111 1111 1100 -- 内存中存储的-4
	//      F	 F	  F    F    F    F    F    C

	return 0;
}

                

(6). 笔试题六:

                

对应代码:

#include <stdio.h>
int main()
{
	//二维数组:
	int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	//第一行: 1 2 3 4 5      第二行: 6 7 8 9 10

	int* ptr1 = (int*)(&aa + 1);
	//&aa+1:跳过整个二维数组后的当前位置的地址(10后面的位置)

	int* ptr2 = (int*)(*(aa + 1));
	//aa+1:跳过二维数组的首元素(第一行),指向第二行首元素地址
	//*(aa+1) 相当于 *aa[1][0],解引用后拿到第二行的首元素地址(6的位置)


	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
	//ptr1-1:“10”后面的地址-1,指向了10的地址
	//ptr2-1:“6”的前一个地址,指向5的地址

	return 0;
}

                

(7). 笔试题七:

                

对应代码:

#include <stdio.h>
#include <stdio.h>
int main()
{
	char* a[] = { "work","at","alibaba" };
	//相当于用三个字符指针分别存放三个字符串:
	//char* p1 = "work" -- 存放w的地址
	//char* p2 = "at" -- 存放a的地址
	//char* p3 = "alibaba" -- 存放a的地址

	char** pa = a; //存放a的首元素"p1"的地址
	
	pa++;//指向"p2"的地址

	printf("%s\n", *pa);
	//*pa:解引用指针p2的地址,p2指向"a"的地址,以%s打印为 at

	return 0;
}

                

(8). 笔试题八:

                

对应代码:

#include <stdio.h>
int main()
{
	char* c[] = { "ENTER","NEW","POINT","FIRST" };
	//相当于用四个字符指针分别存放四个字符串:
	//(下标为0)char* p1 = "ENTER" -- 存放“E”的地址
	//(下标为1)char* p2 = "NEW" -- 存放“N”的地址
	//(下标为2)char* p3 = "POINT" -- 存放“P”的地址
	//(下标为3)char* p4 = "FIRST" -- 存放“F”的地址

	char** cp[] = { c + 3,c + 2,c + 1,c };
	//相当于用四个二级字符指针分别存放四个一级指针:
	//(下标为0)char** pp1 = c+3 = &p4 -- 存放一级指针p4的地址
	//(下标为1)char** pp2 = c+2 = &p3 -- 存放一级指针p3的地址
	//(下标为2)char** pp3 = c+1 = &p2 -- 存放一级指针p2的地址
	//(下标为3)char** pp4 = c = &p1 -- 存放一级指针p1的地址

	char*** cpp = cp;
	//三级指针存放二级指针cp首元素的地址,即pp1地址

	printf("%s\n", **++cpp);
	//cpp指向pp1地址,++后指向pp2地址,
	//第一次*得到pp2内容:p3的指针(地址)
	//第二次*得到p3内容:“P”的地址
	//所以打印 "POINT"
	
	//因为++,此时cpp已经指向了pp2,不是pp1

	printf("%s\n", *-- * ++cpp + 3);
	//先进行++,cpp指向pp3
	//再进行第一次*:得到pp3内容 -- p2的指针(地址)
	//再--:p2-1 ,指向p1
	//再进行第二次*:得到p1内容 -- “E”的地址("ENTER")
	//最后进行+3:“E”的地址+3,指向“ENTER”第二个“E”
	//所以打印"ER"

	//因为++,此时cpp已经指向了pp3,不是pp2

	printf("%s\n", *cpp[-2] + 3);
	//cpp[-2] 相当于 *(cpp-2)
	//所以题目可以写成:**(cpp-2)+3
	//先进行 cpp-2 : 从指向pp3转为指向pp1
	//再进行第一次*:得到pp1内容 -- p4的指针(地址)
	//再进行第二次*:得到p4的内容 -- “F”的地址(“FIRST”)
	//最后+3:指向“FIRST”的“S”的地址
	//所以打印“ST”

	//此时cpp还是指向pp3

	printf("%s\n", cpp[-1][-1] + 1);
	//cpp[-1] 相当于 *(cpp-1)
	//所以题目可以转化为:*(cpp-1)[-1]+1
	//再转化:*(*(cpp-1)-1)+1
	//先进行cpp-1:cpp从pp3转为指向pp2
	//再进行*:得到pp2内容 -- p3的指针(地址)
	//再进行-1:p3-1 -- 得到p2的地址
	//再进行*:得到p2的内容 -- “N”的地址(“NEW”)
	//最后+1:指向“NEW”的"E"
	//所以打印“EW”

	return 0;
}

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

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

相关文章

数据结构与算法:10种常见算法

前言 本文主要讲解10种常见算法 数据结构与算法文章列表 数据结构与算法文章列表: 点击此处跳转查看 目录 1 二分查找算法 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找目标值的常用算法。它通过将目标值与数组中间元素进行比较&#xff0c;可以快…

Cesium被接入数字孪生系统后会产生怎样的改变?

众所周知&#xff0c;Cesium凭借其开源免费的特点一直垄断着整个三维GIS的生态系统&#xff0c;但是随着数字孪生技术的发展以及各项新需求的不断涌现&#xff0c;Cesium与数字孪生系统相结合的潜力也逐渐凸显。 一般而言&#xff0c;Cesium如果想要升级视效就需要去用CesiumF…

基于springboot的智慧养老系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

常用的前端可视化Web组态工具

前言 随着创新技术驱动工业物联网不断发展&#xff0c;设备联网所产生的多样化数据&#xff0c;在边缘端与云端进行大数据分析&#xff0c;成为工业应用场景数字化的需求。跨系统可通用&#xff0c;不受硬件限制达成无缝整合&#xff0c;监控组态软件SCADA成为物联网时代建构出…

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88050234

Windows bat隐藏运行窗口的几种方案

文章目录 一、背景二、测试数据三、隐藏bat运行窗口方案1. 使用VBScript脚本2. 使用mshta调用js或vbs脚本3. 将bat编译为exe程序4. 使用任务计划程序 一、背景 有些程序在执行批处理脚本时&#xff0c;可能会看到dos窗口&#xff0c;或者看到窗口一闪而过。如果批处理脚本执行…

Layui基本功能(增删改查)

话不多说&#xff0c;根据我前面的博客我们直接进行操作。记住以下的文件放置&#xff0c;防止操作出不来. 这是我们要完成的界面及功能 后台功能实现 数据查看 我们在userDao方法里面进行增删改查的方法我们在userAction进行方法的编写R工具类的介绍 查询 userDao方法 因为我…

使用亚马逊(AWS)云服务在S3上实现图片缩放功能(CloudFront/S3[AccessPoint/LambdaAccessPoint])

亚马逊云服务中的S3对象存储功能和国内阿里云的oss对象存储使用基本一致。但是涉及到存储内容处理时&#xff0c;两家有些差别。 比如&#xff1a;对于云存储中的图片资源&#xff0c;阿里云比较人性化对于基本的缩放裁剪功能已经帮我们封装好了&#xff0c;只需要在url地址后…

window环境下安装Node并修改保存缓存的位置

0, 卸载Node 打开cmd命令行窗口 输入&#xff1a; npm cache clean --force然后在控制面版中卸载node 1&#xff0c;官网下载Node.js 点击官网下载 如一台电脑需要多个node环境 可使用nvm命令进行操作安装并且可以切换 2&#xff0c; 配置环境变量 安装成功之后&#x…

竹云参编 |《数据经纪从业人员评价规范》团体标准在2023全球数字经济大会发布

经国务院批准&#xff0c;由北京市人民政府、国家发展和改革委员会、工业和信息化部、商务部、国家互联网信息办公室、中国科学技术协会共同主办的2023全球数字经济大会在中国北京国家会议中心隆重召开。 深圳竹云科技股份有限公司作为主要编制单位&#xff0c;联合深圳数据交…

新大陆物联网云平台-物联网云平台推荐-免费好用的物联网平台

一、前言 作为多年的物联网开发者&#xff0c;使用过很多付费的物联网云平台&#xff0c;包括阿里云、华为云等&#xff0c;也使用过很多免费开源的物联网云平台&#xff0c;但就操作来说&#xff0c;我认为最便利的还是新大陆物联网云平台&#xff08;NLECloud - 新大陆物联网…

【Elasticsearch】DSL查询文档

目录 1.DSL查询文档 1.1.DSL查询分类 1.2.全文检索查询 1.2.1.使用场景 1.2.2.基本语法 1.2.3.示例 1.2.4.总结 1.3.精准查询 1.3.1.term查询 1.3.2.range查询 1.3.3.总结 1.4.地理坐标查询 1.4.1.矩形范围查询 1.4.2.附近查询 1.5.复合查询 1.5.1.相关性算分 …

vagrant和vitrulBox创建虚拟机后使用xshell连接

1. 先在cmd使用vagrant ssh连接主机, 修改系统配置,允许密码登录 vi /etc/ssh/sshd_config PasswordAuthentication no 将这行的no改成yes 2. 重启ssh service sshd restart 3.打开ssh,输入主机ip 端口22 账号root 密码默认为 vagrant

解决 param image not exist 与 image format error(百度 AI)

前言 注意&#xff0c;此文的 AI&#xff0c;是指识别图文、人脸的 AI 功能&#xff0c;而不是文心一言那种对话形 AI。 最近在尝试使用百度 AI 功能&#xff0c;很有趣是不假了&#xff0c;但也有很多坑&#xff0c;特此记录一下。 正文 后文以使用 通用物体和场景识别 功能…

Linux之磁盘管理

说一下linux中磁盘分区问题 首先每一个分区都是独立的 &#xff0c;基本上来说都是可以独立分配空间的 但是一般如下目录是自动放到根目录下面的 如果根分区用完了&#xff0c;/home下面的分区空间还能用吗&#xff0c;对系统有什么影响 文件类型 给linux虚拟机扩展分区 备注&…

简爱思维导图怎么画?几个超实用绘制步骤赶紧get

简爱思维导图怎么画&#xff1f;思维导图是一种有效的信息组织和表达工具&#xff0c;能够帮助我们更好地整理思路、提高学习效率。下面这篇文章就带大家了解一下简爱思维导图的绘制步骤&#xff0c;并分享4个超实用步骤&#xff0c;助你快速掌握。 在绘制思维导图之前&#xf…

Linux中常用的监控性能的命令(sar、mpstat,vmstat, iostat,)详解

Linux中常用的监控性能的命令有&#xff1a; sar&#xff1a;能查看CPU的平均信息&#xff0c;还能查看指定CPU的信息。与mpstat相比&#xff0c;sar能查看CPU历史信息 mpstat&#xff1a;能查看所有CPU的平均信息&#xff0c;还能查看指定CPU的信息。 与sar相比&#xff0c…

解密横幅banner图的制作秘籍:一文帮你解答所有疑问

Banner是网站首页的关键元素之一。访问者进入网站后&#xff0c;一般首先看到的是Banner图。Banner图会很大程度上影响访问者对网站的第一印象&#xff0c;以及网站对访问者的吸引力。 如果banner图设计得很好&#xff0c;访问者会有兴趣继续阅读。如果Banner图设计得不好&…

【数据结构导论】第 7 章:排序

目录 一、概述 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;排序分类 &#xff08;3&#xff09;排序文件的物理表示 —— 数组表示 二、插入排序&#xff08;通过比较插入实现排序&#xff09; &#xff08;1&#xff09;直接插入排序 ① 过程 ② 算…

猜数字小游戏但多语言版本(C、Java、Golang、python、JavaScript)

文章目录 前言C语言版本语法风格应用领域C 语言实现猜数字小游戏 Java语言版本语法风格应用领域Java语言实现猜数字小游戏 GO语言版本语法风格应用领域GO语言实现猜数字小游戏 python版本语法风格应用领域python语言实现猜数字小游戏 JavaScript版本语法风格应用领域JavaScript…