一、数组
1.数组:一组有序数据的集合。数组中每个元素都属于同一个数据类型。
注:
- 数组的本质是常指针,即不能再改变地址的指针。
- 数组的下标从0开始,注意不要数组越界。
- 不能将一个数组赋给另一个数组(二等公民)。
二、指针
指针是一个值为内存地址的变量,也就是用来存储地址的变量。在大多数系统内部,指针是由无符号整数表示。
1.指针声明
int *p ;
注:不能简单的将一个整数赋给一个指针(一般只有0才可以)
2.指针初始化
int *p = NULL = 0; //NULL是特殊的地址0,叫空指针
int *p = &a; //p初始化为a的地址
int *p = new int(); //申请一个空间给p,c++方式
int *p = (int *)malloc(sizeof(int)) //申请一个空间给p,c方式
对指针执行间接访问前,指针必须进行初始化,或者使它指向现有的内存,或者给它分配动态内存,对未初始化的指针变量执行间接访问操作是非法的。
指针的值(即地址)应属下列4种状态之一:
- 指向一个对象。
- 指向紧邻对象所占空间的下一个位置。
- 空指针,意味着指针没有指向任何对象。
- 无效指针,也就是上述情况之外的其他值。
注:声明一个指针变量并不会自动分配任何内存。
3.指针运算(一般涉及数组)
(1)指针与整数的加减运算
p += k; // 根据类型增加k个sizeof(a[0])
可以把一个整型值加到一个指针上,也可以从一个指针减去一个整型值。在这两种情况下,这个整型值会进行调整,原值将乘以指针目标类型的长度。
对一个指针加1将使它指向下一个变量,至于该变量在内存中占几个字节的大小则与此无关。注意操作合法性。
(2)指针与指针的减法
如果两个指针都指向同一个数组中的元素,那么它们之间可以相减。指针减法的结果经过调整(除以数组元素类型的长度),表示两个指针在数组中相隔多少个元素。如果两个指针并不是指向同一个数组的元素,那么它们之间进行相减就是错误的。
4.特殊指针
(1)空指针(null pointer)
空指针不指向任何对象,在试图使用一个指针之前要检查它是否为空。
int *p = NULL = 0;
(2)void* 指针
void* 是一种特殊的指针类型,可用于存放任意对象的地址。
一个 void* 指针存放着一个地址,这一点和其他指针类似。不同的是,并不知道该地址中是个什么类型的对象。malloc 返回的就是void* 指针。
(3)野指针
即未初始化和非法的指针,将任意数值赋值给指针变量没有意义。
(4)指针常量(pointer constant)
一般指NULL(空指针)。编译器会把变量放在内存中的什么位置。在极少见的情况下,偶尔需要使用指针常量,这时可以通过把一个整型值强制转换为指针类型来创建它。
三、引用
1.引用的概念:引用是对一个变量或常量标识符起的别名。本身地址为引用变量的地址。
数据类型 &引用名 = 变量名; int &ra = a;
注:
- 创建一个引用时,该引用必须被初始化。所以不能有空引用。
- 不允许把为一个变量建立的引用重新用作另一变量的别名。
- 对于 void 和 数组名不可以引用,但是可以对数组的某个元素的引用。
- 不要返回指向局部变量或临时对象的引用。
2.指针和引用
(1)不同点:
- 指针和引用对它们所指的或所引用的变量的操作方式不一样。
- 指针的功能更强大,但同时也更不受控制。
- 引用则是较高级地封装了指针的特性,它不直接操作内存地址,因而具有较高的安全性,也不易产生由于使用指针而常常产生的那些不易察觉的错误,不失为一种好的选择。
(2)相同点:都可以采用间接操作的手段对某个变量所代表的空间进行访问。