计算机程序存储数据时必须跟踪三种基本属性,既:
- 信息存在何处
- 存储的值
- 存储的信息是什么类型
当我们定义一个变量时,程序会根据变量的类型找个长度合适的地址块,将该地址块命名为变量名/标识符,同时将初始化的值存入该地址块下。(找一块空间,将其命名,存储数据,命名只是为了方便写代码,实际上汇编后变量名并不存在,但人类写代码总不能用地址,效率低繁琐且难以记忆。)
string wharf = "fries";
cout << "wharf的数据:" << wharf << endl;
cout << "wharf的地址:" << &wharf << endl;
string *pointer = &wharf;
cout << "pointer存储的数据(也就是wharf的地址): " << pointer << endl;
cout << "pointer存储数据的地址(也就是存储wharf地址的地址): " << &pointer << endl;
cout << "pointer存储的数据的数据(也就是wharf地址的数据):" << *pointer << endl;
cout << "pointer存储的数据的数据的地址(也就是wharf地址的数据的地址,是的又绕回来了):" << &*pointer << endl;
运行结果:
wharf的数据:fries
wharf的地址:0x61fde0
pointer存储的数据(也就是wharf的地址): 0x61fde0
pointer存储数据的地址(也就是存储wharf地址的地址): 0x61fdd8
pointer存储的数据的数据(也就是wharf地址的数据):fries
pointer存储的数据的数据的地址(也就是wharf地址的数据的地址,是的又绕回来了):0x61fde0
对变量使用地址运算符&才能得到地址0x61fde0(address)。
文字说明有点绕,咱直接上图 (我真是个天才)。
- wharf(码头):打印wharf,本质上就是打印地址0x61fde0中的数据fires,输出结果为fires。
- &wharf:不取数据,直接打印地址,输出结果为0x61fde0
- string * pointer = &wharf:将wharf地址存进名为pointer、地址为0x61fdd8的内存块中(此时pointer的作用类似于给你指引个方向,告诉你想要的东西在哪,这里是没有实物的)(①这里的*星号告诉程序pointer是个指针类型)。
- pointer:看看指针里存的是什么,里面存了一串地址。
- &pointer:这个存放地址0x61de0的内存块地址是0x61fdd8。
- *pointer(②这里的* 名为解除引用(dereferenceing)运算符,与定义时的*并不是一个意思):我们沿着pointer给出的码头地址,去那边一探究竟,原来码头有薯条。
- &*pointer:废物操作,解引用得到内容,再根据内容找存放内容的地址🤔 (&*pointer = pointer)
总结:
- 指针不过是一种命名,本质上也是存储数据的一块内存,只不过存的东西比较特殊,是其他内存块的地址。
- * 符号有两种用途,①定义指针变量,②作为解除引用运算符使用