进阶指针(3)——指针与数组笔试题的解析
在讲解之前我们先回顾一下,以下将要涉及的重要知识点:
1、数组名是什么?
①sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节;
②&数组名,这里的数组名表示整个数组,取出的是整个数组的地址;
③除此之外,所有的数组名都是数组首元素的地址。
2、sizeof
①sizeof是关键字(如变量名不能和关键字一样)也是操作符(功能:计算操作数的类型长度);
②sizeof的特点:sizeof内部的表达式是不计算的;
③sizeof不是函数,因为函数调用的时候,要写括号,但是sizeof后边的括号可以省略(注:变量名可以,类型不可以)。
④sizeof的计算结果是无符号的整形unsigned int。
3、strlen
①strlen是C语言提供的库函数,可以计算字符串的长度,统计的是'\0'之前的字符个数。
②函数原型:size_t strlen(const char *str),从中我们可知strlen的参数是一个地址,返回类型是无符号的整形。
总结:
①除了两种特殊情况数组名单独放在sizeof()里和&数组名,其他情况数组名都表示数组的首元素地址。
②sizeof作为操作符:计算的是操作数的类型长度,sizeof内部的表达式是不计算的。
③strlen的形参是一个地址,所以实参也要是地址。
接下来我们开始练习:
一维数组
分析代码运行后的结果:
1、整形数组
(1)sizeof——计算的是操作数的类型大小,单位字节
#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;
}
答案分析:
#include<stdio.h>int main()
{int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));//16字节,单独的数组名,计算的是整个数组的大小printf("%d\n", sizeof(a + 0));//4/8字节,不是单独的数组名,a+0是首元素的地址printf("%d\n", sizeof(*a));//4字节,*a相当于a[0],计算的是首元素的大小printf("%d\n", sizeof(a + 1));//4/8字节,不是单独的数组名,a+1是第二个元素的地址printf("%d\n", sizeof(a[1]));//4字节,a[1]是第二个元素,计算的是第二个元素的大小printf("%d\n", sizeof(&a));//4/8字节,&数组名,取的是整个数组的地址,类型是数组指针int (*)[4]printf("%d\n", sizeof(*&a));//16个字节,&数组名,取出整个数组的地址,解引用得到整个数组(*&a<-->a)printf("%d\n", sizeof(&a + 1));//4/8字节,&a+1跳过整个数组,还是数组指针(不管是否越界,只操作数关注类型)printf("%d\n", sizeof(&a[0]));//4/8字节,&a[0]取的是第一个元素的地址printf("%d\n", sizeof(&a[0] + 1));//4/8字节,&a[0]+1是第二个元素的地址return 0;
}
2.字符数组
情景1:
例如:char arr[] = {'a','b','c','d','e','f'};
(1)sizeof——计算的是操作数的类型大小
#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));return 0;
}
答案分析:
#include<stdio.h>int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr));//6字节,数组名单独放在sizeof内部,计算的是整个数组的大小printf("%d\n", sizeof(arr + 0));//4/8字节,数组名没有单独放,arr+0是数组首元素的地址printf("%d\n", sizeof(*arr));//1字节,*arr相当于arr[0]是数组首元素,计算的是首元素的大小printf("%d\n", sizeof(arr[1]));//1字节,arr[1]是第二个元素,计算的是第二个元素的大小printf("%d\n", sizeof(&arr));//4/8字节,&数组名,取出的整个数组的地址,类型是数组指针char (*)[6]printf("%d\n", sizeof(&arr + 1));//4/8字节,&arr+1,向后跳过整个数组,指向后面的空间地址,但类型不变printf("%d\n", sizeof(&arr[0] + 1));//4/8字节,&arr[0]+1是数组第二个元素的地址return 0;
}
(2)strlen——注意实参是地址,计算字符串的长度,统计的是‘\0’之前的字符个数
#include<stdio.h>int main()
{char arr[] = { 'a','b','c','d','e','f' };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>
#include<string.h>int main()
{char arr[] = { 'a','b','c','d','e','f' };//没有'\0',不知道'\0'在哪printf("%d\n", strlen(arr));//随机数,传的是数组首元素地址,类型char*printf("%d\n", strlen(arr + 0));//随机数,传的是数组首元素地址,类型char*//printf("%d\n", strlen(*arr));//err,strlen('a')-->str(97),非法访问//printf("%d\n", strlen(arr[1]));//err,'b'-98,和上面代码类似,非法访问printf("%d\n", strlen(&arr));//随机值,传的是数组指针的地址,数组指针的地址也是从数组起始地址开始的,类型char (*)[6]printf("%d\n", strlen(&arr + 1));//随机值-6,&arr+1向后跳过整个数组的地址,类型char (*)[6]printf("%d\n", strlen(&arr[0] + 1));//随机值-1,&arr[0]+1是数组第二个元素的地址,类型char*return 0;
}
情景2:
例如:char arr[] = "abcdef";
(1)sizeof——计算的是操作数类型的大小
#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", sizeof(arr));//7字节,数组名单独放在sizeof内部,计算的是整个数组的大小printf("%d\n", sizeof(arr + 0));//4/8字节,arr+0<-->&arr[0]是数组首元素的地址,类型是char*printf("%d\n", sizeof(*arr));//1字节,*arr<-->arr[0]是数组首元素,计算的是首元素大小printf("%d\n", sizeof(arr[1]));//1字节,arr[1]是第二个元素,计算的是第二个元素的大小printf("%d\n", sizeof(&arr));//4/8字节,&arr是取出整个数组的地址,类型数组指针char (*)[7]printf("%d\n", sizeof(&arr + 1));//4/8字节,&arr+1是跳过整个数组的地址,类型还是数组指针char (*)[7]printf("%d\n", sizeof(&arr[0] + 1));//4/8字节,&arr[0]+1是数组第二个元素的地址,类型char*return 0;
}
(2)strlen——注意实参是地址,计算字符串的长度,统计的是‘\0’之前的字符个数
#include<stdio.h>
#include<string.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;
}
答案解析:
#include<stdio.h>
#include<string.h>int main()
{char arr[] = "abcdef";//字符串后默认'\0'为结束标志//a b c d e f \0printf("%d\n", strlen(arr));//6字节,传的是数组首元素的地址,strlen从数组首元素地址开始统计\0之前的字符个数类型char*printf("%d\n", strlen(arr + 0));//6字节,传的是数组首元素的地址,strlen从数组首元素地址开始统计\0之前的字符个数,类型char*//printf("%d\n", strlen(*arr));//err,*arr-->a,strlen(a)-->strlen(97),传给strlen是一个非法的地址,造成非法访问//printf("%d\n", strlen(arr[1]));//err,arr[1]-->b-->98,同上,传给strlen是一个非法的地址,造成非法访问printf("%d\n", strlen(&arr));//6字节,传的是整个数组的地址,整个数组的地址也是从数组起始地址开始统计\0之前的字符个数,类型char (*)[7]printf("%d\n", strlen(&arr + 1));//随机值,&arr+1跳过整个数组的地址,类型char (*)[7]printf("%d\n", strlen(&arr[0] + 1));//5字节,传的是第二个元素的地址return 0;
}
字符指针——指向一个常量字符串的首元素地址
(1)sizeof操作符——计算操作数类型的大小
#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));return 0;
}
答案解析:
#include<stdio.h>int main()
{char* p = "abcdef";//p指针变量,指向字符串首元素的地址printf("%d\n", sizeof(p));//4/8字节,p指针变量printf("%d\n", sizeof(p + 1));//4/8字节,p+1是b的地址printf("%d\n", sizeof(*p));//1字节,*p-->a-->字符,计算的是字符的大小printf("%d\n", sizeof(p[0]));//1字节,p[0]<-->*(p+0)-->a,同上printf("%d\n", sizeof(&p));//4/8字节,&p是二级指针,指向变量p的地址printf("%d\n", sizeof(&p + 1));//4/8字节,&p+1是跳过p变量后的地址printf("%d\n", sizeof(&p[0] + 1));//4/8字节,p[0]-->a,&p[0]就是a的地址,+1就是b的地址return 0;
}
(2)strlen——注意实参是地址,计算字符串的长度,统计的是‘\0’之前的字符个数
#include<stdio.h>
#include<string.h>int main()
{char* p = "abcdef";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;
}
答案解析:
#include<stdio.h>
#include<string.h>int main()
{char* p = "abcdef";//p是指针变量,指向字符串的首元素地址printf("%d\n", strlen(p));//6字节,传的是a的地址printf("%d\n", strlen(p + 1));//5字节,传的b的地址//printf("%d\n", strlen(*p));//err,*p-->a-->97,传给strlen一个非法地址,造成非法访问//printf("%d\n", strlen(p[0]));//err,同上printf("%d\n", strlen(&p));//随机值,&p拿到的是p变量的起始地址,从这开始求字符串长度不知道\0printf("%d\n", strlen(&p + 1));//随机值,&p+1是跳过p变量的地址,从这开始求字符串长度也不知道\0位置printf("%d\n", strlen(&p[0] + 1));//5字节,&p[0]+1-->是b的地址,从b开始数字符串长度return 0;
}
二维数组
深入了解二维数组:
二维数组可以看成一维数组的数组,即一行就是是一个元素。
所以二维数组的首元素地址即第一行的地址。
例如:下图
(1)sizeof操作符——计算操作数类型的大小
#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;
}
答案分析:
#include<stdio.h>int main()
{int a[3][4] = { 0 };printf("%d\n", sizeof(a));//48字节,二维数组名单独放在sizeof内部,计算的是整个数组的大小printf("%d\n", sizeof(a[0][0]));//4字节,a[0][0]是第一行第一个元素printf("%d\n", sizeof(a[0]));//16字节,a[0]是第一行的数组名,数组名单独放在sizeof内部,//计算的就是数组(第一行)的大小printf("%d\n", sizeof(a[0] + 1));//4/8字节,a[0]作为第一行的数组名,没有单独放在sizeof内部,没有取地址,//表示的就是数组的首元素地址,a[0]即a[0][0]的地址,a[0]+1就是第一行第二个元素的地址printf("%d\n", sizeof(*(a[0] + 1)));//4字节,a[0]+1是第一行第二个元素的地址,解引用得到元素printf("%d\n", sizeof(a + 1));//4/8字节,a是二维数组的数组名,没有单独放在sizeof内部,数组名就是二维数组首元素地址,//就是第一行的地址,那a+1就是第二行的地址,类型数组指针int (*)[4]printf("%d\n", sizeof(*(a + 1)));//16字节,(a+1)是第二行的地址,解引用得到第二行printf("%d\n", sizeof(&a[0] + 1));//4/8字节,&a[0]是第一行的地址,+1是第二行的地址printf("%d\n", sizeof(*(&a[0] + 1)));//16字节,&a[0]+1是第二行的地址,解引用得到第二行,计算的就是第二行的大小printf("%d\n", sizeof(*a));//16字节,a没有单独放在sizeof内部,表示二维数组首元素的地址,就是第一行的地址,//解引用得到第一行,计算的是第一行的大小printf("%d\n", sizeof(a[3]));//16个字节,如果存在第四行,a[3]就是第四行的数组名,单独放在sizeof,计算的是第四行的大小return 0;
}
总结:
sizeof是操作符
(1)sizeof内部的表达式是不计算的。
#include<stdio.h>int main()
{int a = 2;short s = 3;printf("%d\n", sizeof(s = a + 3));printf("%d\n", s);return 0;
}
运行结果:

