定义及其初始化
1、数组的维数必须用值大于等于1的常量表达式定义(包括:整型字面值常量、枚举常量、用常量表达式初始化的整型const对象),非const变量以及到运行阶段才知道其值的const变量都不能用于定义数组的维数。
3、定义数组时没有显式的初始化,则:
----在函数体外定义的内置数组,元素均初始化为0
----在函数体内定义的内置数组,元素均无初始化
----无论在何处定义,若其元素为类类型,则自动调用其默认的构造函数初始化;若无构造函数,则必须为该数组的元素提供显式的初始化
2、字符数组可以使用字符串字面值进行初始化,但当使用字符串字面值来初始化字符数组时,将在数组后面加入空字符,例如:char A[] = "C++"; //A的维数是4
3、与vector不同,一个数组不能用另一个数组初始化,也不能将一个数组赋值给另一个数组
注意:数组长度固定,一旦定义,就无法添加新的元素。但是若要添加,则需要自己更改内存remalloc()以及malloc()函数可以实现
数组的操作
下标访问。下标的数据类型:size_t
指针
定义及其初始化
建议:尽量避免使用指针和数组
指针和数组容易产生不可预料的错误。其中一部分是概念上的问题:指针用于低级操作,容易然生与繁琐细节相关的(book keeping)错误。其他错误则源于使用指针的语法规则,特别是声明指针的语法。
许多有用的程序都可不使用数组或指针实现,现代C++程序采用vector类型和迭代器取代一般的数组、采用string类型取代C风格字符串。
指针可能的取值
一个有效的指针必然是以下三种状态之一:保存一个特定对象的地址;指向某个对象后面的另一对象;或者是0值。若指针保存0值,表明它不指向任何对象。未初始化的指针是无效的,直到给该指针赋值后,才可使用它。
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
将C语言梳理一下,分布在以下10个章节中:
Linux-C成长之路(十):其他高级议题
int ival = 1024;
int *pi = 0; // pi initialized to address no object
int *pi2 = & ival; // pi2 initialized to address of ival
int *pi3; // ok, but dangerous, pi3 is uninitialized
pi = pi2; // pi and pi2 address the same object, e.g. ival
pi2 = 0; // pi2 now addresses no object
指针初始化和赋值操作的约束
对指针进行初始化或赋值只能使用以下四种类型的值:
(1)0值常量表达式。
(2)类型匹配的对象的地址。
(3)另一对象之后的下一地址。
(4)同类型的另一个有效指针。
把int型变量赋给指针是非法的,尽管此int型变量的值可能为0。
void*指针
C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址:
double obj = 3.14;
double *pd = &obj;
// ok: void* can hold the address value of any data pointer type
void *pv = &obj; // obj can be an object of any type
pv = pd; // pd can be a pointer to any type
----void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型。
----void*指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void*指针或从函数返回void*指针;给另一个void*指针复制。
----不允许用void*指针操纵它所指向的对象。