指针小结
-
声明指针
// 要声明指向特定类型的指针 typeName * pointerName;
-
给指针赋值
/* 应将内存地址赋给指针。可以对变量名应用&运算符, 来获得被命名的内存的地址,new运算符返回未命名的内存的地址 */ double * pn; double * pa; char * pc; double bubble = 3.2; pn = &bubble; pc = new char; pa = new double[30];
-
对指针解除引用
对指针解除引用意味着获取指针指向的值。对指针应用截除或间接值运算符(*)来解除引用。因此,如果向上面的例子中那样,pn是指向bubble的指针,则*pn是指向的值,即3.2.
cout << *pn; *pc = 'S';
另一种对指针截除引用的方法是使用数组表示法,例如,pn[0]与*pn是一样的。绝不要对未被初始化为适当地址的指针解除引用。
-
区分指针和指针所指向的值
如果pt是指向int的指针,则*pt不是指向int的指针,而是完全等同于一个int类型的变量,pt才是指针。
int * pt = new int; *pt = 5;
-
数组名
在多数情况下,c++将数组名视为数组的第一个元素的地址。
int tacos[10];
一种情况例外,将sizeof运算符用于数组名用时,此时将返回整个数组的长度(单位为字节)
-
指针算术
C++允许将指针和整数相加。加1的结果等于原来地址值加上指向对象占用的总字节数。还可以将一个指针减去另一个指针,获得两个指针的差。后一种运算将得到一个整数,仅当两个指针指向一个数组(也可以指向超出结尾的一个位置)时,这种运算才有意义,这将得到两个元素的间隔。
int tacos[10] = {5,2,8,4,1,2,2,4,6,8}; int * pt = tacos; // 假设pt与数组tacos的地址为3000 pt = pt + 1; // 现在pt的地址为3004,int占4字节 int *pe = &tacos[9];// pe的地址为3036, pe = pe -1; // 现在pe的地址为3032,是tacos[8]的地址 int diff = pe - pt; // 距离为7,tacos[1]和tacos[8]之间的距离
-
数组的动态联编和静态联编
使用数组声明来创建数组是,将采用静态联编,即数组的程度在编译时设置;
int tacos[10];
使用new[]运算符创建数组时,将采用动态联编(动态数组),即将在运行时为数组分配空间,其长度也将在运行时设置。使用完这种数组后,应使用delete[]释放其占用的内存;
int size; cin >> size; int * pz = new int [size]; ... delete [] pz;
-
数组表示法和指针表示法
使用方括号数组表示法等同于对指针解除引用:
tacos[0] means *tacos
tacos[3] means *(tacos + 3)int * pt = new int[10]; // pt指向一个长度10的数组 *pt = 5; // 将数组第一个数赋为5 pt[0] = 6; // 重新赋值数组第一个数,将其赋为6 pt[9] = 44; // 将数组第九个数赋为44 int coats[10]; *(coats + 4) = 12; // 将数组第四个数赋为12