sizeof和strlen求取数组指针之辨析

news2024/11/26 4:37:42

目录

一维数组中sizeof Vs  strlen

整型数组sizeof

字符数组

sizeof

strlen 

字符串数组

sizeof

strlen 

字符串的指针char *p

sizeof

strlen 

二维数组中sizeof 


今天主要来讲题目主要是数组&指针辨析题和笔试题。🆗最近心情有点焦虑。大家一定专注眼前的事情,别太焦虑。

一维数组中sizeof Vs  strlen

数组名:就是数组首元素的地址,但是有2个例外。

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

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

int arr[5] ={1,2,3,4,5};

sizeof(arr)时,arr指的是整个数组,20字节。

&arr时,arr指的是整个数组的地址。

关于strlen和sizeof

  • sizeof

sizeof是操作符。
sizeof计算的占用内存的大小,单位是字节。
计算字符串是包括\0和\0之前的出现的字符个数。
计算字符是字符的个数。
sizeof计算的对象是什么类型都行。

  • strlen

strlen是库函数。
strlen是统计字符串长度的。
strlen遇到\0才停止计算。
strlen只能针对字符串,计算字符串是不包括\0。
strlen计算字符时,遇不到\0,所以随机值。
strlen是不能计算整形和字符数组的长度的,因为遇到\0才停止。

  • 注意
  • strlen求字符串长度时,统计的是在字符串\0之前的出现的字符个数
  • sizeof求字符串长度时,统计的是包括\0和\0之前的出现的字符个数
  • 必须传地址给strlen,而传合法写法给sizeof均可

整型数组sizeof

//一维数组
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))
#include<stdio.h>
int main()
{
	//一维数组
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));//✔
	//sizeof(数组名)表示整个数组,数组名a单独放在sizeof内部,计算的是整个数组的大小单位是字节,16字节
	//4个元素,每个元素是int类型(4个字节),16个字节
	//16
	printf("%d\n", sizeof(a + 0));
	//sizof(a+0),数组名a并非单独放在sizeof内部,也没有&,a表示数组首元素的地址,+0还是首元素的地址,地址无论何种类型,大小都是4/8个字节
	//4/8字节
	printf("%d\n", sizeof(*a));
	//sizeof(*a),数组名a并非单独放在sizeof内部,也没有&,a表示数组首元素的地址,*a表示解引用首元素的地址即找到第一个元素,就是1,一个整型元素的大小就是4个字节。
	//4字节
	//*a==*(a+0)==a[0]
	printf("%d ", sizeof(a + 1));//地址++和*地址++✔
	//sizeof(a+1),数组名a并非单独放在sizeof内部,也没有&,a表示首元素的地址,a+1表示第二个元素的地址,地址无论是何种类型,大小都是4/8个字节
	//4/8个字节--8个字节(64位)
	//a+1 == &a[1] 是第二个元素的地址
	//指向哪里?
	printf("%d\n", sizeof(*a + 1));
	//*a是首元素地址解引用为首元素,+1也好,++也罢。都只是往后移动一位4个字节,并没有说1+1=2 赋值这样,计算第二个元素的地址
	//4个字节
	printf("%d\n", sizeof(a[1]));
	//sizeof(a[1]),a[1]下标引用操作符,数组的下标从0开始,所以a[1]指的是第二个元素2,一个整型元素的大小是4个字节
	//4个字节
	printf("%d\n", sizeof(&a));//✔
	//sizeof(&a),a表示整个数组,&a就是把整个数组的地址都取出来,无论怎样还是表示地址,地址无论是何种类型,大小都是4/8个字节
	//4/8个字节
	//数组的地址 和 数组首元素的地址 的本质区别是类型的区别 并非大小的区别
	//a --- int* --指针--          int*p =a;解引用访问的是一个整型的大小
	//&a --- int(*)[4]--指针数组--       int*p[4]= &a;解引用访问的是一个数组的大小
	//但是对于p来说,都是存放一个地址,数组首元素的地址也好,整个数组的地址也好,都是一个地址,大小都是4/8个字节
	printf("%d\n", sizeof(*&a));
	//sizeof(*&a),a表示整个数组,&a就是把整个数组的地址都取出来,*&a就是把整个数组的地址都解引用,表示整个数组的元素,16个字节
	//16字节
	//*和&抵消了
	printf("%d\n", sizeof(&a + 1));//✔
	//sizeof(&a+1),a表示整个数组的元素,&a就是把整个数组的地址都取出来,+1就是跳过一整个a数组的元素,指向跳过后的地址处,
	//无论怎样还是表示地址,地址无论是何种类型,大小都是4/8个字节
	//4/8个字节
	//指向哪里?
	printf("%d\n", sizeof(&a[0]));
	//sizeof(&a[0]),操作符的优先级a先和[],下标引操作符结合,得到元素1;再和&结合,得到1的地址。也就是首元素的地址。
	//无论怎样还是表示地址,地址无论是何种类型,大小都是4/8个字节
	//4/8个字节
	printf("%d\n", sizeof(&a[0] + 1));
	//sizeof(&a[0]+1),同上,得到首元素地址,+1得到第二个元素的地址。
	//无论怎样还是表示地址,地址无论是何种类型,大小都是4/8个字节
	//4/8个字节
	//&a[1]
	//&a[0]+1
	//a+1
	return 0;
}
  • sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小
  • &数组名,数组名表示整个数组的地址
  • 除了以上两种情况,其他时候的数组名都是首元素的地址
    printf("%d\n", sizeof(a));//16字节
    printf("%d\n", sizeof(&a));//4/8个字节
  •  不要夹在门缝里看地址,无论是何种类型的地址,char* int* double*等都是4/8个字节
  •  在32位的平台下,4个字节。
  •  在64位的平台下,8给字节。
    	printf("%d\n", sizeof(&a));
        printf("%d\n", sizeof(a + 0));
  •  关于*p++和p++,也就是地址++和数组元素++
  •  关于地址++和数组元素++,注意数组元素++,并不是在元素本生数值上+1,也没有赋值。
  •  对于字符串的逆置的还可以回顾一下,right++和left++,以及赋值和改变的问题。
  •  关于数组名++和&数组名++所指向的位置见下图                                                                    我们需要注意的是地址++取决于指针的类型
        printf("%d ", sizeof(a + 1));
    	printf("%d\n", sizeof(*a + 1));
    	printf("%d\n", sizeof(&a + 1));//✔

