我试图通过为自己阐明指针指向的地址,指针本身的地址和地址引用的值来理解简单指针。所以我写了一小段代码:(请不要纠正我,如果我在这里犯任何错误)声明指向指向指针的指针
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
int *p;
int **pp;
a = 42;
/* Take the address of a */
p = &a;
/* Take the address of p */
pp = &p;
printf("Address of int &a: %p\n\n", &a);
printf("value of a: %d\n\n", a);
printf("Address where *p points to via (void *)p: %p\n\n", (void *)p);
printf("Value that *p points to via *p: %d\n\n", *p);
printf("Address of *p itself via (void *)&p: %p\n\n", (void *)&p);
printf("Address where **p points to via (void *)pp: %p\n\n", (void *)pp);
printf("Value that **pp points to via **pp: %d\n\n", **pp);
printf("Address of **p itself via (void *)&pp: %p\n\n", (void *)&pp);
return EXIT_SUCCESS;
}
这如预期的所有作品。现在,我想深入一层,并使用指向指针***ppp
的指针的指针,并为其指定地址,指向指针pp
的指针指向的地址为*p
指向的地址为a
。这是我以为我可以做到这一点:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
int *p;
int **pp;
int **ppp;
a = 42;
/* Take the address of a */
p = &a;
/* Take the address of p */
pp = &p;
ppp = &pp;
printf("Address of int &a: %p\n\n", &a);
printf("value of a: %d\n\n", a);
printf("Address where *p points to via (void *)p: %p\n\n", (void *)p);
printf("Value that *p points to via *p: %d\n\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\n", (void *)pp);
printf("Value that **pp points to via **pp: %d\n\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\n", (void *)ppp);
printf("Value that ***ppp points to via ***ppp: %d\n\n", ***ppp);
printf("Address where ***ppp points to via (void *)&ppp: %p\n\n", (void *)&ppp);
return EXIT_SUCCESS;
}
但是,这给了我一个不兼容的指针警告。有人可以向我解释为什么这不起作用,如果拨打printf()
是正确的?
你得到的确切警告是什么,它是什么线? – interjay
'int ** ppp;'应该是'int *** ppp;'。另外,'(void **)* ppp'不正确。它应该是'(void *)* ppp'。 –
Da ** it。我应该留下以备日后参考或删除问题吗? –