您的位置:首页 > 编程语言 > C语言/C++

数组基础

2017-01-22 16:57 183 查看



1.数组与vector

 数组vector
容器大小必须固定自由添加
性能对于某些应用起来性能较好对于某些应用起来性能较差
引用对象元素不允许存放引用对象元素不允许存放引用对象
定义和初始化默认初始化,有元素默认初始化,为空没有元素
 列表初始化列表初始化
 指定数量初始化,同默认初始化,无法指定初始化值指定数量和值初始化,
访问元素下标:range for下标:range for
 迭代器指针
   
2.内置数组的定义和初始化


基础定义和默认初始化


是一种复合类型,因为要借助其他对象的类型,与[ ] 拼凑而成
a[d] 表示数组名字为a,维度/容量为d, 
维度在编译的时候就已经定了

维度不能在程序运行时被改动--->d 必须是一个常量或者常量表达式

默认初始化
 数组在定义的时候就会被初始化:int arr[10]

 内置类型的说明
内置类型就是那些C++已经自带的类型:int char float 等 
推广到标准库的类型:string, vector等  

 auto关键字在数组中
定义数组必须是明确的对象类型 
不允许使用auto来定义或者初始化数组
 :auto a[10]
数组对象无法存放引用对象 int &a[10]


数组显示初始化

 列表初始化
可以忽略数组的维度,int a[] = {0,1,2,3}
编译器会根据列表初始值的数量来推断出来

  需要注意指明了维度的列表初始化
如果指明了维度,在列表初始化中数量不能超过维度的大小
如果列表初始化中数量小于维度,剩下的被初始化为默认值

  需要注意标准C++对于数组拷贝和赋值支持

不允许拷贝初始化
int a[] = {1,2,3}
int a2[] = a;   error

不允许“=”赋值
a2 = a;    error    


字符数组

   需要注意字符数组一定要结尾处有一个空字符
字符数组的初始化
列表初始化
char a1[] ={'C','+','+'}    

字符串初始化
char a2[] = "C++"      //含有4字符,最后面有一个空字符

复杂复合类型数组的申明   

 指针数组
其表述有一定的问题,可以理解为指针的数组,
用来存放指针的数组 

定义的格式 int *ptrs[10]

具体理解
从右往左来分析:首先是大小为10的数组,
然后名字是ptrs,数组元素的类型是int类型的指针
ptrs是一个含有10个整形的指针数组  

数组指针
可以理解为数组的指针,其实是一个指针,但是这个指针指向的是数组
定义格式:int (*parray)[10]
具体理解
 数组最好是由内向外来理解,首先是圆括号里面是一个指针,
右边是是指向大小为10的数组指针,
左边是可知数组的元素类型是int,
parray是一个指向含有10个整数的数组

引用数组,理解为存放引用的数组,这个不允许的
引用没有具体的内存,不是对象
int
&refs[1]    

数组引用,数组的引用,主要是定义引用,其类型是一个数组
int (&refarray)[10]
数组最好是由内向外来理解,首先是圆括号里面是一个引用,
右边是大小引用对象时一个大小为10的数组,
左边是可知数组的元素类型是int
rarr是一个引用含有10个整数的数组    

实例练习:

实例数组的定义,尤其是维度常量的使用,auto和引用的错误使用
数组列表初始化的实例,注意维度和列表范围之间的关系,拷贝和赋值的错误使用
字符数组类型
复杂数组类型的实例 

int a[10];

string sa[10];


void main()

{



#pragma region 实例数组的定义,尤其是维度常量的使用,auto和引用的错误使用


//迭代器begin和end是两个关键的位置元素

//尤其end并不是最后一个元素,而是最后一个元素后面的一个位置,并不是元素

unsigned int d = 10;

//int arr[d];//err 指定数组大小的时候必须是一个常量


const unsigned cd = 10;

int arr2[cd];

int arr3[10];

string sa1[cd];


//默认初始化数组的值

for (auto i : arr2)

{

cout << i << " ";

}

cout << endl;


for (auto i : sa1)

{

cout << i << " ";

}

cout << endl;


//全局变量数组的默认初始化

for (auto i : a)

{

cout << i << " ";//初始化为0

}

cout << endl;


for (auto i : sa)

{

cout << i << " ";

}

cout << endl;


#pragma endregion


#pragma region 数组列表初始化的实例


int barr[3] = { 1, 2, 3 };

int barr2[] = { 1, 2, 3 };

int barr3[5] = { 1, 2, 3 };//多出来的数组会被默认初始化为0

//int barr4[2] = { 1, 2, 3 };//err 列表初始化的时候必须要在数组大小范围内


for (auto i : barr3)

{

cout << i << " ";

}

cout << endl;


//int barr4[] = barr;//err 数组不允许拷贝或者赋值

//int barr5[] = { 1, 2, 3 };

//barr5 = barr2;


#pragma endregion


#pragma region  字符数组类型

//一定要注意其后面必须有一个/0作为结束符

char carr1[] = "Wall.E";

for (auto i : carr1)

{

cout << i << " ";

}

cout << endl;


//char carr1[6] = "Wall.E";//err 大小不匹配,记得结束符


#pragma endregion



#pragma region  复杂数组类型的实例


int darr[10];


int *ptrInt[10];//是一个数组,数组存放10个int类型的指针

//int &refInt[10];//err 数组无法存放引用类型

int(*pArry)[10] = ↓//是一个指针,指向的是大小为10的int类型数组

int(&refArry)[10] = darr;//是一个引用,引用的是大小为10的int类型数组



#pragma endregion



system("pause");

return;

}


3.访问数组元素

数组下标
下标的类型:size_t 是一个无符号类型
可以使用 range for来访问数组

使用下标需要注意的地方
要判断其是否在数组范围内,不要越界

 

 实例练习:

使用数组来统计分数
数组下表的类型的实例



#pragma region 使用数组来统计分数


int grade[11] = {};

int score;

int index = 0;

while (cin >> score)

{

if (score<=100)

{

++grade[score / 10];

index++;

}

if (index >10)

{

break;

}

}


for (auto i: grade)

{

cout << i << endl;

}



#pragma endregion



#pragma region 访问数组,注意下标的范围


const size_t  arrary_size = 10;

int ia[arrary_size];

//这里注意数组的范围是是从0开始的,如果大小10的数组,其范围是0-9

for (size_t i = 0; i < arrary_size; i++)

{

ia[i] = i;

cout << i << endl;

}


int ia2[arrary_size];

for (size_t i = 0; i < arrary_size; i++)

{

ia2[i] = ia[i];

cout << ia2[i] << endl;

}


vector<int> v1{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };

vector<int> v2(v1);//使用vector进行拷贝的是时候是可以直接赋值初始化的


#pragma endregion



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息