用试题这把“剑“帮你破除指针与数组之间的那些猫腻

news2024/12/25 9:16:48

作者主页:paper jie的博客_CSDN博客-C语言,算法详解领域博主

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文录入于《系统解析C语言》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将C语言基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《C语言》《算法详解》《C语言-语法篇》

内容分享:本期对C语言中的指针的进阶知识进行进行具体讲解,各位看官姥爷快搬好小板凳坐好叭。

    -------- 不要998,不要98,只要一键三连,三连买不了吃亏,买不了上当

目录

写在前面

指针与一维数组

解析:

代码

指针与字符指针

char arr[] = { 'a','b','c','d','e','f' }

解析 

代码

char arr[] = "abcdef"

分析

代码

char* p = "abcdef"

分析 

代码

指针与二维数组

分析

代码 


写在前面

在开始前我们要注意两个知识点:

1. sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小

2. &数组名,这里的数组名表示的是整个数组,取出的是整个数组的大小

3. 除此之外,其他的数组名都是首元素的地址

指针与一维数组

解析:

sizeof(a) 计算的是整个数组的大小 。

sizeof(a+0): a不是sizeof(a),也不是&a 所以他是首元素地址 +0,它是1的地址 是一个整型指针 4个字节 。

sizeof(*a): *a就是1 1是一个整型  sizeof(*a) = 4。

sizeof(a+1): a+1 是首元素的地址加一 跳过一个整型,是2的地址 还是一个整型指针 4个字节。 

sizeof(a[1]): a[1]=2 2是整型 4个字节。

sizeof(&a): &a取出的是整个数组 但它本质上还是一个整型指针 4个字节。

sizeof(*&a): &a取出的是整个数组 解引用得到的是整个数组的内容 里面有4个整型。

sizeof(&a+1):  &a+1是跳过这个数组指向后面的内容 但还是一个指针 .。

sizeof(&a[0]): &a[0]是取出a[0]的地址 是一个整型指针。

sizeof(&a[0]+1): &a[0]+1 是a[1]的地址 是一个整型指针.

代码

#include <stdio.h>

int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));
	//16
	//sizeof(a) 计算的是整个数组的大小
	printf("%d\n", sizeof(a + 0));
	//4
	//a不是sizeof(a),也不是&a 所以他是首元素地址 +0
	//它是1的地址 是一个整型指针 4个字节 
	printf("%d\n", sizeof(*a));
	//4
	//*a就是1 1是一个整型  sizeof(*a) = 4
	printf("%d\n", sizeof(a + 1));
	//4
	//a+1 是首元素的地址加一 跳过一个整型
	//是2的地址 还是一个整型指针 4个字节
	printf("%d\n", sizeof(a[1]));
	//4
	//a[1]=2 2是整型 4个字节
	printf("%d\n", sizeof(&a));
	//4
	//&a取出的是整个数组 但它本质上还是一个整型指针 4个字节
	printf("%d\n", sizeof(*&a));
	//16
	//&a取出的是整个数组 解引用得到的是整个数组的内容 里面有4个整型
	printf("%d\n", sizeof(&a + 1));
	//4
	//&a+1是跳过这个数组指向后面的内容 但还是一个指针 
	printf("%d\n", sizeof(&a[0]));
	//4
	//&a[0]是取出a[0]的地址 是一个整型指针
	printf("%d\n", sizeof(&a[0] + 1));
	//&a[0]+1 是a[1]的地址 是一个整型指针

	return 0;
}

指针与字符指针

char arr[] = { 'a','b','c','d','e','f' }

解析 

arr 是计算整个数组的大小,6个char类型 6

arr+0  首元素地址加0 指向的还是a 它是一个地址就是指针,是指针就是4个字节

*arr arr是首元素的地址,解引用就是a 计算的就是首元素a的大小 char类型 1

arr[1] 是第二个元素,计算的是第二个元素的大小 1

&arr 取出的是整个数组 但它本质是一个char指针 计算的就是一个cha类型的指针r

&arr+1 取出整个数组的地址再加1,跳过整个数组 这是一个指向数组后一个元素的指针 

