先上代码:
int main()
{
int a = 10;
int b = 20;
int c = 30;
int *p1;
int* p2;
int *p3 = &c;
p1 = &a;
p2 = &b;
cout << "a的地址是:" << &a << endl;
cout << "b的地址是:" << &b << endl;
cout << "指针变量p1所指向的地址是:" << p1 << endl;
cout << "指针变量p2所指向的地址是:" << p2 << endl;
cout << "指针变量p1本身的地址是:" << &p1 << endl;
cout << "指针变量p2本身的地址是:" << &p2 << endl;
cout << "指针变量p3指向的地址的变量的值:" << *p3 << endl;//p3指向整型变量c
system("pause");
return 0;
}
结果:
为了便于理解,我们这样区分:
指针:是其他普通变量在内存中的首地址。
&a就是得到a的地址,其实“指针==地址”
指针变量:存放其他变量地址的那个变量。比如上面代码中的p1、p2
就是指针变量。
所以:
指针是个首地址,是个整数,是个常量;指针变量是个变量。
注意在定义时使用的*
只是用来说明该变量为指针变量,无其他作用,这里要与间接寻址运算符 *
要区分开来,寻址运算符 *
加在指针变量前面,返回指针变量所指向的地址的变量的值。如*p3
由此我们可以:
1、便于理解双指针, 明白指针(变量)本身亦有其地址
2、明白空指针即是被赋值为0的指针(变量)
3、声明一个指针指向开辟的空间即是,创建一个指针变量,开辟一块空间并将其首地址赋值给指针变量
tips:
1、很多时候,对指针变量和指针并不做区分,因为大多数说的都是指针变量,往往省略”变量“二字,直接叫指针,注意不要混淆。
2、定义指针变量时,*运算符两边的空格是可选的。
Int* p;// 强调int*是一种类型
Int *p;// 强调*p是int型的值
这两种写法均可,对于编译器来说没有任何区别
参考:
C++中指针和指针变量