【共读Primer】18.[3.5] 数组 Page101

存放相同的类型,大小声明后不可改变,性能上优于vector。

数组声明

a[d]; // a是名称。d是维度,也就是数组大小,必须是常量表达式

数组的元素会被默认初始化

数组的元素为对象,所以与vector相同,不存在以引用为元素的情况

数组的显示初始化

const unsigned sz = 3;     // 用来定义数组的维度,必须是常量
int ial[sz] = {0,1,2};    // 含有3个元素的数组,元素值分别时0,1,2
int a2[] = {0,1,2};    // 维度是3的数组
int a3[5] = {0,1,2};// 等价于 a3[] = {0,1,2,0,0}
string a4[3] = {"hi", "bye"};// 等价于 string a4[] = {"hi", "bye", ""} 
// int a5[2] = {0,1,2};// 错误 初始值太多

字符数组应该具有零结尾

char c1[] = {'C', '+', '+'};        // 列表初始化,没有空字符,虽然编译器不会报错,但是直接当作字符串使用会有问题
char c2[] = {'C', '+', '+','\0'};    // 列表初始化,含有显示的空字符
char c3[] = "C++";                    // 自动添加表示字符串结束的空字符
//const char a4[6] = "Daniel";        // 错误:没有空间放空字符,实际长度应该是7

数组间是不允许使用“=”进行拷贝和赋值的。

一些复杂的指针,指针的数组,数组的指针,数组的引用

int *ptrs[10];                // ptrs是含有10个整形指针的数组
//int &refs[10] ;                // 错误 不存在引用的数组
int (*Parray)[10] = &arr;    // Parray指向一个含有10个整数的数组
int (&arrRef)[10] = arr;    // arrRef引用一个含有10个整数的数组

访问数组元素

数组的索引从零开始,如果一个数组包含10个元素,那么索引就是0-9.

数组的索引类型是size_t, 这是一个机器相关的无符号类型

索引值的合理范围必须由程序员来保证,这也是很多错误产生的原因

数组和指针

编译器会将数组的名字替换成数组首元素的指针

指针就是数组的迭代器。

    inr arr[] = {0,1,2,3,4,5,6,7,8,9};    
    int *ptrs[10];                // ptrs是含有10个整形指针的数组
    //int &refs[10] ;                // 错误 不存在引用的数组
    int (*Parray)[10] = &arr;    // Parray指向一个含有10个整数的数组
    int (&arrRef)[10] = arr;    // arrRef引用一个含有10个整数的数组

    int *p = arr; // 数组名称是首元素指针
    ++p;          // p指向arr[1], 数组的第二个元素。
    int *e = &arr[10]; // 数组arr的末尾元素的下一个元素地址
    for(int *b = arr; b != e; ++b)
    {
        cout << *b << endl;        //输出arr的所有元素
    }

    // 通过标准库函数来获得首尾地址用来遍历整个数组
    //int *pbeg = begin(arr);
    int *pend = end(arr);
    for(int *pbeg = begin(arr); pbeg != pend; ++pbeg)
    {
        cout << *pbeg << endl;        //输出arr的所有元素
    }

指针的运算

int *ip = arr;
int *ip3 = ip + 3; // 指针可以加减一个整数,意义是对指针进行数组内移动,+为向后,-为向前,移动的数量为运算符号后的数量。
auto n = ip3 - ip; // 两个指针相减,所得的类型是prtdiff_t,一个带符号类型。得数是两个原素间的位置差值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值