&arr[0]+1 取出第一个元素的地址加1 就是第二个元素的地址,本质上还是一个指针 

strlen(arr) arr是首元素地址 计算的是arr数组元素的个数,从第一个元素开始计算在遇到\0不会停止,arr数组没有\0 它是一个随机值

strlen(arr+0) arr+0是首元素的地址 从第一个元素开始计算到\0停止 arr数组没有\0 随机值

strlen(*arr) 是第一个元素是一个字符 但是strlen函数的参数需要一个指针类型 所以err

strlen(arr[1]) arr[1]是一个字符 不合strlen需要的参数

strlen(&arr) 取出的是整个数组 本质上还是一个指针,等于首元素的地址,arr数组里没有\0 它是一个随机值

strlen(&arr+1) &arr+1是跳过整个数组,指向数组后面的内容  从这里开始计算,遇到\0停止 随机 

strlen(&arr(&arr[0]+1) &arr[0]+1取出第二个元素的地址 从第二个元素开始计算,遇到\0停止 随机 

代码

	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));
	//6
	//arr 是计算整个数组的大小,6个char类型 6
	printf("%d\n", sizeof(arr + 0));
	//arr+0  首元素地址加0 指向的还是a 它是一个地址就是指针,是指针就是4个字节
	printf("%d\n", sizeof(*arr));
	//1
	//*arr arr是首元素的地址,解引用就是a 计算的就是首元素a的大小 char类型 1
	printf("%d\n", sizeof(arr[1]));
	//1
	//arr[1] 是第二个元素,计算的是第二个元素的大小 1
	printf("%d\n", sizeof(&arr));
	//4
	//&arr 取出的是整个数组 但它本质是一个char指针 计算的就是一个cha类型的指针r
	printf("%d\n", sizeof(&arr + 1));
	//4
	//&arr+1 取出整个数组的地址再加1,跳过整个数组 这是一个指向数组后一个元素的指针 
	printf("%d\n", sizeof(&arr[0] + 1));
	//4
	//&arr[0]+1 取出第一个元素的地址加1 就是第二个元素的地址,本质上还是一个指针 
	printf("%d\n", strlen(arr));
	//随机值
	//strlen(arr) arr是首元素地址 计算的是arr数组元素的个数,从第一个元素开始计算在遇到\0不会停止,arr数组没有\0 它是一个随机值
	printf("%d\n", strlen(arr + 0));
	//随机值 
	//strlen(arr+0) arr+0是首元素的地址 从第一个元素开始计算到\0停止 arr数组没有\0 随机值
	printf("%d\n", strlen(*arr));
	//err
	//strlen(*arr) 是第一个元素是一个字符 但是strlen函数的参数需要一个指针类型 所以err
	printf("%d\n", strlen(arr[1]));
	//err
	//strlen(arr[1]) arr[1]是一个字符 不合strlen需要的参数
	printf("%d\n", strlen(&arr));
	//随机值
	//strlen(&arr) 取出的是整个数组 本质上还是一个指针,等于首元素的地址,arr数组里没有\0 它是一个随机值
	printf("%d\n", strlen(&arr + 1));
	//随机值
	//strlen(&arr+1) &arr+1是跳过整个数组,指向数组后面的内容  从这里开始计算,遇到\0停止 随机 
	printf("%d\n", strlen(&arr[0] + 1));
	//strlen(&arr(&arr[0]+1) &arr[0]+1取出第二个元素的地址 从第二个元素开始计算,遇到\0停止 随机 

char arr[] = "abcdef"

分析

"abcdef"里面包含的有:a b c d e f \0  

arr sizeof(arr)是计算整个数组的大小 arr数组里面隐藏了\0 ,得算上\0    7

arr+0 是首元素的地址 计算的就是一个地址的大小 4

*arr 是首元素 计算的就是一个char类型 1

arr[1] 是第二个元素 计算的是一个char类型 1

&arr 取出的是整个数组 它是一个地址 计算的就是地址的大小 4

&arr+1 数组的地址+跳过一个数组 它还是一个地址 计算的就是地址 4

&arr[0]+1 是第二个元素的地址 计算的就是地址 4

