& p和p之间有什么区别?

时间:2016-05-21 18:29:44

标签: c address-operator

如果我有一个指向整数的指针,例如:

int num = 12;
int *p = #

然后打印地址

printf("%p\n", (void*)p);

之前和之间有什么区别:

printf("%p\n", (void*)&p);

7 个答案:

答案 0 :(得分:3)

此处,p包含num的地址,因此第一个printf输出num的地址。

另一方面,&pp的地址,因此第二个printf会打印p的地址。

答案 1 :(得分:2)

使用"%p"格式时,仅使用普通p将打印变量p的内容,即指针变量p指向的地址。 / p>

当您使用&p时,您将获得变量p的地址,即指向p的指针(在您的类型为int **的情况下)并打印该指针。

你可以这样看:

+----+    +---+    +-----+
| &p | -> | p | -> | num |
+----+    +---+    +-----+

换句话说,&p指向p,指向num

如果您继续并尝试使用*p,那么您将无法按预期工作。它将取消引用指针p,即它将导致该位置的值p是指针(变量num及其值,在此特定情况下)。 *pint类型的值,并且尝试使用格式"%p"进行打印会导致未定义的行为,因为*p不是指针但是值,"%p"格式需要指针。

很可能没有什么不好的事情发生,并且在指针大小与int(大多数是32位系统)的大小相同的系统上,语句

printf("%p", (void *) *p);

只会打印c,这是十六进制值12,这是num的值。

但是,如果指针的大小int的大小相同,就像在典型的64位系统上一样,则输出将不会是可预测的,并且看起来大部分都是随意的。

答案 2 :(得分:2)

举个例子 -

int num = 12;
int *p = #                     // store address of num in pointer p
printf("%p\n", (void*)p);          // line 1
printf("%p\n", (void*)&p);         // line 2

第1行 - 在此将打印存储在指针num中的变量p的地址。因此,存储在指针p中的值是整数变量num的地址。

第2行 - 在指针p的这个地址中将打印出来。请注意使用地址运算符。它给出了指针p的地址。

答案 3 :(得分:1)

(void*)&p表示p。

地址

(void*)p表示p的内容(在这种情况下为num地址)。

(void*)*p表示变量p指向的{strong>内容(12)(num })。

有关地址运算符的详细信息,请参阅http://www.c4learn.com/c-programming/c-pointer-address-operator/

答案 4 :(得分:1)

前者打印num的地址。 后者打印指针p的地址。 因为,一切都需要存储在内存中的位置。

如果取整数, 它具有存储的物理地址和存储在该位置的数据(整数)。

如果你拿指针, 它还有一个存储在内存中的物理地址,但这里的数据变成另一个地址,它是某个整数变量的地址。

&安培;被称为运营商的地址。它返回存储特定变量的内存地址。 按照相同的例子,

  

printf(“%p \ n”,(void *)p);

打印指针p指向的数据。即,num的地址。

使用

可以获得类似的结果
  

printf(“%p \ n”,(void *)& num);

因此,两者都会产生相同的结果。

然而,

  

printf(“%p \ n”,(void *)& p);

打印指针p的地址。

答案 5 :(得分:1)

;

打印printf("%p\n", (void*)p); 包含的值,即p的地址。

num

打印指针printf("%p\n", (void*)&p); 本身的地址。

答案 6 :(得分:0)

有两种类型的参数可以在c / c ++函数中传递。

第一个是按值调用,它调用类似于(void)p的程序,它复制相同的值,并且该特定void函数中的值不会改变。

第二个是通过引用调用,它实际进入内存并找出该特定位置/地址并在那里更改其值。在你的情况下(无效)& p