1、如果在函数内部定义了某种内置类型的数组,则默认初始化会令数组含有未定义的值。
2、定义数组的时候必须指定数组的类型,不允许用auto关键字由初始值的列表推断类型。
3、数组的元素应为对象,因此不存在引用的数组。
4、可以对数组的元素进行列表初始化,此时允许忽略数组的维度。
5、不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。
6、允许定义数组的指针及数组的引用
int *ptr[10]; //ptr是含有10个整形指针的数组
int &refs[10] = /?/; //错误:不存在引用的数组
int (*Parray)[10] = &arr; //Parray指向一个含有10个整数的数组
int (&arrRef)[10] = arr; //arrRef引用一个含有10个整数的数组
由内向外,先左后右,左边是类型
7、在使用数组下标的时候,通常将其定义为size_t类型。
8、当数组或其他类似数据结构的下标越界并试图访问非法内存区域时,就会产生缓冲区溢出错误。
9、对数组的元素使用取地址符&就能得到指向该元素的指针;
在用到数组名字的时候,编译器都会自动地将其替换为一个指向数组首元素的指针;因此在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。
当使用数组作为一个auto变量的初始值时,推断得到的类型是指针而非数组;
当使用decltype关键字时上述转换不会发生,decltype返回的类型是由10个整数构成的数组。
10、使用begin和end可以很容易的写出一个循环并处理数组中的元素。
int ia[]={0,1,2,3,4,5,6,7,8,9};
int *beg = begin(ia); //指向ia首元素的指针
int *last = end(ia); //指向ia尾元素的下一位置的指针,尾后指针不能执行解引用和递增操作;
eg:找到arr中的第一个负数
int *pbeg = begin(arr), *pend = end(arr);
while (pbeg != pend && *pbeg >=0) ///将其解引用并检查元素值是否为负值。
++pbeg;
11、两个指针相减的结果是他们之间的距离,类型是一种名为ptrdiff_t的标准库类型。
12、
int main()
{
int ia[] = { 0,2,4,6,8 };
int i = ia[2];
cout << i << endl;
int *p = ia;
cout << *p << endl;
i = *(p + 2);
cout << i << endl;
int *q = &ia[2]; //q指向索引为2的元素
cout << *q << endl;
int j = q[1]; //q[1]等价于*(q+1),就是ia[3]表示的那个元素
cout << j << endl;
int k = q[-2];
cout << k << endl;
}
13、c_str函数的返回值是一个C风格的字符串,也就是说,函数的返回结果是一个指针,该指针指向一个以空字符结束的字符数组。
string s(“Hello World”);
const char *str = s.c_str();
14、 不允许使用vector对象初始化数组,但允许使用数组来初始化vector对象,只需指明要拷贝区域的首元素地址和尾后地址就可以了
int int_arr[] = {0,1,2,3,4,5};
vector ivec(begin(int_arr),end(int_arr));
15、当数组的大小未知时,需要动态声明一维数组,声明格式如下:
int* a=new int[n];
当数组使用完毕时,需要使用:
delete []a;
释放内存空间。
16、多维数组其实是数组的数组,第一个维度称作行,第二个维度称作列。
int a[3][4];
大小为3的数组,每个元素是含有4个整数的数组;
17、要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。
int main()
{
int ia[3][4] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
//输出ia中每个元素的值,每个内层数组各占一行
//p指向含有4个整数的数组
for (auto &row : ia)
for (auto &col : row)
cout << col << " ";
}
18、
int main()
{
int ia[3][4] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
//输出ia中每个元素的值,每个内层数组各占一行
//p指向含有4个整数的数组
for (auto p = ia; p != ia + 3; ++p)
//q指向4个整数数组的首元素,也就是说,q指向一个整数
for (auto q = *p; q != *p + 4; ++q)
cout << *q << " ";
cout << endl;
}
或者
int main()
{
int ia[3][4] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
//输出ia中每个元素的值,每个内层数组各占一行
//p指向含有4个整数的数组
for (auto p = begin(ia); p != end(ia); ++p)
//q指向4个整数数组的首元素,也就是说,q指向一个整数
for (auto q = begin (*p); q != end(*p) ; ++q)
cout << *q << " ";
cout << endl;
}
19、C++规定,在声明和初始化一个二维数组时,如果对二维数组的所有元素赋值,则第一维(行)可以省略,但注意第二维不能省略。
20、一个二维数组元素a[x][y]在一维数组b中,是
a[x][y]=b[x*列数+y];
21、二维数组的动态声明
int *a=new int [m];
for(int i=0;i
int strlen(cosnt char *str) {
asser(str != NULL);
int len = 0;
while ((*str++) != '\0')
len++;
return len;
}
34、memcpy
void *memcyp(void *dest,const void *src,size_t n);
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。函数返回指向dest的指针。
35、memset
void *memset(void *s, int ch, size_t n);
将s中前n个字节用ch替换并返回s,作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。