• C++——指针与数组


    1.数组名不是指针,神似指针(可以将数组名直接赋值给指针)

    (1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
    (2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
    (3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!

    2.数组名只能被看作一个指针常量,不能被修改

    int intArray[10];
    intArray++;//错误

    sizeof(intArray)/sizeof(*intArraya)=10;

    指针的sizeof就是指针本身的大小

    3.作为函数形参

    (1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;
    (2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

    所以,数组名作为函数形参时,其全面沦落为一个普通指针!

    4.a是数组时,a 和 &a的区别

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

    int *p=a;//定义一个int型指针p,指向第一个元素的地址

    vector<int> ivec(begin(a),end(a));//用数组初始化vector

    vector<int> subvec(a+1,a+3);//用数组初始化vector

    int aa[2][5]={0,1,2,3,4,   
                          5,6,7,8,9};

    int (*p)[5]=aa;//定义一个int [5] 型指针p,等价于int (*p)[5]=&aa[0]; 

    5.数组,引用和指针

    int *ptrs[10];//Y,数组,10个int型指针

    int &refs[10];//N,没有引用的数组,

    int (*Parray)[10]=&arr; //指针,10个int型数据的数组——————和数组名的区别?

    int (&Parray)[10]=arr;//数组的引用,10个int型数据的数组————和数组名的区别?

    int *(&Parray)[10]=arr;//数组的引用,10个int型指针的数组————和数组名的区别?

    int ia[]={0,1,2,3,4,5};
    auto ia2(ia);//ia2是一个整型指针int *,只想ia的第一个元素: auto ia2(&ia[0])
    ia2=42;//×
    
    decltype(ia) ia3={0,1,2,3,4,5};//ia3是一个6个整数的数组
    ia3=p;//不能把整形指针赋值给数组

     5.1数组的begin和end操作 

    constexpr size_t sz=5;
    int arr[sz]={1,2,3,4,5};
    auto n=end(arr)-begin(arr);//n=5,类型为带符号的ptrdiff_t(头文件cstddef)

     5.2 数组的下标和指针

    int *p=&a[2];
    int j=p[1];//a[3]
    int k=p[-2];//a[0]

     

    6.

    unsigned score[3]={4,2,3};
    for (auto i : score)
            cout<<i<<" ";//4,2,3

     7.多维数组:数组的数组

     

     

    int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
    int a[3][4]={{0},{4},{8}};//初始化每行的首元素,其余默认
    int a[3][4]={0,4,8};//只初始化了第一行3个元素,其余默认

    7.1 多维度数组遍历

    constexpr size_t rowCnt =3, colCnt=4;
    int ia[rowCnt][colCnt];
    for (size_t i=0;i!=rowCnt ;++i){
        for (size_t j=0;j!=colCnt;++j) {
            ia[i][j]=i*colCnt+j;
        }
    }
    /******************/C++11
    size_t  cnt=0;
    for (auto &row:ia)//为了避免数组被自动转成指针;为了写操作(就算只读,也要用引用)
        for (auto &col:row) {
            col=cnt;
            ++cnt;
        }
    }
    
    for (const auto &row : ia)//外层循环必须引用,避免转成指针.row代表一个大小为4的数组
        for (auto col:row)
            cout<<col<<endl;
    
    for (auto row : ia)//外层循环必须引用,报错。此时row被转化成指针,而无法遍历一个int *的指针
        for (auto col:row)

     7.2 指针和多维数组

     

    int ia[3][4];//大小为3的数组,每个元素为大小为4的数组
    int (*p)[4]=ia;//p指向第一个含有4个整数的数组
    p = &ia[2];//p只想最后一个含有4个整数的数组
    int *ip[4];//4个整形指针的数组

    /**********/C++11,auto解决了上述问题
    for (auto p=ia;p!=ia+3;++p){
      for(auto q=*p;q!=*p+4;++q)
        cout << *q <<‘ ’ ;
      cout<<endl;
    }
    /*************/上下等价
    for (auto p=begin(ia);p!=end(ia);++p){
      for (auto q=begin(*p);q!=end(*p);++q)
        cout <<*q<<'';
      cout<<endl;
    }
    /**********/上下等价:int_array=4个整数的数组
    using it_array = int[4];
    typedef int int_array[4];
    for (int_array *p=ia;p!=ia+3;++p){
      for(int *q=*p;q!=*p+4;++q)
        cout<<*q<<'';
      cout<<endl;
    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    轻便的客户端oracle instant client安装备忘(zt)
    OpenOffice3.0以服务方式运行在Windows平台(文件转换服务器解决方案)
    动态生成与编译(二)CodeDOM的类层次结构
    动态生成与编译(五)用CodeDOM生成一个完整的类(下)
    动态生成与编译(三)写一个面向过程的程序
    动态生成与编译(一)入门
    运行时设置数据库连接字符串
    动态生成与编译(四)用CodeDOM生成一个完整的类(上)
    世界级的《生化危机4 / Biohazard 4 / ResidentEvil 4》
    充满悬念的世界杯! 《FIFA World Cup GERMANY 2006》
  • 原文地址:https://www.cnblogs.com/yrm1160029237/p/10864379.html
Copyright © 2020-2023  润新知