&和*在c/c++里用法较多,用在不同的地方,意思不同。
* 用于语句里的指针变量时,表示指针指向的值。例如:printf("%d", *p);
&用于语句里的普通变量时,表示求普通变量的地址。例如:int a; p=&a;
“&*p等于*&p“ -- 是用于指针变量。例如:
声明:int a=1; int *p=&a;
语句:printf("%x %x ", &*p, *&p);
这里 &*p 和 *&p 都等于 p, 也就是 p 指向的 变量的地址,这里 正好 都等于 变量 a 的 地址。
------------------
来段程序:
#include
#include
main()
{
int a=2,b=3;
int *p; // 声明了,但没有初始化
printf("%x\n",*p); // 没有初始化就使用,有警告性错误, 没关系,继续跑。
printf("a: %p\n", &a); // 打印 a 地址
printf("b: %p\n", &b); // 打印 b 地址
printf("p: %p\n", &*p);
printf("p: %p\n", *&p);
p = &a; // p 指向 a
printf("%x\n",*p); // p 指向的值
printf("a: %p\n", &a);
printf("b: %p\n", &b);
printf("p: %p\n", &*p); // 注意地址 等于 a 的地址
printf("p: %p\n", *&p); // 注意地址 等于 a 的地址
p=&b; // p 指向 b
printf("%x\n",*p);
printf("a: %p\n", &a);
printf("b: %p\n", &b);
printf("p: %p\n", &*p); // 注意地址 等于 b 的地址
printf("p: %p\n", *&p); // 注意地址 等于 b 的地址
}
===
可见 “&*p等于*&p“ 等于 p。我们可以把 &*, *& 理解成 是合在一起的 1 个符号。
都 表示 指针指向的当前 地址。
你硬要分开理解就是:
*p 是指针指向的值,&*p 是指针指向的值的地址,也就是 指针指向的当前 地址。马马虎虎可以理解。
&p 是指针自己的地址,*& 难以理解了。
int a,*p;
p=&a;
/*则p=&a,,*p=a
&*p即&a,,表示a的地址
*&p即*(&p),,*指向(p的地址)就等于p的值,,p=&a,,也表示a的地址*/
printf("a的地址为:%u\n",&a)//输出a的地址,,一个随机生成的地址
printf("*&p的地址为:%u\n",*&p);//输出的值与a的地址一样
printf("&*p的地址为:%u\n",&*p);//输出的值与a的地址一样
假如p是一个变量,*p是以p为地址的内存所存储的值,&(*p)就是那个值所在的内存对应的地址,还是p对吧!
&p就是p变量的值所在的内存的地址(p的地址),*(&p)就是p的地址对应的内存所存储的值,也是p对吧!
指针间接运算符只能用于指针或者地址。
*p 就表明了 p 是一个指针变量,且这个操作 *p 就代表 p所指的对象。
p 是一个指针变量的话(上面已说过), &p 是获得指针变量的地址, * &p就是指针变量本身了。
何来的相等?
你是做啥题目(#‵′)凸?
“指针变量的值”就是“这个指针所指向对象的地址”,仅此而已……