zoukankan      html  css  js  c++  java
  • c++函数中的数组参数和sizeof问题

    指针

    • 数组nums

      nums 0x61fe14
      num[0] 1
      &nums 0x61fe14
      *nums 1

    函数的数组参数

    • 数组被作为参数传递时会退化为指针,如果用sizeof得到的实际上只是指针占据的空间,无法得到数组的长度。

    直接在函数体中用sizeof的结果

    #include<bits/stdc++.h>
    using namespace std;
    
    int f(int arr[])
    {
        cout<<sizeof(arr)/sizeof(*arr)<<endl;
    }
    int main()
    {
        int nums[]={1,2,3,4};
        f(nums);
    }
    >>>
    2
    
    • 加上数组引用,这里数组已经不会被退化为指针了,而是int(&)[]的类型,但这是不完整类型,无法自动匹配int[3]。

    int foo(int (&arr)[])

    报错

    解决办法

    使用模板让参数变为完整的类型

    #include<bits/stdc++.h>
    using namespace std;
    template<int len>
    int f(int (&arr)[len])
    {
        cout<<sizeof(arr)/sizeof(*arr)<<endl;
    }
    int main()
    {
        int nums[]={1,2,3};
        f(nums);
    }
    
    

    template函数模板

    分析原因

    形参是实参的一份拷贝,是局部变量。但是数组是个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,数据还是在内存里的,函数在需要用到后面元素时再按照这个地址和数组下标去内存查找。也就是说后面的元素根本没到函数里来。所以不能在test()函数内部用sizeof求数组的大小。

  • 相关阅读:
    实验5&期中考试后两题
    实验四——再探类
    实验3—初识类
    10.29算法训练——poj1475双重BFS
    10.25算法训练——裸线段树
    探索邻接表
    Hadoop学习之Combiner
    关于VLM模式下linux压缩根目录空间的心得
    C#微信公众号开发系列教程四(接收普通消息)
    c#分部类型详解
  • 原文地址:https://www.cnblogs.com/rower/p/12893804.html
Copyright © 2011-2022 走看看