Primer (六)

数组

1. 数组也是容器,和vector的区别在于不能动态增长,必须初始化时指定长度,可以存放任何对象。

2. 引用不是对象,所以没有存放引用的数组。

3. 初始化数组长度必须使用常量:

int a = 10;
const int b = 10;
int c[a]; // 错误,a不是常量
int c[b]; // 正确
4. 用字符串初始化数组时,最后一位默认为空字符。

char s[] = "abcde"; // 自动添加最后的空字符
char s[5] = "abcde"; // 错误,最后空字符没有地方
char s[] = {'a','b','c'}; // 正确,不是字符串,没有最后的空字符
5. 复杂的数组定义

int *p[10]; // 定义10个指针的数组
int (*p)[10] = &arr; // 定义一个指针,指向一个10个int元素的数组arr
int (&r)[10] = arr; // 定义一个引用,引用一个10个int元素的数组arr
int *(&r)[10] = arr; // 定义一个引用,引用一个数组arr,arr包含10个int指针 
判断复杂数组,需要从内向外,从右向左。

6. 数组与vector、string一样,都可以使用范围for和下标两种方式遍历。

7. 数组没有迭代器,指针相当于迭代器,每个数组名就是指向第一个元素的指针,可以移动,作为迭代器使用。

int a[10];
int *e = &a[10]; // e指向a的最后一个元素的下一个
for (int *b = a; b != e; ++b) {
    cout<<*b; // e不可以解引用
}
int *b = begin(a); // 返回数组头指针
int *e = end(a); // 返回数组尾指针,最后一个元素的下一个
int *p = a + 10; // p不可以解引用
int *p = a + 20; // 错误,越界
auto n = end(a) - begin(a); // 得到数组长度,类型为ptrdiff_t
a[3] = {1,2,3};
int *p = &a[2]; // p指向&a[3]
int *q = p[-1]; // 所有指向数组元素的指针,都可以直接当做数组用,这里的下标是可以为负数的
8. 赋值

int a[5];
int b[5] = a; // 错误,不允许数组初始化数组
b = a; // 错误,不允许数组赋值数组
vector<int> v(begin(a), end(a)); // 但是,可以用数组赋值vector,传入两个指针即可

9. c_str()

string s = "abc";
char *p = s; // 错误,s是string不能赋值指针
char *p = s.c_str(); //正确,c_str()将一个string转化成以空字符结尾的char数组,并且返回指向头元素的指针,这样p就指向了char数组的头元素
char c = {'a', 'b', '\0'};
string s = c; // 正确,char数组可以赋值string
c_str()返回一个const char* 临时创建一个string转化的char数组,并指向这个临时数组。
string s = "abc";
const char *p = s.c_str(); // string转化成char[],必须先转化成const char*
cout<<*p<<p<<endl; // a   abc   *p是首元素,p是整个字符串
char c[] = "abcde";
char *p = c + 1; // p指向b *p='b'
string s = p + 1; // s是从c开始到数组结束的字符串
cout<<*p<<endl; // b
cout<<s<<endl; // cde

10. 尽量使用vector和迭代器,代替数组和指针。尽量使用string代替数组表示的旧式字符串。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值