zoukankan      html  css  js  c++  java
  • 关于副本机制

     

    1.首先说一下函数的副本机制

    形式参数会开辟内存,新建一个变量,容纳传递过来的实际参数的值。

    看一段简单的代码

    复制代码
     1 # include<stdio.h>
     2 # include<stdlib.h>
     3 
     4 int add(int n, int m)
     5 {
     6     int z = n + m;
     7     return z;
     8 }
     9 
    10 int main()
    11 {
    12     printf("%d
    ", add(1, 2));
    13 }
    复制代码

    当函数返回后,内存已经回收,仍能打印值,这是因为函数的副本机制

    2.结构体有副本

    复制代码
     1 # include<stdio.h>
     2 # include<stdlib.h>
     3 
     4 struct myStruct
     5 {
     6     int a[5];
     7     int n;
     8 };
     9 
    10 void change(struct myStruct my1)
    11 {
    12     my1.n = 0;
    13     my1.a[0] = 1000;
    14     printf("%d
    ", &my1);
    15 }
    16 
    17 int main1()
    18 {
    19     struct myStruct my1 = { { 1, 2, 3, 4, 5 }, 100 };
    20     printf("%d,%d
    ", my1.a[0], my1.n);
    21     printf("%d
    ", &my1);
    22     change(my1);
    23     printf("%d,%d
    ", my1.a[0], my1.n);
    24     system("pause");
    25 }
    复制代码

    结果:(可以发现没有改变,地址不同)

    结论:

    1.除了数组没有副本机制,其他都有副本机制

    2.结构体有副本机制

    3.结构体中就算有数组,也有副本机制

    4.结构体数组,单个有副本机制

    • 结构体作为参数具有副本机制,结构体返回值也有副本机制 。 函数的参数和返回值都有他的副本机制。
    • 数组有副本机制。
    • 数组名作为参数会退化为指针。
    • 一般情况下不要把结构体变量用作参数,因为值比较多,拷贝起来会很慢,浪费空间浪费时间,最好用地址。
       
  • 相关阅读:
    CloudStack tomcat集成方式分析
    cloudstack-setup-databases cs数据安装
    CloudStack 安装时需要的第三方包
    制作initramfs/initrd镜像
    GRUB使用说明
    Linux的kickstart安装详解
    cs4.1 编译与安装
    CS4.1 RPM打包函数分析
    Markdown 打出上下标
    matlab命令行双箭头消失
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5574654.html
Copyright © 2011-2022 走看看