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 
原文地址:https://www.cnblogs.com/yican/p/3900021.html