本文主要讲述数组,各种类型的指针以及指针和数组的联系。
1.数组
(1) 数组的定义 只需要注意一点,定义数据时,必须明确指定数组的长度,这个长度不能是变量。如果在定义数组时就对数组进行初始化,可以不必指定数组长度,
那么数组长度就是初始化元素的个数。
(2) 数组的初始化
数组为内置类型全局变量,自动初始化为0
为内置类型局部变量,必须显示初始化
数组为类类型,无论是全局变量还是局部变量,都会自动调用类的默认构造函数初始化,若类无默认构造函数,则必须显示初始化。
(3)字符数组
"Hello"是个特殊的字符数组 等于 const char CArray[ ] = {'H','e','l','l','o','\0'}
(4)数组不允许直接复制和赋值
2.指针
(1) 指针的定义
int* p; int *p; *号可以跟着int, 也可以跟着p.
(2)指针的初始化
a. 0或Null
b. 和指针相同类型的变量地址
c. 另一个对象的地址的下一个地址
d.相同类型的另一个指针
(3) 指向指针的指针 其值是另一个指针的地址 int *p = 0; int **q =&p;
(4) 指向const对象的指针
const int i = 0;
int* const p = &i;
p也可以指向非const变量,p本身的值可以改变,*p不能改变
(5) const指针
指针本身的值不能改变,但是指针指向的变量值是否可以改变取决于变量本身是否是常量。
int i = 1;
int const *p =&i;
(6)指向const变量的const指针
本身的值不能改变,指向的值也不能改变。
const int const *p;
(7) 指针的算术操作
连个指针相减得到ptriff_t类型的值
(8)指针和引用的区别
引用在声明时就必须初始化;
引用一旦初始化,就永远和最初的变量相联系,改变引用的值,等于改变相关联变量的值; 而指针初始化以后可以再指向另外一个变量。
3. 指针和数组的关系
(1)一维数组名为数组第一个变量的地址,可赋值给一个指针
(2)new, malloc可动态创建数组,new创建的数组在栈中,malloc创建的数组在自由区中
创建常量数组: const int* p = new const int[8](); 必须初始化
(3)指针和二维数组
int a[3][4];
int (*p)[4] = a;
p是一个指向有4个int元素数组的指针,*p为第一个元素的地址,*p中存放是一个Int 指针,**p是元素的值
p=&a[0]; p++=&a[1];
*p = &a[0][0]; *p++=&a[0][1]; **p = a[0][1];
int *p[4]; 表示为有4个int指针元素的数组
typedef string* ptr;
const ptr astring = string* const astring;