数组的类型 不能是引用。即不存在引用的数组。
数组:
char s[]="C++"; 等价于 char s2[]={'c','+','+','\0'};
数组下标的正确类型是 size_t;
指针:
理解指针声明语句时,从右往左阅读。
EX :string *pstring ; 把 pstring 定义为 指向string 的指针。
有效的指针 的三种状态:
1)一个特定对象的地址 EX: int ival; int *pint=&ival;
2)某个对象后面的另一对象
3)0值,不指向任何对象 EX: int *pint=0; 数值0 或 编译时可获得0值的const 变量 EX : const int c_ival=0; int *pi=c_ival;
或者是 cstdlib 头文件定义的预处理变量NULL. int *pi=NULL;
未初始化的指针是无效的,dangerous的。
特殊的指针类型 void * 可以保存任何类型对象的地址。
指向指针的指针:
EX: int ival=1024;
int *pi=&ival;
int **pi=π
指针 和 数组
注: 表达式中使用数组名时,自动转换为指向数组第一个元素的指针。
指针的算术操作:
int ia[10];
int *ip=ia; // ip points to ia[0];
int *ip2=ip+4; //ip2 points to ia[4];
指针间隔: ip2-ip 结果4 类型是 ptrdiff_t (标准库类型)
指针和下标:
int ia[]={0,2,4,6,8};
int *p=&ia[2];
int j=p[1] ; // p[1] = *(p+1); p[1] = ia[3];
int k=p[-2]; // p[-2]=*(p-2); p[-2]=ia[0];
数组的超出末端指针,相当于 vector.end() ; 常用作哨兵。
EX:
const size_t arr_size=5;
int arr[arr_size];
int *p=arr;
int *p2=p+arr_size;
注:允许计算数组或对象的超出末端的地址,但不可以对此地址进行解引用操作。
指针和 const
1、 指向const对象的 指针。
tip: 指向const的指针 自以为指向const 的指针。
EX: const double *cptr; 或 double const *cptr;
不能把一个void * 保存const 对象的地址。必须使用 const void *
允许把非const 对象的地址 赋给指向const对象的指针。此时则不能通过该指针修改该变量的值
2、const 指针
指针本身的值不能修改
EX: int ival=5;
int *const ptr=&ival;
3、指向const 对象的const 指针
以上1、2 的并集吧
4、指针 和 typedef
typedef string *pstring;
const pstring cstr;
pstring const cstr;
解析: pstring 是 指向string 的指针,而const 修饰的是pstring ,所以 cstr 为指向string 的const指针。定义等价于 string *string cstr;
注意: 字符串字面值的类型就是const char 的数组。
EX: const char *cp1 = "a string example";
数组类型的三个重要的限制:
1) 数组长度固定不变
2)编译时必须知道其长度
3)数组只在定义它的块语句内存在
动态数组: 运行时才确定数组长度, 动态数组将一直存在,直到程序显示释放它。
动态数组存放在程序的自由存储区或堆的操作:
C 库函数 malloc 和 free
C++ new 和 delete
初始化: 1)类类型: 默认构造函数;2) 内置类型,无
可以通过 int *pia = new int[10](); // 元素设置为0,比如const对象的动态数组。
注意: C++ 不允许定义长度为0的数组变量,调用new动态可以创建长度为0的数组是合法的。
动态空间的释放: delete []释放指针所指向的数组空间 注意:[] 告诉指针指向的是数组。必不可少,否则会内存泄露
string.c_str() ; 返回C风格字符串。 返回类型是 const char *
数组初始化vector 对象:
vector<T> ivec(int_arr,int_arr+arr_size); 参数: 数组的第一个元素和最后一个元素的下一个位置的地址
定义指向数组的指针: 声明元素类型、数组变量名字和维数;
EX:
int ia[3][4];
int (*ip)[4]=ia; // ip 指向 长度为4的int数组
ip=ia[2]; // ia[2] 就是长度为4的int数组
int (*ip) [4] 从内向外理解: *ip 是 int[4] 类型 -- 即ip 是指向含有4个元素的数组的指针。
辨析:
int *ip[4]; // 整型指针的数组,长度为4
int (*ip) [4];
用 typedef 简化指向多维数组的指针。
typedef int int_array[4];
int_array *ip = ia ; 等价于上面的定义