• C++中的数组和指针


    首先要明确一点,数组类型和指针类型确实是不同的类型!

    char *p; //类型是char*

    char str[6];//类型是char [6]

    可用如下语句输出类型信息(需要#include<typeinfo>)

    std::cout << typeid(p).name() << std::endl;
    std::cout << typeid(str).name() << std::endl;

    但是有时候我们总会定义这样的函数:

    void foo(char *p){

       cout << p << endl;

       cout << sizeof(p) / sizeof(char); // 输出为4

    }

    我们发现把str丢进去它也正常运行了。于是想当然的,我就定义了这样一个函数:

    void foo(char str[6]){

       cout << str << endl;

       cout << sizeof(str) / sizeof(char) << endl;// 输出也是4

    }

    我们发现输入p也没问题,这就有问题了,而且第二个输出让人费解,按照类型信息它应该输出6。

    这里涉及的问题,就是,当你以非引用类型作为形参的时候,数组类型会被自动降为指针类型来处理,也就是foo(char str[6])跟 foo(char *p)是完全一样的!

    为了演示这个知识点,我们将函数原型改成下面这样:

    void foo(char (&str)[6]){

       cout << str << endl;

       cout << sizeof(str) / sizeof(char) << endl;// 输出为6

    }

    这时候,我们发现只有输入char[6]类型,才能通过编译,而且第二个输出为6,也就是数组长度信息在传参过程中正常保留了。

    当以引用类型为形参的时候,数组类型不会降为指针类型!

    最后,基于这一点,我们可以写出以任意维数组为参数的函数了,当然要用到模板,因为不同长度的数组属于不同的类型:

    template<int N, int M>
    int foo(int const (&a)[N][M], int const (&b)[N][M]){
    std::cout << typeid(a).name() << std::endl; //输出 int[N][M]
    return 0;
    }

  • 相关阅读:
    FineReport---数据集
    FineReport----单元格元素(数据列、公式、斜线)
    FineReport---样式
    SQL-修改: 将日期修改为空NULL、修改为空的记录
    sql---字段类型转换,保留小数位数,取日期格式,sql获取当前时间,时间处理
    深入浅出Mqtt协议
    一文了解Redis
    RDBMS关系型数据库与HBase的对比
    Greedysky:C++ 建议用 nullptr 而不是 NULL
    Greedysky:C++11 新特性之强制类型转换static_cast
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4240926.html
Copyright © 2020-2023  润新知