首页 > 代码库 > C++ Primer(第四 五 六章)

C++ Primer(第四 五 六章)

数组与指针

  1. 数组 vs vector:数组长度固定 且不知道数组长度;数组不能直接复制或者赋值 vector可以
  2. 字符数组特殊性:char chr1[3]={‘c‘,‘+‘,‘+‘};char chr2[4]="c++";后者会在最后方式放上null字符,表示字符数组结束,需要比字符数量+1个长度
  3. 数组下标索引:下标类型是size_t(unsigned整型 足够大)   指针索引:类似vector中迭代器索引
  4. 应该尽量避免使用数组和指针 容易出错 c++中应该多用vector 迭代器 string等来代替
  5. 指针:string *str; 与 string* str;二者均可,通常使用前者,string *str1, *str2(二者都是指针); srting* str1,str2(让人误以为二者都是指针 实际上只有str1是的); 
  6. 指针:一定要初始化,在指向对象还没有建立的时候可以初始为0/NULL, NULL是从C语言中继承来的,是预处理变量,编译时处理为0,NULL并不是std空间的 不需要std::NULL
  7. void *指针:特殊性 可保存任何类型对象的地址,但不能用来操纵它指向的对象
  8. 指针引用区别:引用必须初始化 且只指向一个对象  赋值操作的意义不同
  9. 表达式中使用数组名会自动转化为指向数组第一个元素的指针
  10. 指针相减得到数据类型为 ptrdiff_t(signed整型 足够大)
  11. const指针 指向const对象的指针 指向const对象的const指针
    const int *a;//对象为const 指针可另外指向 但是不能通过指针来修改对象的值int *const a;//指针为const 指针指向不能修改 指向对象的值可以修改const int *const a;//指向const对象的const指针const int i=1;int *p=&i;//error 不能把一个const对象的地址  赋值给一个普通的 指向非const对象的指针void *p=&i;//errorconst int*p=&i;//okconst void *p=&i;//ok
    //pstring是字符串指针 const修饰pstring 修饰的是一个指针 因此是常量指针 而不应该按照字面扩展来理解 typedef string *pstring;const pstring cstr;//cstr是string *const类型 下述三种表达是相同的意思
    string *const sctr;
    pstring const sctr;
  12. 动态数组:动态数组 在运行时才决定数组长度  堆空间用于存储动态分配的对象 new delete实现 需要delete释放空间才可以 string *str=new string[n]();delete [] str;
  13. 新旧代码的兼容:string中所有使用字符串字面值的地方都可以使用c风格的字符串代替 反之 不行;使用数组初始化vector;
    char *chr=str;//error const char *chr=str.c_str();//返回的是const指针 防止chr指针修改str对象int arr[]={0,1,2,3,4,5};vector<int> ivec(arr,arr+6);//用数组初始化vector 放入第一个元素和最后一个元素的指针
  14. 多维数组:即数组的数组 并没有实际上的多维数组 row行 column列
    int ia[3][4];int (*ip)[4]=ia;//ip指针指向 int[4]一个指向4个元素的数组的指针 最多可以ip+2为止ip=&ia[2];int *ip[4];//长度为四的数组 数组元素类型为int*   typedef int int_array[4];//typedef 简化多维数组的指针int_array *ip=ia;

c风格字符串

  1. C++支持c风格的字符串 但是不应该在c++中用 容易带来大量安全问题
  2.  字符串字面值的类型是const char类型的数组
  3. c风格字符串 不是C语言类型 也不是c++类型 是以空字符结束的字符数组 char chr[]={‘c‘,‘+‘,‘+‘,‘\0‘};char chr[]="C++";char *chr="C++";均是c风格字符串。若不加null 则不是。(const) char*来操作c风格字符串  标准库cstring是c++中包含处理出风格字符的标准库(与string.h c中字符串库内容相同)
  4.  数组需要告知其长度 否则无法自己获取其长度;  字符数组在没有加空字符的情况下也不知道数组长度  但c风格字符串可以通过空字符遍历来获取长度  因此c风格字符串是有对应函数可以调用; 需要注意 输入s为非零有空字符的字符串  且目标字符串需要有足够大的空间;strn开头的函数是比strcpy strcat安全,能够控制复制字符的个数
    strlen(s);//返回长度 不包含空字符strcmp(s1,s2);//相等返回0 s1>s2 返回正数 否则返回负数strcat(s1,s2);//拼接到s1 并返回s1strcpy(s1,s2);//拷贝给s1strncat(s1,s2,n);//将s2的前n个字符拼接到s1strncpy(s1,s2,n);//将s2的前n个字符拷贝到s1

     

C++ Primer(第四 五 六章)