C++primer笔记-第3章 字符串、变量和数组(数组)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liaoyanyunde/article/details/84503396

数组,复合类型,类似标准库类型vector。大小确定不变,不能随意增删数组元素。

数组和对象都是放在堆内存中的。

1、 定义和初始化内置数组

  T a[d]

  • t 是数组元素类型。
    在定义数组时不允许使用auto关键字由初始值列表推断数组类型,必须在声明定义是显式指定数组元素类型
  • a是数组名称
  • d是数组维度。
    维度说明了数组中元素个数,数组维度必须大于0,在编译的时候必须是已知的,所以维度必须是常量表达式。
unsigned cnt = 42;
string bad[cnt];//错误,cnt不是常量表达式

constexpr unsigned sz= 42;
int *parr[sz];//含有42个整形指针的数组
int arr[10];//含有10个整数的数组

string strs[get_size()];//当get_size是constexpr的时候正确;否则错误

  默认情况下,数组的元素是被默认初始化的。但是在函数内部,如果定义了某种内置类型的数组,那么默认初始化会令数组中含有未定义的值。这点跟内置类型一样。
PS:
  内置类型变量的默认初始化,由变量的类型决定,但还受定义变量的位置影响。

  • 定义于函数内部的内置类型的变量不被初始化,如果不显式初始化将会是个未定义值。
  • 定义于任何函数体之外的变量将被初始化为0。
string sa[10];//元素初始值为空字符串
int ia[10];//元素初始值为0
int main(){
	string sa2[10];//元素初始值为空字符串,因为string不是内置类型,而是标准库类型,接受无参初始化,所以无论是函数内部还是外部都会初始化
	int ia2[10];//元素初始值未定义
}

  如果在声明数组的时候没有指定维度,则会根据初始化值得数量计算并推测出来;
  如果在声明数组的时候指定了维度,则在初始化数组的时候元素的数量不能超过指定的维度大小。如果初始值的数量小于数组的维度,则先初始化靠前的元素,剩下的元素被初始化为默认值。

int a1[] = {0,1,2};//维度是3的数组
int a2[10]={1,2,3};//维度是10的数组,前3个元素的初始化值是1,2,3,后7个元素的初始化值是默认初始值。
int a3[2] = {1,2,3};//错误,初始值过多

  当使用字符串字面值初始化char数组时,字符串字面值的结尾处还有一个空字符(\0)也会当做一个元素添加到字符数组中。

char a4[]="C++";//字符数组维度为4,元素分别为 ‘C’ 、 '+'  、 '+'  、'\0'

  不允许拷贝和赋值:不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值。

int a={1,2,3};
int a5{} = a;//错误,不允许使用一个数组初始化另一个数组
a5=a;//错误,不能把一个数组直接赋值给另一个数组

  对于复杂数组声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读
如:int *(&array)[10]= ptrs;
array是数组的引用,该数组含有10个int指针

2、访问数组元素

  数组可以通过范围for语句和下标访问。
  数组的下标索引从0开始。使用下标访问时不能越界
  使用数组下标时,通常将其定义为size_t类型。size_t类型是一种机器相关的无符号类型。

3、指针与数组

猜你喜欢

转载自blog.csdn.net/liaoyanyunde/article/details/84503396