zoukankan      html  css  js  c++  java
  • 编程语言中的值数据类型和引用数据类型之间的区别

    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个字节。

  • 相关阅读:
    正确添加Google Adsense
    微软开发主管临别诤言
    DZ论坛重建管理员
    Cook book 第4天 第6章 层、自定义组件
    Cook Book 第二天 运行环境识别修改
    flex cookbook 学习第一天 基本知识
    C#:String类型中的CharAt
    对我学C#时的一次小回忆[一:语法篇]
    分享一段C#反射代码[Type是反射的入口][查看类型信息][动态生成对象]
    C#反射:让私有成员无所遁形
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12080317.html
Copyright © 2011-2022 走看看