• 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;
    }

  • 相关阅读:
    PL/SQL会遇到中文插入乱码问题、数据显示不全
    PL/SQL数据生成器
    编程小案例
    MySql案例收集
    关于PL/SQL的安装配置
    Android 歌词桌面同步显示
    DataGridView控件使用大全
    flex java 交互
    Android Launcher 全面剖析
    Android adb 命令
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4240926.html
Copyright © 2020-2023  润新知