定义和赋值
int i = 0;
int *pi = &i;
char c = 'a';
char *pc = &c;
int j = 1;
// 将pi重新指向j
pi = &j;
&
取地址运算符的操作数必须是左值,因为只有左值才表示一个内存单元,才会有地址,运算结果是指针类型(因为只有指针类型能存储地址)。- 注意
pi
和pc
虽然是不同类型的指针变量,但它们的内存单元都占4个字节,因为要保存32位的虚拟地址(不是物理地址,常见的物理地址范围为几个GB,实际访问物理地址是操作系统通过内存映射实现的),同理,在64位平台上指针变量都占8个字节。
// 定义多个指针变量,每个都要有*号
int *p, *q;
// *号和类型关键字之间可以省略空格,但更容易看错
int*a,*b;
// **注意!**这样定义了一个指针变量和int变量,而不是2个指针变量,所以建议不要省略空格,也不要遗漏*号
int*c,d;
*
解引用(Dereference)/间接引用(Indirection)操作符
int i = 0;
int *pi = &i;
*pi = *pi + 10;
将(指针pi
所指向的)变量i
的值增加10
->
和.
操作符
class Shader
{
public:
unsigned int ID;
void use(){}
}
Shader* shader = new Shader();
(*shader).ID = 1;
(*shader).use();
// 以下写法效果一致
shader->ID = 2;
shader->use();
delete shader;