* 声明指针或者取指针值
& 取变量地址
或者连在类型标识符后表示引用
指针存放的是地址,所以指针只能赋值变量的地址

定义指针的位置是随意的。比如`int p=&a; int p=&a; int p=&a;`都是可以的

指针不赋值也有随机的一个值和地址(有待考证)

  1. int *a; //定义定义指针a
  2. int b=100;
  3. a=&b; //指针a=b的地址 &取地址
  4. cout<<a<<endl<<&b<<endl;
  5. cout<<*a<<endl<<b<<endl; // *取指针值
  6. //结果是a=&b,*a=b;
  7. *a=10;
  8. cout<<b;
  9. //结果b=10

修改*a即修改内存地址a里面存放的值,而b的值也存在内存地址a,所以b的值也会变

指针也可以声明数据类型,但是
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

指向指针的指针

指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。
当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。
声明语法如下,比如
int **var;
同样的访问指向指针的指针的值也需要使用**进行取值

有一个需要注意的地方,虽然指针存放的是地址,所以指针可以直接赋值为另一个指针。但是指向指针的指针初始化为另一个指针的地址还是要使用取地址符&;
比如**int **p1=&p2;**p2也是一个指针
前者一个指针直接=另一个指针,是一个内存同一个地址的2个名字。
而指向指针的指针是不同地址,但是存放的数据最终指向的是相同的数据
再简单点是前者是地址相同,存放内容自然也相同。后者是地址不同,但是*指针存放的数据还是是指针的数据

  1. #include <iostream>
  2. using namespace std;
  3. int main ()
  4. {
  5. int var;
  6. int *ptr;
  7. int **pptr;
  8. var = 3000;
  9. // 获取 var 的地址
  10. ptr = &var;
  11. // 使用运算符 & 获取 ptr 的地址
  12. pptr = &ptr;
  13. // 使用 pptr 获取值
  14. cout << "Value of var :" << var << endl;
  15. cout << "Value available at *ptr :" << *ptr << endl;
  16. cout << "Value available at **pptr :" << **pptr << endl;
  17. return 0;
  18. }
  19. 当上面的代码被编译和执行时,它会产生下列结果:
  20. Value of var = 3000
  21. Value available at *ptr = 3000
  22. Value available at **pptr = 3000

指向成员函数的指针

class A {
void speak(char *, const char *);
};
void main() {
A a;
void (A::*pmf)(char *, const char *);//指针的声明
pmf = &A::speak; //指针的赋值 注意赋成员函数地址值时也要指明类,也是使用::
指向成员函数的指针与指向函数的指针差不多,只不过多了个类的限定A::
注意此时指针指向成员函数,成员函数不需要()