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