C++数组和指针
1:数组
数组是由类型名、标识符和维数组成的复合数据类型,类型名规定了存放在数组中的元素的类型,而维数则指定数组中包含的元素个数。
数组定义中的类型名可以是内置数据类型或类类型;除引用之外,数组元素的类型还可以是任意的复合类型。没有所有元素都是引用的数组。
数组的维数必须用值大于等于 1 的常量表达式定义
const int a = 3;
//const unsigned sz = get_size() 错误,运行时才知道大小的不行
//int a = 3;错误 int b[a];
使用一组字符字面值初始化字符数组时,一定要记得添加结束字符串的空字符。例如,下面的初始化将导致编译时的错误:
const char ch3[6] = "Daniel"; // error: Daniel is 7 elements
与 vector 不同,一个数组不能用另外一个数组初始化,也不能将一个数组赋值给另一个数组,这些操作都是非法的
与vector的下表类型是vector::size_type不同数组的下标类型是size_t;
2:指针
int main() { int v = 5; int *p = 0; //p initialized to address no object 输出为00000000 int *p1 = &v; cout << "p's address is " << p <<endl<< "p1's address is " << p1 << endl; }
不初始化的坏处:如果使用未初始化的指针,会将指针中存放的不确定值视为地址,然后操纵该内存地址中存放的位内容。使用未初始化的指针相当于操纵这个不确定地址中存储的基础数据。因此,在对未初始化的指针进行解引用时,通常会导致程序崩溃
把 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允许把数值 0 或在编译时可获得 0 值的 const 量赋给指针:
int ival; int zero = 0; const int c_ival = 0; int *pi = ival; // error: pi initialized from int value of ival pi = zero; // error: pi assigned int value of zero pi = c_ival; // ok: c_ival is a const with compile-time value of 0 pi = 0; // ok: directly initialize to literal constant 0
对指针进行初始化或赋值只能使用以下四种类型的值:
1. 0 值常量表达式(第 2.7 节),例如,在编译时可获得 0 值的整型 const 对象或字面值常量 0。
2. 类型匹配的对象的地址。
3. 另一对象末的下一地址。
4. 同类型的另一个有效指针。
把 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允许把数值 0 或在编译时可获得 0 值的 const 量赋给指针:
指针可以修改变量的值,对于一个指向const的值的指针也要限定为指向const对象的指针,不然指针修改值就会变动,这样const的值就没意义了。const double *p;
在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。
http://blog.csdn.net/tobacco5648/article/details/8530975 const指针和指向const对象的指针的区别
动态数组
每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。C 语言程序使用一对标准库函数malloc 和 free 在自由存储区中分配存储空间,而 C++ 语言则使用 new 和 delete 表达式实现相同的功能。
数组变量通过指定类型、数组名和维数来定义。而动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new 表达式返回指向新分配数组的第一个元素的指针
int *pia = new int[10]; // array of 10 uninitialized ints
此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。
可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化,对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。
int *pia2 = new int[10] (); // array of 10 uninitialized ints