打卡:4.20 C语言篇 -初识C语言 - (10)关键字typedefstatic
Posted 小奔同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打卡:4.20 C语言篇 -初识C语言 - (10)关键字typedefstatic相关的知识,希望对你有一定的参考价值。
C语言篇 -(1)初识C语言 - (10)关键字typedef、static
目录末尾
🔥typedef
🎸typedef 顾名思义是类型定义,这里应该理解为类型重命名。
🎸它在很多关于类型的地方都会用到
typedef unsigned int uint;
int main()
unsigned int num = 0;
uint num = 0;
return 0;
🎸
unsigned int
这个叫无符号整型,一般我们写这个比较麻烦,我们来把它重定义一下,改个名字,改成uint
,typedef unsigned int uint;
它的意思就是把unsigned int
重命名为uint
,是不是方便了很多,名字改了,但是作用都是一样的
🎸再比如:
struct Node
int data;
struct Node* next;
🎸它是一个结构体类型,非常抽象,不好理解,我们要创建一个节点
n
,就像这样
struct Node n;
🎸我们不想写这么长只想写一个
Node
,我们就重命名一下它,
🎸像这样:
typedef struct Node
int data;
struct Node* next;
Node;
🎸我们再要创建一个节点
n2
就可以像这样
Node n2;
🎸这样是很方便的
🎸再强调一遍typedef
只能对类型重命名,只能针对类型
🔥static
🎸在C语言中:
🎸static是用来修饰变量和函数的
- 修饰局部变量-称为静态局部变量
- 修饰全局变量-称为静态全局变量
- 修饰函数-称为静态函数
🎸我们来一一来说一下
🔥🔥static修饰的局部变量
🎸写一个代码来了解一下:
🎸你猜一下这个代码运行的结果是多少?
void test()
int a = 1;
a++;
printf("%d\\n", a);
int main()
int i = 0;
while (i < 5)//循环5次
test();
i++;
return 0;
运行的结果:🎸
2
2
2
2
2
🎸看到这里的可以一步一步根据代码推一下,可以看到a在每一次的循环中的int a = 1;都会被重新赋予1的值,然后再a++;所以输出的都是2
(进作用域,a被定义,出作用域,a被销毁)
🎸那我们来用static来修饰一下int a = 0;来看一下
void test()
static int a = 1;//static来修饰一下
a++;
printf("%d\\n", a);
int main()
int i = 0;
while (i < 5)//循环5次
test();
i++;
return 0;
运行的结果:🎸
2
3
4
5
6
🎸而static修饰的局部变量使得局部变量没有被销毁,为什么会这样?
🎸本质上,static修饰的局部变量的时候,改变了变量的存储位置
🎸我们来画图来看一下
🎸这个整个橙色的方块是一个大的内存,我们会划分区域来进行不同的使用,我们就把这个大的区域分成栈区,堆区,静态区
这三个区域(以后都会介绍)
🎸我们会把局部变量存放在栈区,局部变量本来放在栈区(栈区的数据特点是进入它的作用域就创建,出它的作用域就会销毁)
🎸但是用static
修饰了局部变量后就把局部变量变成了静态变量,而静态变量存储在静态区,所以出作用域它并不会销毁
🎸还是这个代码,再运行的时候,这个
static int a = 1;
不是每循环一次就运行一次,而是在运行到这里的时候就会直接跳过去,不会执行这句话,因为static
修饰后在编译期间就提前把这个a
变量创建好了
void test()
static int a = 1;//static来修饰一下
a++;
printf("%d\\n", a);
int main()
int i = 0;
while (i < 5)//循环5次
test();
i++;
return 0;
🎸所以
static
影响了变量的生命周期,生命周期变长,和程序的生命周期一样
🔥🔥🔥简单介绍一下void
🎸
void
就是不需要返回的意思
void test()
static int a = 1;//static来修饰一下
a++;
printf("%d\\n", a);
🎸这是一个
test
函数,void
不用返回一个值,如果你用int
,你就必须要返回一个值
就像这样
int test()
int x = 5;
return x;//这里我就随便返回一个值x
int main()
int a = 0;
a = test();
//这里的a就会接受到返回的值
//所以a的值变成了5
return 0;
🎸但是你用
void
就不用返回值了,你想返回就返回,不返回就不返回
🔥🔥static修饰的全局变量
🎸在这里,我们不是已经有一个
.c
文件了嘛
🎸我们再创建一个.c
文件,就像这样
🎸我们拖住上面的标题,把它拖动成两个界面,可以同时看两个,就像这样
🎸我们都知道,全局变量在整个工程里面都可以使用,不过一个
.c
文件要使用在另一个.c
文件里的全局变量要使用关键字extern
,来声明外部符号,说一下要使用那个.c
文件里面的全局变量
就像这样
1.c1
extern a;
int main()
printf("%d", a);
//打印a的值
return 0;
2.c
int a = 5;
//全局变量
🎸那么我们用
static
修饰一下全局变量会怎么样?
1.c源文件
extern a;
int main()
printf("%d", a);
return 0;
2.c源文件
static int a = 5;
//static修饰一下全局变量
运行的结果:🎸
报错
🎸有这个static修饰全局变量就会报错,不修饰就会正常运行,为什么呢?
🎸我们来分析一下原因:
全局变量是具有外部链接属性的
在多个源文件中在一起编译就会进行链接
[编译+链接 - -生成- ->可执行程序, 有一个链接的过程]
🎸在1.c那个源文件通过链接这个手段,就可以很好的使用全局变量这个值
🎸而static修饰全局变量的时候,它的外部链接属性变成了内部链接属性,它只能在这个源文件内部使用,其他源文件(.c)就不能再使用这个全局变量了
🎸我们在使用static修饰的全局变量,我们的感觉是它的作用域变小了,本质上就是它的外部链接属性变为了内部链接属性
🎸那么这样有什么意义呢?
🎸一个变量的作用域太大也不一件好事
- 你这个全局变量的名字可能会与其他人的名字冲突
- 所有人都能改这个全局变量,这个全局变量很不安全
🎸所以我不想让其他人看这个变量,就加个static修饰就缩小了它的作用域,其他人就不能在外部的.c里面动这个变量
🔥🔥static修饰的函数
🎸它是类似于static修饰的全局变量
🎸我们来实践一下
🎸这个就是正常的用函数求和,在一个.c源文件里面
int Add(int x, int y)
return x + y;
int main()
int a = 4;
int b = 5;
int sum = Add(a, b);
//函数求和sum
printf("%d", sum);
//打印num
return 0;
运行的结果:🎸
9
🎸解释一下,函数也是具有外部链接属性
🎸我们把这个函数放在另一个.c源文件里面,使用的时候要像全局变量一样用extern声明一下外部符号,不过我不声明也是可以运行的,不清楚为什么,待我后面学到再解释
1.c源文件
extern int Add(int a,int b);
int main()
int a = 4;
int b = 5;
int sum = Add(a, b);
//函数求和sum
printf("%d", sum);
//打印num
return 0;
2.c源文件
int Add(int x, int y)
return x + y;
运行的结果:🎸
9
🎸那么我们用static修饰一下函数会怎么样?
1.c源文件
extern int Add(int a,int b);
int main()
int a = 4;
int b = 5;
int sum = Add(a, b);
//函数求和sum
printf("%d", sum);
//打印num
return 0;
2.c源文件
static int Add(int x, int y)
return x + y;
运行的结果:🎸
报错
🎸函数也是具有外部链接属性,可以猜出来,这个被static修饰的函数,它的外部链接属性变成了内部链接属性
今天的结束咯!!!
(Java实习生)每日10道面试题打卡——JavaWeb篇
- 临近秋招,备战暑期实习,祝大家每天进步亿点点!打卡 Day05!
- 本篇总结的是javaweb相关的面试题,后续会每日更新~
- 剧透:明日更新 JVM 面试题,相关知识不牢固的先去补一补哦 O(∩_∩)O~
1、JSP 和 Servlet 有什么区别?
- JSP 经编译后就变成了Servlet(JSP 的本质就是 Servlet,JVM只能识别 Java 的类,不能识别 JSP 的代码,Web 容器将JSP 的代码编译成 JVM 能够识别的 Java 类)。
- JSP 更擅长表现于页面显示,Servlet 更擅长于逻辑控制。
- Servlet 中没有内置对象,JSP 中的内置对象都是必须通过 HttpServletRequest 对象,HttpServletResponse 对象以及HttpServlet 对象得到。
- JSP 是Servlet 的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,JSP 中的 Java 脚本如何镶嵌到一个类中,由 JSP 容器完成。而Servlet 则是个完整的 Java 类,这个类的 Service 方法用于生成对客户端的响应。
注:JSP 现在公司用的少了,面试不作为重点,但是 Servlet 还是要了解一些东西的!
2、说一下 jsp 的 4 种作用域?
- page 代表与一个页面相关的对象和属性
- request 代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
- session 代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
- application 代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
3、请说一下 session 的工作原理?
Session 是一个存在服务器上的类似于一个散列表格式的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的 map (服务器端的一个集合),里面的 键(key) 存储的是用户的 sessionid
,用户向服务器发送请求的时候会带上这个sessionid
,这时就可以从中取出对应的值了。
4、session 和 cookie 有什么区别?
Cookie 和 Session 的区别?
Cookie 的概念:客户端会话技术,服务器端将数据保存到客户端。
Session 的概念:服务器端会话技术,在一次会话的多次请求间共享数据,(客户端)将数据保存在服务器端的对象中(HttpSession)。
- 存储位置不同:Cookie 存储在客户端浏览器,Session 存储在服务器端。
- 存储容量不同:Cookie 存储数据的容量很小(通常为 4KB 左右),对同一个域名下的总 Cookie 数量也有限制(20个),而 Session 的存储容量较大。
- 安全性不同:Cookie 的安全性较低,而 Session 安全性较高。
Cookie 和 Session 的生命周期不同:
- 当浏览器关闭后,Cookie 数据被销毁。
- 当服务器关闭时,Session 数据被销毁。或者 Session 对象调用
invalidate()
主动销毁,也可以设置定时销毁 Session对象。
Cookie 和 Session 的使用案例:
Cookie :
- 记住上一次访问时间。
- 在不登录的情况下,完成服务器对客户端的身份识别。
- 存少量的不太敏感的数据。
Session:
- 存储登录验证码。
- 用户登录的信息。
5、如果客户端禁止 cookie 能实现 session 还能用吗?
Cookie 与 Session,一般认为是两个独立的东西,Session 采用的是在服务器端保持状态的方案,而 Cookie 采用的是在客户端保持状态的方案。但为什么禁用 Cookie 就不能得到Session呢?
因为 Session 是用Session ID 来确定当前对话所对应的服务器 Session,而Session ID 是通过 Cookie 来传递的,禁用 Cookie 相当于失去了Session ID,也就得不到服务器端的 Session了。
6、forward 和 redirect 的区别?
- forward 请求转发是一次请求,redirect 重定向是两次请求;
- 重定向的第二个请求一定是 GET 请求;
- 请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
- 请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
- 请求转发对Servlet01和Servlet02的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
直接上图更好对比区别:
7、什么是 XSS 攻击,如何避免?
XSS 攻击,即跨站脚本攻击(Cross Site Scripting),它是 web 程序中常见的漏洞。
原理:
攻击者往 web 页面里插入恶意的 HTML 代码(JavaScript、Css、Html 标签等),当某个用户浏览该页面时,嵌入其中的 HTML 代码会被执行,从而达到恶意攻击用户的目的。如盗取用户 cookie 执行一系列操作,破坏页面结构、重定向到其他网站等。
案例:恶意的在某个网站的登录页面加 HTML 代码(JavaScript、Css、Html 标签等),当用户输入账号密码登录后,这段恶意的 HTML 代码会被执行,从而获取用户的账号密码信息。
预防思路 :
- web 页面中可由用户输入的地方,对输入的数据转义、过滤处理。
- 后台输出页面的时候,也需要对输出内容进行转义、过滤处理(因为攻击者可能通过其他方式把恶意脚本写入数据库)。
- 前端对 html 标签属性、css 属性赋值的地方进行校验。
参考文章:什么是 XSS 攻击,如何避免?
8、什么是 CSRF 攻击,如何避免?
CSRF:Cross Site Request Forgery(跨站点请求伪造)。
CSRF 攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。
案例:就好比用户A,在自己电脑上通过自己的账号密码登录了 B 网站(登录用户身份标识被 XX 网站信任),当 A 在浏览网页时候,不经意间打开了钓鱼网站 X,这时候 X 就可借着 B 网站对用户 A 的信任标识,以用户 A 的身份去访问 B 网站,并对其进行攻击!
预防方法:
- 添加并验证 token
- 添加自定义 http 请求头
- 使用 post 请求
- 敏感操作添加验证码
参考文章:什么是 CSRF 攻击,如何避免?
9、说下原生 jdbc 操作数据库流程?
- 第一步:
Class.forName()
加载数据库连接驱动; - 第二步:
DriverManager.getConnection()
获取数据连接对象; - 第三步:根据 SQL 获取 sql 会话对象,有 2 种方式
Statement
、PreparedStatement
; - 第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值
setXxx()
; - 第五步:关闭结果集、关闭会话、关闭连接。
10、如何避免 sql 注入?
- 预编译 SQL(使用 PreparedStatement),参数化查询方式,避免 SQL 拼接。
- 校验参数的数据格式是否合法(可以使用正则或特殊字符的判断)。
- 对进入数据库的特殊字符进行转义处理,或编码转换。
总结的面试题也挺费时间的,文章会不定时更新,有时候一天多更新几篇,如果帮助您复习巩固了知识点,还请三连支持一下,后续会亿点点的更新!
为了帮助更多小白从零进阶 Java 工程师,从CSDN官方那边搞来了一套 《Java 工程师学习成长知识图谱》,尺寸 870mm x 560mm
,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下,当然,不管怎样博主的文章一直都是免费的~
以上是关于打卡:4.20 C语言篇 -初识C语言 - (10)关键字typedefstatic的主要内容,如果未能解决你的问题,请参考以下文章