变量的内部存储:值和类型

C变量和函数的存储类型 C变量和函数的存储类型 在上一篇《C程序内存管理》的文章中,已经知道了C语言编译后的可执行文件的存储结构以及运行时的内存布局,本文则记录C语言中变量和函数的存储类型,以及在内存中的一些行为。 C语言中变量的声明/定义格式如下: 存储类型    类型修饰符    数据类型    变量名; 存储类型:用来指明变量的存储位置,即运行该变量在哪一段分配内存空间,常见的存储位置有auto、ext 阅读详情

    PHP是一种弱类型的脚本语言,弱类型不表示PHP的变量没有类型区分,PHP变量有8种原始类型:

 

四种标量类型:

  • boolean(布尔型)

  • integer(整型)

  • float(浮点型)

  • string(字符串)

两种复合类型:

  • array(数组)

  • object(对象)

两种特殊类型:

  • resource(资源)

  • NULL

一个变量能在运行期间从一种类型转换为另一种类型,那么PHP是如何实现这种变量的类型戏法的呢?

 

在引擎内部,变量都是用一个结构体来表示,这个结构体可以在{PHPSRC}/Zend/zend.h中找到:

 

 这里我们暂时只关心 value和type两个成员,其中value是一个联合, 也就是变量的实际值,type是变量的动态类型,根据类型的不同,value使用不同的成员。

type的各种类型都被定义成了宏,同样在此文件中定义了这些宏:

 

value的类型zvalue_value同样定义在此文件中:

 

1.布尔类型变量

   type=IS_BOOL,value中的lval字段为值,lval取值为(0,1)

   在{PHPSRC}/Zend/zend_operators.h中定义了取一个zval的布尔值的宏:

   #define Z_BVAL(zval)   ((zend_bool)(zval).value.lval)

2.整形变量

   type=IS_LONG, value中的lval字段为值

   #define Z_LVAL(zval)   (zval).value.lval

3.浮点型变量

   type=IS_DOUBLE, value中的dval字段为值

   #define Z_DVAL(zval)   (zval).value.dval

4.字符串变量

   type=IS_STRING,   value中的str结构有效,该结构中var为字符串的指针,len为字符串的长度

   #define Z_STRVAL(zval)   (zval).value.str.val    //取字符串指针
   #define Z_STRLEN(zval)   (zval).value.str.len    //取字符串长度

 

另外的复杂类型这里暂不详细介绍,对于数组类型,ht字段生效,ht是一个哈希表的指针,数组都是哈希表的形式存在,对于对象类型变量,obj保存这对象的信息,对于资源类型变量,用lval间接保存这资源得一个标识符。

    这样引擎就用一个zval类型来实现了所有的PHP变量类型,知道以上原理之后,变量的类型转换就容易实现了,在{PHPSRC}/Zend/zend_operators.c中定义了各种类型转换的宏,比如转换成布尔类型的宏zendi_convert_to_boolean,主要的思路就是先把type变成IS_BOOL,然后根据原变量的不同类型的值按照一定规则转换成lval的0或则1。

 

不同存储类型的变量的声明、内部函数、外部函数 存储类型: 1、用auto声明自动变量      例:  int f(int a)                      {                           auto int b,c=3;                           ……                      }       函数调用时自动分配内存空间,函数调用结束时自动释放这些空 阅读详情

相关推荐

YOLOv8中的C2f模块代码详解

在YOLOv8网络结构中,C2f模块(CSP Bottleneck with 2 Convolutions)是一个关键组件,用于实现跨阶段部分聚合

zzzyyy8的博客 3万+

四十、PHP内核探索:变量的value和type存储 ☞ 变量的内部存储:值和类型

PHP是一种弱类型的脚本语言,弱类型不表示PHP的变量没有类型区分,PHP变量有8种原始类型: 四种标量类型: boolean(布尔型) integer(整型) float(浮点型) string(字符串) 两种复合类型: array(数组) object(对象) 两种特殊类型: resource(资源) NULL 一个变量能在运行期间从一种类型转换为另一种类型,那么PHP是如何...