字符数组

——字符数组是没有\0

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

sizeof

#include<stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };//6
	printf("%d\n", sizeof(arr));//✔
	//sizeof(arr),数组名arr单独放在sizeof内部,指的是整个数组,计算的是整个数组的元素,6个字节
	printf("%d\n", sizeof(arr + 0));//✔
	//sizeof(arr+0),arr指的是首元素地址,+0还是首元素地址,地址无论何种类型,大小就是4/8个字节
	//arr是首元素的地址 == &arr[0].是地址就是4/8个字节
	//char*
	//指针变量的大小和类型无关,不管什么类型的指针变量,大小都是4/8个字节
	//指针变量是用来存放地址的,地址存放需要多大空间,指针变量的大小就是几个字节。
	//32位环境下,地址是32个二进制,需要4个字节,所以指针变量的大小就是几个字节
	//32位环境下,地址是64个二进制,需要8个字节,所以指针变量的大小就是几个字节
	//🆗🆗请不要在门缝里看指针,把指针看扁了。
	printf("%d\n", sizeof(*arr));
	//sizeof(*arr),arr指的是首元素地址,*arr是数组的第一个元素,1个字节
	printf("%d\n", sizeof(arr[1]));
	//数组第2个元素,数组的下标从0开始,1个字节
	printf("%d\n", sizeof(&arr));//✔
	//&arr是数组的地址,指的是整个数组的地址,数组指针,char(*p)[6]=地址无论何种类型,大小就是4/8个字节
	printf("%d\n", sizeof(&arr + 1));
	//&arr+1 是跳过数组后的地址,地址无论何种类型,大小就是4/8个字节
	printf("%d\n", sizeof(&arr[0] + 1));
	//第二个元素的地址,地址无论何种类型,大小就是4/8个字节
	return 0;
}
  • 指针变量的大小和类型无关,不管什么类型的指针变量,大小都是4/8个字节。
  • 指针变量的计算和类型有关。
  • 指针变量是用来存放地址的,地址存放需要多大空间,指针变量的大小就是几个字节。   
  • 32位环境下,地址是32个二进制,需要4个字节,所以指针变量的大小就是几个字节。
  • 32位环境下,地址是64个二进制,需要8个字节,所以指针变量的大小就是几个字节。

strlen 

 我们在模拟实现strlen的功能时,写道size_t my_strlen(const char* str)                                            所以strlen接收的是字符指针,必须传地址给strlen

