数组和指针中应该注意的知识点;
1、数组是由类型名、标示符和维数组成的复合数据类型,数组的维数必须用值大于等于1的常量表达式定义。此常量表达式只能包含整型字面值常量、枚举常量或者用常量表达式初始化的整型const对象,非const变量及要到运行阶段才知道其值的const变量都不能用于定义数组维数。
const unsigned buf_size=512;2、如果数组没有显示初始化,则
int staff_size=27;
int arr[buf_size];//ok
int arr1[staff_size];//error
(1)在函数体外定义的内置数组,其元素均初始化为0;
(2)在函数体内定义的内置数组,其元素无初始化;
(3)不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化;如果该类没有默认的构造函数,则必须为该数组的元素提供显示初始化。
3、字符数组既可以用一组由花括号括起来、逗号隔开的字符字面值进行初始化,也可以用一个字符串字面值进行初始化。当使用字符串字面值来初始化创建的新数组时,将在新数组中加入空字符'\0'。
char ca1[]={'c','+','+'};//no null,size is 3
char ca2[]={'c','+','+','\0'};//explicit null
char ca3="c++";//null terminator added automatically
4、不允许数组直接复制和赋值。
5、避免使用未初始化的指针
6、void*指针表明该指针与一地址相关,但不清楚存储在此地址上的对象类型,void*指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void*指针或从函数返回void*指针;给另一个void*指针赋值;不允许使用void*指针操纵它所指向的对象。
7、指针和引用的比较
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
8、指针和typedef
typedef string* pstring;9、new和delete
const pstring cstr;//等价于string *const cstr
new和delete运算符用于动态分配和撤销内存的运算符
new用法:
1. 开辟单变量地址空间
1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.
2)int *a = new int(5) 作用同上,但是同时将整数赋值为5
2. 开辟数组空间
一维: int *a = new int[100];开辟一个大小为100的整型数组空间
二维: int **a = new int[5][6]
三维及其以上:依此类推.
一般用法: new 类型 [初值]
delete用法:
1. int *a = new int;
delete a; //释放单个int的空间
2.int *a = new int[5];
delete [] a; //释放int数组空间
要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.
用new和delete可以动态开辟,撤销地址空间.在编程序时,若用完一个变量(一般是暂时存储的数组),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它.new和delete运算符用于动态分配和撤销内存的运算符
10、C++虽然不允许定义长度为0的数组变量,但允许调用new动态创建长度为0的数组。