地址和数据:内存相当于是一个个的小盒子,每个盒子对应一个编号,这个编号就是地址,盒子里存放的就是数据,指针和地址是一个概念。
& 是取址运算符,如有 int a; 即有一个小盒子里面存放的数据起名叫a,&a就是取a的地址,即该盒子的编号。
* (地址)是取值运算符,是解引用操作符,可以理解成打开对应地址编号的盒子,取出里面的数据。*(&a) 就是打开a对应的小盒子,取出里面的数据,即 * (&a)和a等价。
我们定义一个指针变量int *p; p是指针变量,专门用来存放地址。
int *p=&a;相当于int *p; p=&a;
#include <iostream>
using namespace std;
int main()
{
int a = 8;
int* b = &a;
int** c = &b;
cout << "a的值:" <<"\t" << "\t" << a << endl;
cout << "&a的值:" << "\t" << &a << endl;
//cout << "输出内容*a的值" << "\t" <<*a << endl; //输出错误,*后边必须带指针,做解引用的操作
cout << "b的值:" << "\t" << "\t" << b << endl;
cout << "*b的值:" << "\t" << *b << endl;
cout << "&b的值:" << "\t" << &b << endl;
cout << "c的值" << "\t" << "\t" << c << endl;
cout << "*c的值" << "\t" << "\t" << *c << endl;
cout << "**c的值" << "\t" << "\t" << **c << endl;
cout << "&c的值" << "\t" << "\t" << &c << endl;
return 0;
}
输出结果:
则:b = &a ,*b = a
p存放的是a的地址,*p也等价于 a。指针变量p既然是变量,也同变量a一样对应一个小盒子,也有一个地址编号,&p就是取指针p的地址。
*p和**p的区别:
int *p :一级指针,表示p所指向的地址里面存放的是一个int类型的值
int **p :二级指针,表示p所指向的地址里面存放的是一个指向int类型的指针(即p指向的地址里面存放的是一个指向int的一级指针)
回过来看标题问题:*&p和&*p
根据运算优先级,
*&p 等价于 *(&p)。
&*p 等价于&(*p)。
1、如果p是int *指针变量,那么
*&p = p,&*p = p,都是p,但还没定义p指向哪,存的是谁的地址。
2、如果p是一个int变量,
那么*&p = p;而&p是非法的,因为p非法。
比如int p =10;那么*&p = *(&p) = p = 10(即从p的地址取值),而&*p = &(*p) 则非法,因为p=10,*10是取内存地址为10的值,这在c语言中是不合法的。
#include <iostream>
using namespace std;
int main()
{
int a = 8;
int* b = &a;
int** c = &b;
cout << "a的值:" <<"\t" << "\t" << a << endl;
cout << "&a的值:" << "\t" << &a << endl;
//cout << "输出内容*a的值" << "\t" <<*a << endl; //输出错误,*后边必须带指针,做解引用的操作
cout << "b的值:" << "\t" << "\t" << b << endl;
cout << "*b的值:" << "\t" << *b << endl;
cout << "&b的值:" << "\t" << &b << endl;
cout << "c的值" << "\t" << "\t" << c << endl;
cout << "*c的值" << "\t" << "\t" << *c << endl;
cout << "**c的值" << "\t" << "\t" << **c << endl;
cout << "&c的值" << "\t" << "\t" << &c << endl;
cout << "&*b的值" << &*b << endl;
cout <<"*&b的值"<< *&b <<endl
return 0;
}