【发布时间】:2015-05-12 06:36:23
【问题描述】:
我写了一个小程序来让自己更熟悉指针和它们之间的关系。为了做到这一点,我编写了一小段代码,它只声明和初始化一个整数a,然后声明一个指向a 地址的指针*p,然后更深入地分配一个指向指针@ 的指针987654324@ 等等,一直到****pppp。如果我正确理解了指针,那么一个指向...的指针的指针基本上是这样工作的:
Address of pointer (or integer) itself: 0x7fff08d1c658 0x7fff08d1c660 0x7fff08d1c668 0x7fff08d1c670 0x7fff08d1c67c
↑ ↑ ↑ ↑ ↑
pppp --> ppp --> pp --> p --> a = 42
↓ ↓ ↓ ↓
Address pointer points to: 0x7fff08d1c660 0x7fff08d1c668 0x7fff08d1c670 0x7fff08d1c67c
对角线上的地址必须相同,因为前一个指针总是指向它所分配的下一个指针的地址。现在我想在使用printf()调用的程序中检查这一点,在这里我不确定我打印地址的方式是否更精细的指针**pp、***ppp和****pppp指向以及我如何打印地址这些指针本身是正确的。有人可以指出可能的错误吗?以下是代码及其输出:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
int *p;
int **pp;
int ***ppp;
int ****pppp;
a = 42;
/* Take the address of a */
p = &a;
/* Take the address of p */
pp = &p;
/* Take the address of pp */
ppp = &pp;
/* Take the address of ppp */
pppp = &ppp;
printf("Address of int &a: %p\n", &a);
printf("value of a: %d\n\n", a);
printf("Address where p points to via (void *)p: %p\n", (void *)p);
printf("Value that *p points to via *p: %d\n", *p);
printf("Address of *p itself via (void *)&p: %p\n\n", (void *)&p);
printf("Address where pp points to via (void *)pp: %p\n", (void *)pp);
printf("Value that **pp points to via **pp: %d\n", **pp);
printf("Address of **pp itself via (void *)&pp: %p\n\n", (void *)&pp);
printf("Address where ppp points to via (void *)ppp: %p\n", (void *)ppp);
printf("Value that ***ppp points to via ***ppp: %d\n", ***ppp);
printf("Address of ***ppp itself via (void *)&ppp: %p\n\n", (void *)&ppp);
printf("Address where pppp points to via (void *)pppp: %p\n", (void *)pppp);
printf("Value that ****pppp points to via ****pppp: %d\n", ****pppp);
printf("Address of ****pppp itself via (void *)&pppp: %p\n", (void *)&pppp);
return EXIT_SUCCESS;
}
输出:
Address of int &a: 0x7fff08d1c67c
value of a: 42
Address where p points to via (void *)p: 0x7fff08d1c67c
Value that *p points to via *p: 42
Address of *p itself via (void *)&p: 0x7fff08d1c670
Address where pp points to via (void *)pp: 0x7fff08d1c670
Value that **pp points to via **pp: 42
Address of **pp itself via (void *)&pp: 0x7fff08d1c668
Address where ppp points to via (void *)ppp: 0x7fff08d1c668
Value that ***ppp points to via ***ppp: 42
Address of ***ppp itself via (void *)&ppp: 0x7fff08d1c660
Address where pppp points to via (void *)pppp: 0x7fff08d1c660
Value that ****pppp points to via ****pppp: 42
Address of ****pppp itself via (void *)&pppp: 0x7fff08d1c658
【问题讨论】:
-
我不明白你在问什么。您的代码没有任何问题。
-
在不同的stackoverflow答案和互联网上提到了不同的方法来打印指针的地址本身,我真的不确定我如何打印它们的逻辑是否正确。
-
您的程序对我来说看起来不错。请记住,当您需要打印指针(地址)时,请使用
%p。 -
您需要使用
%p打印出指针,并且参数应该是(void *)类型。这是唯一的变化 -
但是无论级别有多深,只需通过
(void *)后跟指针简单地投射指针就足够了?这意味着如果我有一个指针*****ppppp并想打印它的地址,我会使用printf("%p", (void *)ppppp);。