#include<stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };//6个没有\0
	printf("%d\n", strlen(arr));
	//arr指的是首元素的地址
	//strlen从首元素往后计算字符的个数遇到\0停止,但是在此时内存中我们不知道\0在何处
	// 此处求出应该是随机值
	printf("%d\n", strlen(arr + 0));
	//arr+0指的是首元素的地址。
	//strlen从首元素往后计算字符的个数遇到\0停止,但是在此时内存中我们不知道\0在何处
	// 此处求出应该是随机值
	printf("%d\n", strlen(*arr));
	//*arr指的是首元素。
	//把'a'的ascll码值97 传给strlen,因为strlen只接受地址。
	//所以站在strlen的角度上,认为97是一个地址,是非法地址,直接访问发生非法访问,所以会报错。err
	printf("%d\n", strlen(arr[1]));
	//arr[1]是首元素  'b'-98
	//同上err
	printf("%d\n", strlen(&arr));
	//&arr是整个数组的地址,数值上和首元素地址一样。
	//所以,strlen从首元素往后计算字符的个数遇到\0停止,但是在此时内存中我们不知道\0在何处
	// 此处求出应该是随机值
	printf("%d\n", strlen(&arr + 1));
	//&arr+1,整个数组的地址+1,跳过整个数组,指向跳过整个数组之后的元素
	// 整个数组的地址是字符数组指针类型,	// 而我们的strlen接收的是字符指针类型
	// char(*)[6]                              const char*
	//所以这里会发生类型转化

	//那我们更加不知道在内存何处会遇到\0,所以随机值
	printf("%d\n", strlen(&arr[0] + 1));
	//&arr[0]+1,首元素地址+1,即指向第二个元素的地址。
	//所以,strlen从第二个元素往后计算字符的个数遇到\0停止,但是在此时内存中我们不知道\0在何处
	// 此处求出应该是随机值
	return 0;
}
  • strlen所接受的数据,站在strlen的角度上会全部当作地址
  • strlen所接收的地址,是const char* 字符指针类型的,当其他类型传入时,会发生类型转换
  • arr+1和&arr+1在内存中所指向的空间内存分布是怎样的。要清晰的知道。 

 

字符串数组

——字符串数组有隐藏的\0

#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));
	return 0;
}
#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	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;
}

sizeof

#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7
	//计算的是整个数组的大小包括\0
	printf("%d\n", sizeof(arr + 0));//4/8
	//sizeof计算的是一个变量所占空间的大小
	//计算的是首元素地址的大小4/8
	printf("%d\n", sizeof(*arr));//1
	//计算的是首元素的大小1
	printf("%d\n", sizeof(arr[1]));//1
	//计算的是第二个元素的大小
	printf("%d\n", sizeof(&arr));//4/8
	//计算整个数组的地址4/8
	printf("%d\n", sizeof(&arr + 1));//4/8
	//计算跳过整个数组后指向的地址4/8
	printf("%d\n", sizeof(&arr[0] + 1));//4/8
    printf("%d\n", sizeof(arr + 1));
	//计算跳过首元素地址指向第二元素的地址4/8
	return 0;
}

 

strlen 

#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", strlen(arr));//6
	//首元素的地址往后计算直到遇到\0停止
	printf("%d\n", strlen(arr + 0));//6
	//首元素的地址往后计算直到遇到\0停止
	printf("%d\n", strlen(*arr));//'a'——97
	//err
	printf("%d\n", strlen(arr[1]));//'b'——98
	//err
	printf("%d\n", strlen(&arr));//6
	//整个数组的地址在数值上 == 首元素地址 往后计算直到遇到\0停止
	printf("%d\n", strlen(&arr + 1));//随机值
	//跳过整个数组后指向的地址,后面什么时候遇到\0未知,随机值
	printf("%d\n", strlen(&arr[0] + 1));//5
	printf("%d\n", strlen(arr + 1));//5
	//指向第二个元素的地址,往后计算直到遇到\0停止
	return 0;
}

 

字符串的指针char *p

在这之前可以回顾一下字符指针

C语言之指针进阶篇(1)_唐棣棣的博客-CSDN博客 

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

sizeof

#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	char* p = "abcdef";
	printf("%d\n", sizeof(p));//4/8
	//p是字符指针,存放的是地址,大小是4/8
	//p指的是首元素的地址
	printf("%d\n", sizeof(arr));//7

	printf("%d\n", sizeof(p + 1));//4/8
	//p+1,计算的是第二个元素的地址,大小4/8

	printf("%d\n", sizeof(*p));//1
	//首元素'a',指针解引用,看指针的类型,char*,是访问1个字节
	printf("%d\n", sizeof(p[0]));//1

	printf("%d\n", sizeof(&p));//4/8
	printf("%d\n", sizeof(&p + 1));//4/8
	printf("%d\n", sizeof(&p[0] + 1));//4/8
	return 0;
}
  • 对指针解引用,看指针的类型,再决定访问几个字节。
  • 指针计算,看指针的类型,再决定跳过几个字节。
  • 指针的大小,无论什么类型,都是4/8个字节

 