进阶之旅 284

医学影像AI的幻觉问题与CCD解决方案

医学影像AI在辅助诊断中面临的核心挑战是幻觉现象,即模型生成不符合实际影像的虚假诊断。这种现象源于多模态大语言模型(MLLMs)在视觉-语言对齐上的技术局限,可能导致假阳性或假阴性的临床风险。通过临床对比解码(CCD)框架,结合症状锚定和专家引导的双阶段校准机制,可有效提升模型输出的可靠性。该技术在CheXpert和MIMIC-CXR等标准数据集上验证,显著改善了肺不张、胸腔积液等关键指标的检测准确率。对于医疗AI落地场景,这种即插即用的解决方案既规避了数据隐私合规问题,又降低了基层医院的部署门槛,为AI辅

weixin_36303807的博客 322

引用参数mysql 类型_详解MySQL存储过程参数有三种类型:in、out、inout

一、MySQL 存储过程参数(in)MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。drop procedure if exists pr_param_in;create procedure pr_param_in(in id int ...

weixin_36478445的博客 291

SIMULIA-Simpack 2022x新功能介绍

增加库伦摩擦类型力元95 Coulomb Friction增加了3种新的摩擦方向类型用于模拟平面、圆柱和球面摩擦。针对平移和旋转摩擦改进了滑动到粘着过渡阶段的检测,增加一个参数定义两种不同的滑移-粘滞过渡模式,即“Unloaded stick stiffness”和“Preload stick with last slip”。新增加124'Applied Load’力元允许用户将力或扭矩作为恒定值或通过激励元素施加到To Marker点上。该力元建模操作方便,效率高。支持线性柔性体装配。

crystalzhan的博客 1047

时空图神经网络实战:T-GCN在交通流量预测中的深度解析

本文深度解析了时空图神经网络T-GCN在交通流量预测中的实战应用。通过结合图卷积网络(GCN)和门控循环单元(GRU),T-GCN有效捕捉交通数据的时空依赖性,相比传统方法降低30%以上预测误差。文章详细介绍了T-GCN的核心技术、工程实践和优化策略,为智能交通系统提供有力工具。

weixin_29038537的博客 268

【从0开始C语言(自学记录)】变量三属性(类型、作用范围、存储类别)

目录 一、类型: 二、作用范围: 1、局部变量:在一个函数内部{……}定义的变量 2、全局变量(外部变量):在函数外部定义的变量 3、例: 4、注: 三、存储类别: 1、auto类别变量: 2、static类别变量(使用必须说明) 3、register类别变量(寄存器变量) 4、extern类别变量(外部变量) 一、类型: 类型是定义出来的(int,char,float,double等) 定义格式: 类型名 变量列表; 如: int x,y,z; 二...

Chdsuhcos的博客 1032

从零搭建IoT数据中台:STM32+WebSocket实现边缘设备与Web端实时双向通信

本文详细介绍了如何从零搭建基于STM32和WebSocket协议的IoT数据中台,实现边缘设备与Web端的实时双向通信。通过硬件选型、协议设计、服务器搭建及安全优化,提供了一套低延迟、高并发的企业级解决方案,适用于智能农业和工业监控等场景。

tea88的博客 749

mysql基础(48)_存储过程的形参类型

存储过程的形参类型 存储过程也允许提供参数(形参和实参),存储的参数也和函数一样,需要指定其类型。但是存储过程对参数还有额外的要求:自己的参数分类。 IN 表示参数从外部传入到里面使用(过程内部使用),可以是直接数据也可以是保存数据的变量。(相当于php函数里面的值传递) Out 表示参数是从过程里面把数据保存到变量中,交给外部使用:传入的必须是变量 如果说传入的out变量本身在外部有数据,那么在进入过程之后,第一件事就是被清空,设为NULL(相当于php函数里面的引用传递) Inout 数据可以从

no15870678621的博客 937

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

dapengglove的博客 1682

如何实现chrome谷歌浏览器多开(独立环境 独立cookie)

由于各种各样的原因,你可能需要在一个电脑登录某个平台,比如一个电脑登录3个公众号,或者3个知乎等等。最简单的方案是,直接安装3个不同的浏览器,比如一个谷歌浏览器,一个火狐浏览器,一个 Edge 浏览器。这个方案也能解决,但如果想多开10个呢?安装10个不同的浏览器也能解决,但感觉这样比较复杂,另外一方面安装太多的应用,会导致电脑卡顿。这里给大家介绍,我在 Win 和 Mac 系统下的躲开解决方案。Win 系统下的解决方案最为简单,原理就是给不同的谷歌浏览器,指向不同的用户存储路径即可。

lzqial1987的专栏 1万+

变量的 4 种存储类型

存储类型: 总共有四种存储类型的变量,分别为自动变量(auto)、静态变量(static)、外部变量(extern)以及寄存器变量(register)。 auto - 函数中所有的非静态局部变量。(c语言可以指定类型如auto int a,c++编译器不能指定类型编译器会进行推导) register - 一般经常被使用的的变量(如某一变量需要计算几千次)可以设 置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存 中的非 register变量.(现在已经不需要定义了,编译器会进行

m0_46332166的博客 4629

AEJoy —— 最受欢迎的 5 个 Ae 表达方式

NOTE] 原文作者我意识到表达式可能令人生畏,有些人宁愿复制粘贴有用的代码,而不愿学习这门语言。对此我完全理解。因此,我想与您分享我的。这些是我几乎在每个项目中都会使用的表达式,我认为它们极大地提升了工作流程。

ShaderJoy 的兴趣技术杂货铺 364

MYSQL存储过程中的IN、OUT和INOUT

  MYSQL存储过程中的IN、OUT和INOUT,不能简单理解为一个方法的参数和返回值,而是面向整个过程上下文变量的。 一、MySQL 存储过程参数(in) 基本可以理解为传入function的参数,而如果该参数是个变量,那么整个procedure过程结束后,不会影响外部的变量值。 可以直接这样: call abc(’a'); 这种情况直接给in类型的参数赋值。 ...

weixin_30859423的博客 200

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

变量的四大存储类型static extern auto register

C语言变量的四种存储类别: 存储类别 生命周期 作用域 存储方式 存储区域 使用场景 auto 函数内部 块级别 栈 RAM 用于存储局部变量 static 整个程序 块级别 数据段 RAM 用于存储局部变量的持久性版本 extern 整个程序 文件级 数据段 RAM 用于在不同的源文件中共享全局变量 register 函数内部 块级别 寄存器 CPU 用于提高变量的访问速度

Half-up的博客 7129

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

c语言指针变量的值存储的是什么,指针变量的存储实质,C语言指针变量的存储详解...

相信大家都知道这样一个学习指针的观点:要想彻底理解 C 语言中的指针,首先一定要理解 C 语言中变量的存储实质。谈到变量的存储,我们就不得不先说说计算机的内存概念。计算机的内存是一个用于存储数据的空间,由一系列连续的存储单元组成,它就好像电影院中的座位一样,如图 1 所示。图 1 内存中某一区域的编号在电影院中,为了保证大家能够快速找到自己的座位,每个座位都用一个唯一的编号来标识。而对计算机内存来...

weixin_39905725的博客 5675

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

变量的存储类型

在C语言中,变量和函数都有两种类型:数据类型和存储类别。 其中 数 据 类 型 表示 数据的含义,取值范围和允许的操作,而 存储类别指的是数据在内存中的 储方式——静态存储方式和动态存储方式 1 ,存储类别 (1)静态存储方式 静态存储方式按照其字面意思,将 以静态存储方式存储的变量 以静态的方式存储,在编译时就分配了存储空间,在整个程序运行期间,该变量一直占用固定的存储空间,程序结束后,该变量占用的内存才被释放。 静态局部变量和...

qq_61480431的博客 4336

变量未初始化,为什么得到的值全局变量是0,局部变量函数内部变量有的是随机值?

变量未初始化,为什么得到的值有的是0,有的是随机值? 要解释为什么全局变量未初始化为什么是0,而动态局部变量是一个随机数,就要先弄清楚静态,动态是什么,局部,全局又是什么.然后再思考为什么静态是0,就要思考它们的存储方式,因此自然就要了解内存的内部结构,然后了解它们的原理,自然就明白了.同时还能就是下初始化和赋值的区别. 初始化和赋值的区别是什么? 初始化:声明变量的时候同时赋值,声明的时候...

二进制模----细微行动改变影响世界 5452

C语言中变量的存储类型

在C语言中,对变量的存储类型说明有以下四种: auto     自动变量register   寄存器变量extern    外部变量static    静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变量属于静态存储方式。 在介绍了变量的存储类型之后,可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型。 因此变量说明的完整形式应为:存储类型说明符数...

weixin_33779515的博客 4731

变量的内部存储:引用和计数

    在引擎内部,一个PHP的变量是保存在“zval”结构中,此结构包含了变量的类型和值信息,这个在之前的文章  PHP变量如何实现弱类型特性 中已经介绍了,此结构还有另外两个字段信息,一个是"is_ref"(此字段在5.3.2版本中是is_ref__gc),此字段是一个布尔值,用来标识变量是否是一个引用,通过这个字段,PHP引擎能够区分一般的变量和引用变量。PHP代码中可以通过 & 操作符号来建立一个应用变量,建立的应用变量内部的zval的is_ref字段就为1。zval中还有另外一个字段refcoun

PHP kernel - Inside PHP 7805

函数和变量的存储类型

1.1函数概述 c语言都是由很多程序模块构成的,一个程序模块完整一个特定的功能,通过这些模块的配合,可以实现程序所要达成的目标。而这些所谓的模块,实际上可以理解为函数。 1.1.1函数的概念 在程序开发过程中,程序员需要完成的代码量非常大,所以将代码合理地划分为不同的模块是很有必要的,每一个模块都具有相对独立的功能,并为其他程序提供对外调用的参数和返回值,这样由多个模块组成的程序才会让程序阅读者更方便地理解程序设计的理念,并且更容易调试和维护。而这种一步一步地把一个复杂地问题分解为多个小问题,自顶向下

weixin_62917800的博客 2428

C语言 变量的存储和引用,内部和外部函数

C语言 变量的存储和引用,内部和外部函数

qq_48516121的博客 2075

变量的存储类型c语言,C语言中【变量】的存储类型共有4种类型

在C语言中,对变量的存储类型说明有以下四种:auto 自动变量 (动态存储)register 寄存器变量(动态存储)extern 外部变量(静态存储)static 静态变量(静态存储)所谓存储类型是指变量占用内存空间的方式,也称为存储方式。这4种类型 不允许重复定义 如: extern static int a=200;是错误的;只能指定一中存...

weixin_42356340的博客 6620

C语言中【变量】的存储类型共有4种类型

在C语言中,对变量的存储类型说明有以下四种: auto 自动变量 (动态存储) register 寄存器变量(动态存储) extern 外部变量(静态存储) static 静态变量(静态存储) 所谓存储类型是指变量占用内存空间的方式,也称为存储方式。 这4种类型 不允许...

weixin_30551963的博客 1万+

【C语言】变量、变量的存储区域和存储类型

变量:即在程序运行中值可变的数据;为提高程序的可读性,变量名一般由用户根据其用途自行命名,变量名由字母、数字、下划线组成,且不能以数字开头,不能与C语言的关键字重名;在程序运行时,变量占内存空间的大小由其数据类型决定。 在使用前,必须声明变量,一般格式:<存储类型> <数据类型> <变量名>; 局部变量:在所有函数内定义的变量(包括函数参数)都是局部变量。程序中一般都是局部变量,另外局部变量只在自己的函数内有效,即不可被其他函数使用,因此不同函数的局部变量可以重名而不

电子通信仔的学习杂记 1941
上一篇: PHP解释器引擎执行流程
下一篇: 源码分析必备:用vld查看opcode信息
phpkernel
博客等级 码龄16年 96粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值