arr 计算的是整个数组的个数 strlen遇到\0停止 \0不加入计算 6

arr+0 是首元素的地址 它作为给strlen的参数 从首元素开始计算到\0停止 6

*arr *arr是首元素,它不是地址 strlen的参数要指针 所以err

arr[1] 是第二个元素,它不是地址 strlen的参数要指针 所以err

&arr 取出的是整个元素的大小 但它本质上还是和首元素地址一样 所以从首元素开始计算到\0停止 6

&arr+1 就是跳过整个数组,指向后面的空间,也跳过了数组中的\0, 所以从后面的空间开始到\0 是随机的

&arr[0]+1 是第二个元素的地址 就是从第二个元素开始计算到\0停止 5

代码

	char arr[] = "abcdef";
	//里面包含的有:a b c d e f \0 
	printf("%d\n", sizeof(arr));
	//7
	//arr sizeof(arr)是计算整个数组的大小 arr数组里面隐藏了\0 ,得算上\0    7
	printf("%d\n", sizeof(arr + 0));
	//4
	//arr+0 是首元素的地址 计算的就是一个地址的大小 4
	printf("%d\n", sizeof(*arr));
	//1
	//*arr 是首元素 计算的就是一个char类型 1
	printf("%d\n", sizeof(arr[1]));
	//1
	//arr[1] 是第二个元素 计算的是一个char类型 1
	printf("%d\n", sizeof(&arr));
	//4
	//&arr 取出的是整个数组 它是一个地址 计算的就是地址的大小 4
	printf("%d\n", sizeof(&arr + 1));
	//4
	//&arr+1 数组的地址+跳过一个数组 它还是一个地址 计算的就是地址 4
	printf("%d\n", sizeof(&arr[0] + 1));
	//4
	//&arr[0]+1 是第二个元素的地址 计算的就是地址 4
	printf("%d\n", strlen(arr));
	//6
	//arr 计算的是整个数组的个数 strlen遇到\0停止 \0不加入计算 6
	printf("%d\n", strlen(arr + 0));
	//6
	//arr+0 是首元素的地址 它作为给strlen的参数 从首元素开始计算到\0停止 6
	printf("%d\n", strlen(*arr));
	//err
	//*arr *arr是首元素,它不是地址 strlen的参数要指针 所以err
	printf("%d\n", strlen(arr[1]));
	//err
	//arr[1] 是第二个元素,它不是地址 strlen的参数要指针 所以err
	printf("%d\n", strlen(&arr));
	//6
	//&arr 取出的是整个元素的大小 但它本质上还是和首元素地址一样 所以从首元素开始计算到\0停止 6
	printf("%d\n", strlen(&arr + 1));
	//随机值
	//&arr+1 就是跳过整个数组,指向后面的空间,也跳过了数组中的\0, 所以从后面的空间开始到\0 是随机的
	printf("%d\n", strlen(&arr[0] + 1));
	//5
	//&arr[0]+1 是第二个元素的地址 就是从第二个元素开始计算到\0停止 5

char* p = "abcdef"

分析 

p p是字符串首元素的地址 计算的就是一个指针 4

p+1 第二个字符的地址 计算的就是一个指针 4

*p 第一个字符 计算的是一个char类型 1

p[0] ==*(p+0) 第一个字符 计算的是一个char类型 1

&p &p是第一个字符的地址的地址 一个二级指针 计算就是一个指针 4

&p+1 是二级指针加1 跳过一个char**类型 还是一个指针 计算就是一个指针 4

&p[0]+1 第二个字符的地址 是一个指针 计算的就是一个指针 4

p 首字符的地址 strlen通过第一个字符地址向后计算,到\0停止

p+1 第二个字符的地址 strlen通过第二个字符地址向后计算 到\0停止

*p 首字符 strlen参数只接收指针 err

p[0] 首字符 strlen参数只接收指针 err

&p 是首元素的地址的地址  strlen计算的是首元素的地址 相当于地址变成了它要计算的内容 里面不知道有没有\0 就是随机值

&p+1 二级指针加1 strlen计算的是首元素的地址加一  它的内容还是一个指针 随机值