strlen 

#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	char* p = "abcdef";
	printf("%d\n", strlen(p));//6
	printf("%d\n", strlen(p + 1))//5
	printf("%d\n", strlen(*p));//err
	printf("%d\n", strlen(p[0]));//err
	printf("%d\n", strlen(&p));//随机值
	printf("%d\n", strlen(&p + 1));//随机值
	printf("%d\n", strlen(&p[0] + 1));//5
	return 0;
}

 

二维数组中sizeof 

//二维数组
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]));

 

✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!上面的题目有很多相似之处,所以看懂一组,相信后面都会。少说话多做事🆗🆗

代码------→【gitee:唐棣棣 (TSQXG) - Gitee.com】

联系------→【邮箱:2784139418@qq.com】

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

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

相关文章

进阶测试知识之风险基础测试

风险基础测试&#xff08;Risk-Based Testing&#xff09;是一种测试策略&#xff0c;其主要思想是根据产品或系统中各个部分的风险程度来优先进行测试。风险通常是由两个因素决定的&#xff1a;一是问题&#xff08;如缺陷或错误&#xff09;发生的可能性&#xff0c;二是如果…

嵌入式入门教学——模电基础概念

目录 1、模拟信号和模拟电路 2、研究领域 3、常用术语 3.1、共价键 3.2、电场 3.3、温度的电压当量 3.4、动态信号 3.5、直流电流和交流电流 3.6、内阻 3.7、信号频率 3.8、电容 3.9、电感 3.10、相位 3.11、信号失真 3.12、电导 3.13、跨导 3.14、电位 3.15…

【小沐学NLP】AI辅助编程工具汇总

文章目录 1、简介2、国内2.1 aiXcoder2.1.1 工具特点2.1.2 部署方式2.1.3 使用费用2.1.4 代码测试2.1.4.1 代码搜索引擎2.1.4.2 在线体验 2.2 CodeGeeX2.2.1 工具特点2.2.2 部署方式2.2.3 使用费用2.2.4 代码测试 2.3 Alibaba Cloud AI Coding Assistant&#xff08;cosy&#…

PCalc for Mac - 打开科学计算新世界的好用工具

无论您是学生、教师、科学家还是专业计算人员&#xff0c;一款强大而易于使用的科学计算器都是必不可少的工具。现在&#xff0c;我们向您介绍PCalc for Mac&#xff0c;这是一款功能齐全且界面精美的科学计算器&#xff0c;将为您带来卓越的计算体验。 PCalc for Mac是一款专…

第二章 进程与线程 五、线程(概念)

一、定义 &#xff08;1&#xff09;线程是一个基本的CPU执行单元&#xff0c;也是程序执行流的最小单位。 &#xff08;2&#xff09;引入线程后提升了系统的并发度。 &#xff08;3&#xff09;引入线程后&#xff0c;进程只作为除CPU之外的系统资源的分配单元。 二、引入…

POJ 3684 Physics Experiment 弹性碰撞

一、题目大意 我们有N个半径为R厘米的球&#xff0c;固定在距离地面高度为H的管道上&#xff0c;刚开始释放第一个&#xff0c;之后每过一秒释放一个&#xff0c;释放下面的球不会影响到上面的球的高度&#xff0c;忽略一切阻力&#xff0c;认为球之间的碰撞为弹性碰撞&#x…

传统生产者和消费者问题,Sychronized版和Lock版

1.生产者和消费者问题Synchronized版 面试&#xff1a;单例模式、排序算法、生产者消费者、死锁 package com.kuang.pc;/*** 线程之间的通信问题&#xff0c;生产者和消费者问题&#xff01; 等待唤醒 &#xff0c;通知唤醒* 线程交替执行 A B 操作同一个变量 num0* A num1;*…

无涯教程-JavaScript - ASINH函数

描述 ASINH函数返回数字的反双曲正弦值。反双曲正弦是其双曲正弦为number的值,即ASINH(SINH(number))等于number。 语法 ASINH (number)争论 Argument描述Required/OptionalNumberAny real number.Required Notes 如果指定的数字未被识别为数字值,则ASIN返回#VALUE!错误 …

想要精通算法和SQL的成长之路 - 填充书架

