C++ primer 学习笔记(二)

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,作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

猜你喜欢

转载自blog.csdn.net/qq_38224589/article/details/81501494
今日推荐