tip:①sizeof在编译时就执行了,而表达式求值在运行时才执行;

②表达式求值的两个属性:值属性和类型属性。
(2)sizeof只关注操作数占用内存空间的大小,单位是字节,不关心内存中存放的是什么。
strlen是库函数
(1)strlen是求字符串长度的,统计的是'\0'之前出现的字符个数,一定要找到'\0'才算结束,所以可能存在越界访问的。
相关文章:
进阶指针(3)——指针与数组笔试题的解析
在讲解之前我们先回顾一下,以下将要涉及的重要知识点: 1、数组名是什么? ①sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节; ②&数组名,这里的数…...
树与二叉树的存储与遍历
文章目录一、树概念二、二叉树三、二叉树的存储与遍历一、树概念 如前面的顺序表,链表,栈和队列都是线性的数据结构,树是非线性的结构。树可以有n个结点,n>0,当n0是就表示树为空 n>0,代表树不为空,不为空的树&am…...
28-队列练习-LeetCode622设计循环队列
题目 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通…...
你值得拥有——流星雨下的告白(Python实现)
目录1 前言2 霍金说移民外太空3 浪漫的流星雨展示 4 Python代码 1 前言我们先给个小故事,提一下大家兴趣;然后我给出论据,得出结论。最后再浪漫的流星雨表白代码奉上,还有我自创的一首诗。开始啦:2 霍金说移民外太空霍…...
【5G RRC】NR测量事件介绍
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...
PMP项管2023年5月的备考准备攻略!
2023年共有4次PMP考试,分别是3月、5月、8月、11月,由于3月份考试不开放新报名,所以第一次备考PMP的同学可以选择参加5月份考试。那么,现在备考5月份PMP考试还来得及吗? 现在开始备考5月PMP考试,时间是非常…...
Linux进程概念—环境变量
Linux进程概念—环境变量1.孤儿进程2.环境变量2.1常见环境变量2.2查看环境变量方法2.3在环境变量中添加2.4和环境变量相关的命令2.5环境变量的组织方式2.6命令行参数🌟🌟hello,各位读者大大们你们好呀🌟🌟 Ὠ…...
用JS+CSS打造你自己的弹幕王国,让网页动起来!
文章目录前言主要内容实现方法DOM方法显现效果代码CANVAS方法显现效果代码总结更多宝藏前言 😎🥳😎🤠😮🤖🙈💭🍳🍱 用JSCSS打造你自己的弹幕王国,…...
C++ LinuxWebServer 2万7千字的面经长文(上)
⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 前言 Linux Web Server项目虽然是现在C求职者的人手一个的项目,但是想要吃透这个项目ÿ…...
vue3 解决各场景 loading过度 ,避免白屏尴尬!
Ⅰ、前言 当我们每次打卡页面,切换路由,甚至于异步组件,都会有一个等待的时间 ;为了不白屏,提高用户体验,添加一个 loading 过度动画是 非常 常见的 ;那么这几种场景我们应该把 loading 加在哪…...
基于sringboot和小程序实现高校食堂移动预约点餐系统演示【源码】
基于sringboot实现高校食堂移动预约点餐系统演示开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件&am…...
开源操作系统与Windows大比拼!
科技网站ZDNet近日撰文称,在一个用户为王的时代,操作系统们为了获得青睐都放下了身段,采用免费策略,但其中却有一个例外——Windows 10。这样的一反常理让许多人不看好Windows的未来,难道这个我们最熟悉的朋友真的会成…...
RTL8201 以太网PHY芯片 调试记录
一、概述 为了尽量给甲方降低成本,决定使用较低成本的PHY芯片RTL8201F-VB-CG芯片。移植官网的以太网demo程序,git上下载了一份很好看的rtl8201F的驱动程序,用来替换官方demo的lan8742程序。并没有直接通,于是开始了调试之路。 二…...
Java中Static关键字的五种用法详解
Static的五种用法大致如下: 修饰成员变量,使其成为类变量,也叫静态变量修饰成员方法,使其成为类方法修饰内部类,使其成为静态内部类静态代码块静态导包 直接一点,static关键字就是把属性和方法变为类相关&…...
WebSocket 测试工具
一、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直…...
低代码开发的未来~
IT 团队依靠笨重的软件开发流程和劳动密集型的手工编码来构建有形、可靠和现代应用程序的时代即将结束。随着新自动化技术的兴起、渴望创新的客户和最终用户的期望和需求迅速提高以及开发人员的短缺,软件行业被迫寻求替代方法,不仅提供服务和产品&#x…...
蓝桥杯真题——模拟灌溉系统
尽量每天都自己写一遍模板,记住模板就好写了 以下内容直接在模板内进行 基本任务:要求“模拟智能灌溉系统”能够实现土壤湿度测量、土壤湿度和时间显示、湿度阈值设 定及存储等基本功能。通过电位器 Rb2 输出电压信号,模拟湿度传感器输出信号…...
【数据结构】双向链表实现
Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 一、什么是双向链表 二、双向链表的实现 一、什么是双向链表 双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向直接后…...
无公网IP,SSH远程连接Linux CentOS服务器【内网穿透】
文章目录1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不需要设置路由器。 …...
CentOS 7+Docker搭建rabbitMQ无法访问15672端口
CentOS 7Docker搭建rabbitMQ无法访问15672端口 1.我拉取的镜像自带管理UI界面 所以不可能是没有开启管理UI界面的原因 2.防火墙关闭状态 所以也不是防火墙的问题 3.在虚拟机本机localhost:15672也访问不了 4.端口监听是正常的 5.最后发现我容器内curl能够通,容…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

