如果我有一个指向整数的指针,例如:
int num = 12;
int *p = #
然后打印地址
printf("%p\n", (void*)p);
之前和之间有什么区别:
printf("%p\n", (void*)&p);
答案 0 :(得分:3)
此处,p
包含num
的地址,因此第一个printf
输出num
的地址。
另一方面,&p
是p
的地址,因此第二个printf
会打印p
的地址。
答案 1 :(得分:2)
使用"%p"
格式时,仅使用普通p
将打印变量p
的内容,即指针变量p
指向的地址。 / p>
当您使用&p
时,您将获得变量p
的地址,即指向p
的指针(在您的类型为int **
的情况下)并打印该指针。
你可以这样看:
+----+ +---+ +-----+ | &p | -> | p | -> | num | +----+ +---+ +-----+
换句话说,&p
指向p
,指向num
。
如果您继续并尝试使用*p
,那么您将无法按预期工作。它将取消引用指针p
,即它将导致该位置的值p
是指针(变量num
及其值,在此特定情况下)。 *p
是int
类型的值,并且尝试使用格式"%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