zoukankan      html  css  js  c++  java
  • C++中的数组与指针

    数组与指针看起来很像

    int a[] = {1, 2 ,3};

    int *p = a;

    如此,我们可以p[0], p[1], p[2]

    看起来,与直接使用数组名没什么两样,但是看这段代码

    sizeof(a)

    sizeof(p)

    你就会知道,原来数组里还隐含了大小信息,这是指针所不能做到的

    严格的说,数组是一种内置的数据类型,C++标准对这种数据类型限定的某些行为使他看起来像

    指针

    1array are passed by reference by default

      这句话是说,我们可以将数组名赋给指针,将数组名放进函数参数中,则数组会退化成指针,再用sizeof得不到尺寸信息

         void func(int a[]);

      很多人以为这个函数只接受数组为参数,结果在函数内部sizeof(a)发现,它就是一指针int*,坑人

    2array are not assignable

       这里最关键的是数组名不能作为左值,不管是用int a[3]声明的数组还是int a[] = new int[3];得到的数组

          在基本数据类型里,引用也具有这种"从一而终"的特性

    3如何真正的传递数组(避免它退化成指针)

      看下面的函数原型

      void func(int(&a)[100]);

         这个函数只接受大小为100的整型数组,有没有发现,我们按引用类型来传参数,就能避免数组退化成指针

      当然这么写没什么用,毕竟一个只能传递定长数组的函数也只能看看而已

       利用c++模板编程的手法,可以这样子:

         template<size_t N>

         void func(int(&a)[N]);

          这样就能接受任意大小的数组了,而且只接受数组

  • 相关阅读:
    Codeforces Round #352 (Div. 1) B. Robin Hood (二分)
    Codeforces Round #209 (Div. 2) D. Pair of Numbers (模拟)
    Kattis
    kattis Curious Cupid (莫队算法)
    HYSBZ
    SPOJ NETADMIN
    day26-2 基于TCP协议的套接字编程
    day26-1 TCP三次握手和四次挥手
    day25-2 OSI协议和socket抽象层
    day25-1 网络架构与互联网组成
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4981751.html
Copyright © 2011-2022 走看看