&p[0]+1 第二个元素的地址 从第二个元素开始计算遇到\0停止 5

代码

	char* p = "abcdef";
	printf("%d\n", sizeof(p));
	//4
	//p p是字符串首元素的地址 计算的就是一个指针 4
	printf("%d\n", sizeof(p + 1));
	//4
	//p+1 第二个字符的地址 计算的就是一个指针 4
	printf("%d\n", sizeof(*p));
	//1
	//*p 第一个字符 计算的是一个char类型 1
	printf("%d\n", sizeof(p[0]));
	//1
	//p[0] ==*(p+0) 第一个字符 计算的是一个char类型 1
	printf("%d\n", sizeof(&p));
	//4
	//&p &p是第一个字符的地址的地址 一个二级指针 计算就是一个指针 4
	printf("%d\n", sizeof(&p + 1));
	//4
	//&p+1 是二级指针加1 跳过一个char**类型 还是一个指针 计算就是一个指针 4
	printf("%d\n", sizeof(&p[0] + 1));
	//4
	//&p[0]+1 第二个字符的地址 是一个指针 计算的就是一个指针 4
	printf("%d\n", strlen(p));
	//6
	//p 首字符的地址 strlen通过第一个字符地址向后计算,到\0停止
	printf("%d\n", strlen(p + 1));
	//p+1 第二个字符的地址 strlen通过第二个字符地址向后计算 到\0停止
	printf("%d\n", strlen(*p));
	//err
	//*p 首字符 strlen参数只接收指针 err
	printf("%d\n", strlen(p[0]));
	//err
	//p[0] 首字符 strlen参数只接收指针 err
	printf("%d\n", strlen(&p));
	//随机值
	//&p 是首元素的地址的地址  strlen计算的是首元素的地址 相当于地址变成了它要计算的内容 里面不知道有没有\0 就是随机值
	printf("%d\n", strlen(&p + 1));
	//随机值
	//&p+1 二级指针加1 strlen计算的是首元素的地址加一  它的内容还是一个指针 随机值
	printf("%d\n", strlen(&p[0] + 1));
	//5
	//&p[0]+1 第二个元素的地址 从第二个元素开始计算遇到\0停止 5

指针与二维数组

 

分析

a sizeof(a)是计算整个二维数组的大小 12*4
a[0][0] 第一行的第一个元素 计算一个整型大小 4

a[0] 代表了数组第一行 可以理解为第一行的数组名 sizeof(数组名)整个数组的大小 16

a[0]+1 表示第一行第二个元素的地址 一个指针 4

*(a[0]+1) 表示第一行的第二个元素 一个整型 4

a+1 a是第一行的地址+1 第二行的地址 一个指针 4

*(a+1) 表示第二行的元素 4个整型 16

&a[0]+1 &a[0]是取出第一行的地址在加一 就是第二行的地址 4

*(&a[0]+1)第二行的地址解引用 得到第二行的4个元素 16

*a a是二维数组首元素的地址 就是第一行的地址 解引用 4个整型 16

a[3]  这里我们不管a[3]越界了 我们只要知道它的类型是一个int [4] sizeof求的就是类型 16

代码 

int a[3][4] = { 0 };
printf("%d\n", sizeof(a));
//48
//a sizeof(a)是计算整个二维数组的大小 12*4
printf("%d\n", sizeof(a[0][0]));
//4
//a[0][0] 第一行的第一个元素 计算一个整型大小 4
printf("%d\n", sizeof(a[0]));
//16
//a[0] 代表了数组第一行 可以理解为第一行的数组名 sizeof(数组名)整个数组的大小 16
printf("%d\n", sizeof(a[0] + 1));
//4
//a[0]+1 表示第一行第二个元素的地址 一个指针 4
printf("%d\n", sizeof(*(a[0] + 1)));
//
//*(a[0]+1) 表示第一行的第二个元素 一个整型 4
printf("%d\n", sizeof(a + 1));
//4
//a+1 a是第一行的地址+1 第二行的地址 一个指针 4
printf("%d\n", sizeof(*(a + 1)));
//16
//*(a+1) 表示第二行的元素 4个整型 16
printf("%d\n", sizeof(&a[0] + 1));
//4
//&a[0]+1 &a[0]是取出第一行的地址在加一 就是第二行的地址 4
printf("%d\n", sizeof(*(&a[0] + 1)));
//16
//*(&a[0]+1)第二行的地址解引用 得到第二行的4个元素 16
printf("%d\n", sizeof(*a));
//16
//*a a是二维数组首元素的地址 就是第一行的地址 解引用 4个整型 16
printf("%d\n", sizeof(a[3]));
//16
//a[3]  这里我们不管a[3]越界了 我们只要知道它的类型是一个int [4] sizeof求的就是类型 16

