C++ 数组和指针学习总结(二)

2014-11-24 02:02:54 · 作者: · 浏览: 4
用,获得ia所指元素的值ia[0],然后加4。
七、计算数组的超出末端指针
[cpp]
 const size_t arr_size = 5;
  int arr[arr_size] = {1, 2, 3, 4, 5};
  int *p = arr;     // ok: p points to arr[0]
  int *p2 = p + arr_size; // ok: p2 points one past the end of arr
     // use caution -- do not dereference!
C++允许计算数组或对象的超出末端的地址,但不允许对此地址进行解引用操作。而计算数组超出末端位置之后或数组首地址之前的地址都是不合法的。
可使用此超出末端指针的当做一个哨兵,如同在vector中使用的end变量一般,用于输出和遍历数组,这是一个好习惯
八、指针和const限定符
指向const对象的指针
[cpp]
const double *cptr;    // cptr may point to a double that is const
const限定了cptr指针所指向的对象类型,而并非cptr本身。也就是说,cptr本身并不是const。
允许通过给cptr赋值,使其指向一个const对象,但不能通过cptr修改其所指向的对象的值。
不能使用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址:
[cpp]
const int universe = 42;
  const void *cpv = &universe; // ok: cpv is const
  void *pv = &universe;     // error: universe is const
不能使用指向const对象的指针修改基础对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指的对象。
九、const指针
C++语言还提供了const指针——本身的值不能修改:
[cpp]
int errNumb = 0;
 int *const curErr = &errNumb;    // curErr is a constant pointer
 curErr = curErr;            // error: curErr is a constant pointer
指向const对象的const指针,既不能修改所指对象的值,也不允许修改指针的指向。
假设给出以下语句:
[cpp]
typedef string *pstring;
const pstring cstr;
请问cstr变量是什么类型:
[cpp]
 const string *pstring; // wrong interpretation of const pstring cstr
  string *const cstr; // equivalent to const pstring cstr,等价于这句话
C风格字符串
C风格字符串的标准库函数(要使用这些标准库函数,必须包含相应的C头文件:cstring)
strlen(s)       strcmp(s1, s2)      strcat(s1, s2)
strcpy(s1, s2)    strncat(s1, s2, n)    strncpy(s1, s2, n)
注意:这些标准库函数不会检查其字符串参数
永远不要忘记字符串结束符null,调用者必须确保目标字符串具有足够的大小
如果必须使用C风格字符串,则使用标准库函数strncat和strncpy比strcat和strcpy函数更安全
[cpp]
char largeStr[16 + 18 + 2]; // to hold cp1 a space and cp2
strncpy(largeStr, cp1, 17); // size to copy includes the null
strncat(largeStr, " ", 2);   // pedantic, but a good habit
strncat(largeStr, cp2, 19); // adds at most 18 characters, plus a null
对大部分的应用而言,使用标准库类型string,除了增强安全性外,效率也提高了,因此应该尽量避免使用C风格字符串。
创建动态数组
动态数组的定义
[cpp]
int *pia = new int[10];  // array of 10 uninitialized ints
new表达式返回指向新分配数组的第一个元素的指针
初始化动态分配的数组
可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化:
[cpp]
int *pia2 = new int[10]();  // array of 10 uninitialized ints
对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。
const对象的态数组
[cpp]
// error: uninitialized const array
 const int *pci_bad = new const int[100];
 // ok: value-initialized const array
 const string *pci_ok = new const int[100]();
允许动态分配空数组
[cpp]
char arr[0];       // error: cannot define zero-length array
char *cp = new char[0];    // ok: but cp can't be dereferenced
用new动态创建长度为0的数组时,new返回有效的非零指针。该指针与new返回的其他指针不同,不能进行解引用操作,因为它毕竟没有指向任何元素。而允许的操作包括:比较运算,因此该指针能在循环中使用;在该指针上加(减)0;或者减去本身,得0值。
动态空间的释放
动态分配的内存最后必须进行释放,否则,内存最终将会逐渐耗尽。
使用数组初始化vector对象
[cpp]
  const size_t arr_size = 6;
  int int_arr[arr_size] = {0, 1, 2, 3, 4, 5};
  // ivec has 6 elements: each a copy of the corresponding element in int_arr
  vector i vcec(int_arr, int_arr + arr_size);
多维数组
严格地说,C++中没有多维数组,通常所指的多维数组其实就是数组的数组。
代码::
[cpp