数组声明和定义的注意事项

一、不允许数组拷贝和赋值

int a[] = {1,2,3}; //含有3个整数的数组

int a2[]= a;//错误:不允许使用一个数组初始化另一个数组

a2 = a; //错误:不能把一个数组直接赋值给另一个数组

二、复杂的数组声明

int arr[10];

int *ptrs[10]; //ptrs是含有10个整形指针的数组

int &refs[10]=/*?*/; //错误:不存在引用的数组

int (*parray)[10] = &arr; //parray指向一个含有10个整数的数组

int (&arrRef)[10] = arr; //arrRef引用一个含有10个整数的数组

int *(&arry)[10] = ptrs;//arry是数组的引用,该数组含有10个指针

三、指针和数组

int ia[10];

auto ia2(ia);//ia2是一个整型指针int *,指向ia的第一个元素。

ia2= 42;//错误:ia2是一个指针,不能用int值给指针赋值。

auto ia3(&ia[0]); //显然ia2的类型是int*。

decltype(ia) ia4 = {1,2,3,4,5,6,7,8,9,0};//正确:当使用decltype关键字时不会发生转换,decltype(ia)返回的类型是由10个整数构成的数组。

int p = 0;

ia4 = p; //错误:不能用整型指针给数组赋值。

ia4[4] = 10;//正确:把i的值赋给ia4的一个元素。

四、指向数组尾部的下一个地主

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

int *e = &arr[10];//指向arr尾元素的下一位置的指针

利用e来写数组循环

for(int *b = arr; b != e; ++b)

     cout << *b << endl; //输出arr的元素

2.使用标准库函数begin和end。

int arr[10];
int *beg = begin(arr);
int *last = end(arr);
for (beg;beg != last;++beg)
{
cout << *beg << endl;
}

五、下标和指针

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

int *p = ia;

int k = p[-2];//p[-2]是ia[0]表示的那个元素

六、使用数组初始化vector对象

不允许使用一个数组为另一个内置类型的数组赋初值,也不允许使用vector对象初始化数组。相反的,允许使用数组来初始化vector对象。要实现这一目的,只需指明要拷贝区域的首元素地址和尾后地址就可以了:

int int_arr[] = {1,2,3,4,6,7};

vector<int> ivec(begin(int_arr),end(int_arr)); //ivec有6个元素,分别是int_arr中对应元素的副本。

用于初始化vector对象的值也可能仅是数组的一部分

vector<int>subVec(int_arr + 1, int_arr + 4); //拷贝三个元素:int_arr[1]、int_arr[2]、int_arr[3];

[注意]:尽量使用标准库类型而非数组。

七、使用范围for语句处理多维数组

int ia[rowCnt][colCnt]; //12个未初始化的元素

//对于每一行

for(size_t i = 0; i != rowCnt; ++ i)

{

    //对于行内每一列

   for(size_t j = 0; j != colCnt; ++j)

     {

         //将元素的位置索引作为它的值

          ia[i][j] = i * colCnt +j;

      }

}

由于c++新标准中新增了范围for语句,所以前一个程序可以简化如下形式:

size_t cnt = 0; 

for(auto &row : ia)//必须用引用的形式,如果不用就相当于row的类型是int *,这样内层的循环就不合法了,编译器会报错。

    {

         for(auto &col : row)

             {

                     col = cnt;  

                      ++cnt;

              }

   }


  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值