通过这些奇形怪状的试题,我们一步一步的解析,到现在想必大家对与指针与数组已经门清了儿叭!

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

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

相关文章

【linux】在Linux系统开机的时候卡在/dev/nvme0n1p1:clean / files / blocks界面进不去

一、问题背景 开机的时候没办法开机&#xff0c;一直停留在下面这个界面。 x86/cpu: SGX disabled by BIOS dev/nvme0n1p3:clean, 21118/30523392 fies, 122066176/122070272 blocks dev/nvme0n1p4:clean, 486125/61038592 fies,21657184/244140544b1ocks 试过网上的一些方法…

Ubuntu20.04+Intel SGX(一):环境安装与测试

文章目录 测试环境一、检查服务器是否支持SGX方法1&#xff1a;cpuid查看是否支持SGX方法2&#xff1a;test-sgx.c测试是否支持SGX验证是否支持SPS 二、启动 SGX 服务参考文档启动 SGX方法1&#xff1a;BIOS 启动SGX方法2&#xff1a;软启动 SGX检查SGX是否开启成功 三、安装 S…

C++在线五子棋对战(网页版)项目:环境搭建

Centos-7.6环境搭建 安装wget工具 wget工具是Linux中的一个下载文件的工具&#xff0c;支持通过 HTTP、HTTPS、FTP 三个最常见的TCP/IP协议 下载&#xff0c;并可以使用 HTTP 代理。可以使用以下命令进行下载&#xff1a; sudo yum install wget 下载后&#xff0c;可以使用以…

【Linux】CentOS7 设定本机当前地区时间为虚拟机时间的简单操作

目录 情景系统环境操作 情景 新安装的虚拟机时间和当前本地系统时间不一致&#xff0c;现在想要将虚拟机和本机地区的时间调节为一致。 系统环境 CentOS Linux 7 系统界面大致如此。 操作 点击虚拟机界面左上角的 Applications 选项&#xff0c; 选择System-Tools-- Sett…

【C++】C++关于异常的学习

文章目录 C语言传统的处理错误的方式一、异常的概念及用法二、自定义异常体系总结 C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 1. 终止程序&#xff0c;如 assert &#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除 0 错误时就会终止…

【Python】元组 创建 访问 切片 拼接 解包

2.3 元组 元组在输出时总是有括号的。 元组在输入时可以没有。 像字符串一样&#xff0c;元组是不可变的。 索引、切片以及一些方法很多与列表相似。 1&#xff09;定义 元组是一种不可变序列&#xff0c;它与列表类似&#xff0c;但元组的元素不能修改。元组中的元素可以是任意…

【Vuejs】1720- 详细聊一聊 Vue3 动态组件

&#x1f449; 「相关文章」 深入浅出 Vue3 自定义指令6 个你必须明白 Vue3 的 ref 和 reactive 问题初中级前端必须掌握的 10 个 Vue 优化技巧分享 15 个 Vue3 全家桶开发的避坑经验 动态组件[1]是 Vue3 中非常重要的一个组件类型&#xff0c;它可以让我们在不同的场景下灵活地…

Git远程仓库使用

说明&#xff1a;使用Git&#xff0c;可以实现版本控制和协作开发。需要协作开发&#xff0c;当然需要建立一个Git代码托管的平台。目前可以使用GitHub、码云、GitLab等&#xff0c;码云相当于国内的GitHub&#xff0c;在国内访问速度高于GitHub&#xff1b;而GitLab是搭建私服…

阿里云服务器的可靠性和稳定性如何?是否有SLA保障?

