数组的特性
1、大小固定,不能随意增加元素,也是存放类型相同的对象的容器。
2、数组的维度在声明时必须为确知常量。或者是int b[]={1,2,3}没有显示指明维度,默认维度为3.
以下方式不对:
int a=10;
string s[a]; #a是变量,不是常量除非a声明为const int a=10;
string s1[getSize()]; #函数getSize的返回值不是常量,除非当它是constexpr时;
3、数组不允许拷贝赋值。
4、数组元素初始化:
const int sz=10;
int s[sz]={1,2,3};
string s2[sz]={“bye”,”no”}
5、字符数组的特性:
char a[]={‘c’,’+’,’+’}; #列表初始化,没有空字符
char b[]=”c++”; #字符数组大小为4,自动添加字符串末尾的空字符
char c[]={‘c’,’+’,’+’,’\0’}; #列表初始化,含有显示的空字符
const char d[6]=”Daniel”; #错误,没有空间存放字符串尾部的空字符
6、理解复杂的数组声明
int *ptrs[10]; #指针数组
int &refs[10]=……. #错误,不存在引用的数组
int (*Parray)[10]=&arr; #指针,指向一个含有10个元素的数组
int (&arrRef)[10]=arr; #引用一个含有10个整数的数组
int *(&arry)[10]=ptrs; #引用一个含有10个整形指针的数组
note:要想理解数组声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读
7、遍历数组元素
for(auto i:scores) #将i改为&i即可实现对scores元素的修改
cout<<i;
8、数组下标的类型是size_t。它是一种及其相关的无符号类型,在cstddef.h头文件中定义。
思考:相比于vector,数组有哪些缺点
p3.31
const int size=10;
int a[size];
for (int i=0;i<size;i++)
a[i]=i;
int b[size]={};#全部初始化为0
int k=0;
for (auto &i:b)
i=a[k++];
vector<int> iv;
for(int i=0;i<size;i++)
iv.push_back(a[i]);
指针与数组
1、对数组取地址即获得指向该元素的指针;在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。
int num[]={1,2,3,4};
int *p=num;等价于int *p=num[0];
auto ia(num); 等价于 int *ia=num;
auto ia2(&num[0]);ia和ia2的类型是指针
2、指针也是迭代器,指向数组元素的指针支持vector和string的迭代器所支持的运算。
*p;
p->men;
++p;
–p;
p1==p2;
p1!=p2;
p1+n; 指针加上一个整数所得结果还是一个指针,注意相加后不能超过数组的size
p1-p2; 注意是指向数组的指针
、<、>=、<=
3、C++11标准库函数begin和end
int ia[]={2,3,4,5};
int *beg=begin(ia);
int *end=end(ia); #指向尾元素下一位置的指针,与尾迭代器一样,不能自加和解引用
4、指针下标不是无符号类型,这与string和vector的迭代器不一样
int *p=ia[2];
int j=p[1]; #p[1]指向*(p+1)位置,即ia[3]
int k=p[-2];#指向ia[0]
p3.35
int num[]={2,3,6,5,4};
auto a(num);
int *endi=end(num);
for(;a!=end;a++)
*a=0;
for(int i=0;i<end(num)-begin(num))
cout<<num[i];
p3.36
int a[]={2,3,4,5};
int b[]={5,4,6,7};
if(end(a)-begin(a)==end(b)-begin(b)){
for(int i=0;i<end(a)-begin(a);i++){
if(a[i]!=b[i]){
cout<<"数组不相等"<<endl;
break;
}else if(i==(end(b)-begin(b))-1)
cout<<"数组相等"<<endl;
}
}
else{
cout<<"数组不相等"<<endl;
}
vector a{2,3,4,5,7};
vector b{1,2,3,4,5};
auto iter2=b.begin();
if(a.size()!=b.size()){
cout<<”数组不相等”;
}else{
for(auto iter=a.begin();iter!=a.end();iter++){
if (*iter!=*iter2)
cout<<”数组不等”<