编程语言中的值数据类型和引用数据类型之间的区别
时间:2022-07-23
本文章向大家介绍编程语言中的值数据类型和引用数据类型之间的区别,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.值数据类型存储在栈中,引用数据类型值存储在堆中,其引用存储在栈中。
举个例子:(以c++为例),其它语言大同小异
基础数据类型:
//在栈中会分配内存存储i,也就是说变量i有一块地址,里面存储的值是10
int i = 10;
引用数据类型:
//在堆中会开辟一块内存存储数组{1,2,3,4}
//在栈中会开辟一块内存存储变量arr,arr里面存储的值是{1,2,3,4}在堆中的地址,需要注意的是arr本身也是有其自己的地址,只不过该地址存储的是arr本身
int arr[] = {1,2,3,4};
2.值数据类型在参数传递中是值传递,也就是传递的值给形参,而在函数里形参的改变不影响实参的值;引用数据类型在参数传递中是引用传递,也就是传递的值是地址,而在函数里形参的改变会影响实参的值。当然,也可以将值数据类型的地址作为实参传给形参,这样也相当与是一种引用传递。
举个例子:(以c++为例),其它语言大同小异
值传递:
#include <iostream>
using namespace std;
void swap(int num1, int num2) {
cout << "交换之前num1的值:" << num1 << endl;
cout << "交换之前num2的值:" << num2 << endl;
int tmp = num1;
num1 = num2;
num2 = tmp;
cout << "交换之后num1的值:" << num1 << endl;
cout << "交换之后num2的值:" << num2 << endl;
}
int main()
{
int a = 1;
int b = 2;
cout << "实参未传入之前a的值:" << a << endl;
cout << "实参未传入之前b的值:" << b << endl;
swap(a, b);
cout << "实参传入之后a的值:" << a << endl;
cout << "实参传入之后b的值:" << b << endl;
system("pause");
return 0;
}
输出:
引用传递(利用值传递的地址) :
#include <iostream>
using namespace std;
void swap(int* num1, int* num2) {
cout << "交换之前num1的值:" << *num1 << endl;
cout << "交换之前num2的值:" << *num2 << endl;
int tmp = *num1;
*num1 = *num2;
*num2 = tmp;
cout << "交换之后num1的值:" << *num1 << endl;
cout << "交换之后num2的值:" << *num2 << endl;
}
int main()
{
int a = 1;
int b = 2;
int* p1 = &a;
int* p2 = &b;
cout << "实参未传入之前a的值:" << a << endl;
cout << "实参未传入之前b的值:" << b << endl;
swap(p1, p2);
cout << "实参传入之后a的值:" << a << endl;
cout << "实参传入之后b的值:" << b << endl;
system("pause");
return 0;
}
输出:
引用传递(引用数据类型本身,在c++中,数组是一种引用数据类型):
void transform(int arr[]) {
arr[0] = 9;
}
int main() {
int arr[] = { 1,2,3,4,5 };
//利用函数将数组第一个值改为9
transform(arr);
cout << arr[0] << endl;
system("pause");
return 0;
}
输出:
3.参数传递时使用引用传递,即传递地址,可以减少内存消耗。在c++中,指针类型在32位系统中都是占4个字节,在64位操作系统中都是占8个字节。
- Java常用工具类之MD5加密
- Java常用工具类之发送邮件
- Spring Boot入门
- IDEA使用
- JFinal极速开发框架使用笔记(二) 两个问题,一个发现
- JFinal极速开发框架使用笔记(三) 分析Model和ActiveRecord
- JFinal极速开发框架使用笔记(四) _JFinalDemoGenerator实体类生成及映射自动化
- Python语言做数据探索教程
- Java常用工具类之时间转换(注释乱码,全)
- Java常用工具类之RegexpUtils,正则表达式工具类
- 短信接口发送验证码倒计时以及提交验证
- Java常用工具类之IO流工具类
- JFinal极速开发框架使用笔记
- JavaWeb项目之电话本,两个版本,以及总结反思
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode76|两颗二叉搜索树中的所有元素
- LeetCode75|二叉搜索树的第k大节点
- LeetCode86|只出现一次的数字II
- LeetCode85|只出现一次的数字III
- LeetCode84|只出现一次的数字
- LeetCode83|排序矩阵查找
- LeetCode82|翻转字符串里的单词
- LeetCode81|移动零
- LeetCode80|反转字符串中的元音字母
- LeetCode79|平方数之和
- LeetCode91|寻找重复数
- LeetCode90|两个数组的交集
- LeetCode89|在排序数组中查找数字I
- LeetCode88|两数之和IV-输入BST
- LeetCode98|判定字符是否唯一