想要精通算法和SQL的成长之路 - 填充书架 前言一. 填充书架1.1 优化 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 填充书架 原题链接 题目中有一个值得注意的点就是&#xff1a; 需要按照书本顺序摆放。每一层当中&#xff0c;只要厚度不够了&#xff0c;当前层最高…

Chatbase:AI客服聊天机器人工具

【产品介绍】 名称 Chatbase.co 具体描述 Chatbase.co 是一个智能的聊天机器人平台&#xff0c;它可以帮助用户快速地构建、部署和分析用户的聊天机器人&#xff0c;无论 用户是一个初学者还是一个专家。用户可以使用 Chatbase.co …

什么是边缘计算网关?

边缘计算网关&#xff08;简称 边缘网关&#xff09;将云端功能扩展到本地的边缘设备&#xff0c;使边缘设备能够快速自主地响应本地事件&#xff0c;提供低延时、低成本、隐私安全、本地自治的本地计算服务。 同时所有服务都以 Docker 镜像方式安装&#xff0c;真正做到了跨平…

基础算法---离散化

概念 离散化&#xff0c;把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的时空效率。 通俗的说&#xff0c;离散化是在不改变数据相对大小的条件下&#xff0c;对数据进行相应的缩小。 也就是说当数据空间跨越太大,但是数据的个数却不多,我们可以使用…

Linux命令-文件展示

1、ls、ll命令——展示数据 ①ls命令——平铺展示数据 其中ls命令以平铺的方式展现数据 ②ll命令——列表展示数据 ll命令以列表的方式展现数据 -a选项&#xff0c;表示&#xff1a;all的意思&#xff0c;即列出全部文件&#xff08;包含隐藏的文件/文件夹&#xff09; -l选项…

Linux centos7 bash编程训练

训练编写一段代码&#xff0c;打印输出100之内的明7暗7&#xff0c;同时要求每5个数字打印在一行。 此项训练主要是考察for循环的使用&#xff0c;及条件判断表达式的设置和不同写法的应用。 常用的for循环有四种写法&#xff08;如打印1-100的整数&#xff09;&#xff1a; …

数据优化与可视化:3D开发工具HOOPS在BIM模型轻量化中的作用分析

在建筑和工程领域&#xff0c;BIM&#xff08;建筑信息建模&#xff09;是一种重要的数字化工具&#xff0c;但大型BIM模型往往需要大量的计算资源和存储空间。为了解决这一问题&#xff0c;HOOPS技术成为了一种关键工具&#xff0c;可以帮助实现BIM模型轻量化&#xff0c;提高…

docker 已经配置了国内镜像源,但是拉取镜像速度还是很慢(gcr.io、quay.io、ghcr.io)

前言 国内用户在使用 docker 时&#xff0c;想必都遇到过镜像拉取慢的问题&#xff0c;那是因为 docker 默认指向的镜像下载地址是 https://hub.docker.com&#xff0c;服务器在国外。 网上有关配置 docker 国内镜像源的教程很多&#xff0c;像 腾讯、阿里、网易 等等都会提供…

NVR添加rtsp流模拟GB28181视频通道

一、海康、大华监控摄像头和硬盘录像机接入GB28181平台配置 1、海康设备接入配置 通过web登录NVR管理系统&#xff0c;进入网络&#xff0c;高级配置界面&#xff0c;填入GB28181相关参数。 将对应项按刚才获取的配置信息填入即可&#xff0c;下面的视频通道的编码ID可以保持…

类和对象三大特性之继承

全文目录 继承的概念定义格式继承关系和访问限定符final 基类和派生类对象赋值转换继承中的作用域派生类的六个默认成员函数构造函数拷贝构造函数operator析构函数 友元和静态成员友元静态成员 各种继承形式菱形继承虚继承菱形虚拟继承对象模型 继承和组合 继承的概念 通过继承…

PyTorch深度学习(二)【反向传播、用pytorch实现线性回归】

反向传播 弄一个简单点的&#xff0c;两层的神经网络: 加入激活函数&#xff1a;&#xff08;不加激活函数的神经网络就是一个线性回归模型&#xff09; 用到的损失函数&#xff1a; pytorch里面的数据存储&#xff1a;tensor&#xff0c;它可以存标量、向量、矩阵、高维度数据…

帝国EmpireCMS_7.5_SC_UTF8漏洞复现

一、漏洞说明 EmpireCMS 7.5版本及之前版本在后台备份数据库时&#xff0c;未对数据库表名做验证&#xff0c;通过修改数据库表名 二、搭建环境 下载地址&#xff1a;http://www.phome.net/download/ 然后执行&#xff1a;http://127.0.0.1/EmpireCMS_7.5_SC_UTF8/upload/e/ins…