C++primer 4.1 数组----显示初始化

本文详细介绍了C++中的数组定义和初始化,包括数组的维数限制、显示初始化和隐式初始化的区别,特别是字符数组的特殊处理。此外,还强调了数组与vector在操作上的差异,如数组长度固定且无法动态调整,而vector可以通过push_back操作添加元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:《10.1,10.2关联容器—-三种构造函数》
http://blog.csdn.net/hlsdbd1990/article/details/46438003

参考:《 4.1 数组 —-显示的初始化》
http://blog.csdn.net/hlsdbd1990/article/details/45561403

参考:《 12.4.5 类成员的显示初始化》
http://write.blog.csdn.net/mdeditor#!postId=46605673

简介

c++语言提供两种类似于vector和迭代器的低级复合类型—-数组和指针。
数组与vector相比,有如下缺点:

  • 数组长度固定,不提供获取其容量大小的的size操作,也不提供自动添加元素的push_back 操作;
  • 我们无法在程序运行时知道一个给定的数组的长度;
  • 如果需要更改数组的长度,程序员需要创建一个更大的新数组,然后把原数组的所有元素复制到新数组的存储空间中去;
  • 更容易出错,难以调试

=======================================================================================

一、数组的定义和初始化

1、数组的维数

  1. 数组的维数必须是大于等于1的常量表达式,此常量表达式只能包含整型字面值常量(1、2、3这种)、枚举常量和用常量表达式初始化的整型 const对象

(看后面的例子 )

  1. 非const变量以及要到运行阶段才知道值的const变量都不能用于定义数组的维数。

2、数组的初始化

  1. 显示初始化:显示地提供初值 int ia[]={1,2,3}

    《12.4.5 类的显示初始化》里边也有提到,容器里面的初始化都是通过构造函数的,没有显示的初始化

  2. 隐式初始化:没有显示提供初值

    1. 在函数体外定义的内置整型数组,其元素均初始化为0;
    2. 在函数体内定义的内置整型数组,其元素无初始化。
    3. 如果是string 类型数组,如果没有显示初始化,那么无论在函数内还是外都初始化为空串
  3. 不允许数组直接复制和赋值。一个数组不能给另外一个数组初始化,也不能将一个数组赋值给另外一个数组,操作非法。
int ia[]={1,2,3};//显示初始化
int ia2[](ia);
int main()
{
const unsigned array_size=3;
int ia3[array_size];
ia3=ia;     //错误!!!!不能用数组直接复制
int ia4[]=ia;//错误,不能用一个数组来初始化另一个数组 
return 0;
}
//哪些是可以定义的
int main()
{
const unsigned buf_size=512,max_files=20;
int staff_size=27   //不是const变量
const unsigned sz=get_size();//const 型变量,但一定要到运行阶段才知道其值;
char input_buffer[buf_size];//可以,因为下标是一个const变量
string fileTable[max_files+1];//可以,因为max_files是const变量,所以max_files+1常量表达式
double salaries[staff_size];// 不行,因为下标不是const变量
int test_scores[get_size];//不行,不是常量表达式
int vals[sz];//不行,运行时才知道sz值
}

3、特殊的字符数组

  1. 字符数组既可以用一组由花括号括起来、逗号隔开的字符字面值进行初始化,也可以用一个字符串字面值进行初始化;
  2. 这两种初始化形式不完全相同,字符串字面值包含一个额外的空字符(null)用于结束字符串。
  3. 当使用字符串字面值来初始化创建的新数组时,将在新数组中加入空字符。

    注:好像涉及到字符串字面值的时候都会在后面额外添加一个空字符!
    * 注意最后面三个例子的区别*

  4. 还有vector对象的初始化有哪些,记住它和数组初始化的区别,看前面一个章节,vector在没初始化之前是不能通过下标值进行初始化的,下标值只能访问里面的元素,并不能改变vector里面的值,要想改变可以通过push_back操作和iterator迭代器。

//important

char ca1[]={'c','+','+'};     //维数是3
char ca2[]={'c','+','+','\0'};//维数是4
char ca3[]="c++";            //维数是4,自动在末尾添加一个\0
char ca4[5]="hello";
//将导致编译出错!!!因为字符串字面值hello包含了5个显示字符,但是存放该字符
//串的数组必须有6个元素------5个用于存储字面值,一个用于存储null空字符
char ca4[5]={'h','e','l','l','o'};
///这个就是对的!!!
vector<int> ivec={0,1,2,4,6,78};
//错误!!!!vector对象不能用这种方式初始化

二、数组操作

1、数组操作

  1. 下标访问vector中的元素,用vector::size_type类型作为下标的类型;
  2. 下标访问数组中的元素,用size_t类型作为下标的类型
 int main ()
{
const size_t arrar_size=10;//下标类型是size_t类型
int ia[arrar_size];
for(size_t ix=0;ix!=arrar_size;ix++)
ia[ix]=ix;
for(size_t ix=0;ix!=arrar_size;ix++)
cout<<ia[ix]<<endl;
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值