阿里云服务器的可靠性和稳定性如何&#xff1f;是否有SLA保障&#xff1f;   一、阿里云服务器的可靠性   阿里云服务器作为全球领先的云计算服务平台&#xff0c;以其高性能、高可靠性和高安全性获得了广泛好评。为满足企业客户对稳定、可靠云服务的需求&#xff0c;阿里云…

「译文」用ChatGPT助力SEO工作

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 那些使用ChatGPT的先进人士&#xff0c;也没还能完全掌握它内容生成的能力&#xff0c;特别是像博客那样的长文写作能力。 现在&#xff0c;跟大家介绍 一下SEO优…

GeoServer中使用Qgis发布的SLD样式进行图层美化

目录 知识地图 一、前言 二、Qgis符号化转变成SLD 1、Qis中符号化生成 2、SLD样式导出 三、GeoServer数据发布 1、矢量图层发布 2、在GeoServer中发布样式 总结 知识地图 序号博文链接1使用LeafLet叠加Geoserver wms图层到已有底图的方法2关于GeoServer发布服务时数据源…

windows -- 自动安装python包,并启动服务

文章目录 定制python的包编写批处理文件遇到的问题 自动安装python的包&#xff0c;并启动后台服务进程。 定制python的包 基于python的Flask框架&#xff0c;简单开发一个服务器&#xff1b;编写发布python包的setup.py 在my_ff包的同级目录下创建一个setup.py&#xff0c…

【跟小嘉学 Rust 编程】三、Rust 的基本程序概念

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 文章目录 系列文章目录前言一、变量以及可变性1.1、变量声明语法1.2、不可变变量1.3、未使用变量警告1.4、使用 let mu…

【雕爷学编程】Arduino动手做(119)---JQ6500语音模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

计算机网络——网络层

序言 计算机网络中的网络层在当今的社会起到了什么作用&#xff1f; 现在的互联网通信&#xff0c;远程办公和远程教育&#xff0c;电子商务和在线服务&#xff0c;信息共享和社交媒体&#xff0c;物联网和智能家居都是通过网络层才能使用的。它连接了人们、设备和信息&#xf…

学习笔记:CMOS、MOS、NMOS、PMOS、MOSFET等的区别

复习时 发现连基础概念都不知道&#xff0c;连忙来找补 FET 把P型半导体放入电场中&#xff0c;根据同电荷排斥、异电荷吸引&#xff0c;电荷情况如下&#xff1a; 这种效应称为电场效应&#xff08;Field Effect&#xff09;&#xff0c;依据这种现场所发明的半导体器件称为…

回归、多项式回归、多重回归

1.回归、多项式回归、多重回归 1.1 回归&#xff08;单变量&#xff09; 预测一个变量 x x x与一个变量 y y y的关系 例如&#xff1a;广告费 x x x与点击量 y y y 用直线拟合数据 1.2 多项式回归&#xff08;单变量&#xff09; 预测一个变量 x x x与一个变量 y y y的关系…

mtk preloader简介

前言 preloader按照mtk的说法是MTK in-house developed loader&#xff0c;也就说是mtk内部开发的一个loader&#xff0c;那么单独编译preloader也是可以的&#xff0c;使用命令./mk project_name n pl。 文章目录 前言计算机系统中常用的存储器类型1、启动流程2、下载流程3、代…

React学习[三]

React学习[三] 组件的propsprops的基本使用props的特点 组件通讯的三种方式父组件传递数据给子组件子组件传递数据给父组件兄弟组件传递 Contextprops进阶children属性props校验约束规则 props的默认值 组件的生命周期生命周期三个阶段创建时&#xff08;挂载阶段&#xff09;更…

代理Windows台式机支持Remote Desktop外网远程桌面连接, 随时玩转Stable Diffusion WebUI

title: 《树莓派4B家庭服务器搭建指南》第十八期&#xff1a;代理Windows台式机支持Remote Desktop外网远程桌面连接, 随时玩转Stable Diffusion WebUI zhaoolee在家中Windows台式机折腾Stable Diffusion WebUI , 为了出门在外也能访问Windows台式机的Stable Diffusion WebUI&…