【发布时间】:2022-08-18 00:42:55
【问题描述】:
我正在比较各种printf,以更好地了解int * 和int (*)[] 之间的区别以及我如何可视化各种地址和值。
在下面的程序中,我写了一件让我烦恼的事情:
#include <stdio.h>
int main() {
int a[3] = {1,2,3};
int *p = a;
printf(\"address of a: %p\\n\", &a);
printf(\"\\naddress of a[0]: %p\\n\", &a[0]);
printf(\"\\nvalue of p: %p\\n\", p);
printf(\"\\nvalue of *p: %d\\n\", *p);
printf(\"\\nvalue of a[1]: %d\\n\", *(p + 1));
puts(\"\\n\\n-------------------\\n\\n\");
int b[3] = {1,2,3};
int (*q)[3] = &b;
printf(\"address of b: %p\\n\", &b);
printf(\"\\naddress of b[0]: %p\\n\", &b[0]);
printf(\"\\nvalue of q: %p\\n\", q);
printf(\"\\nvalue of *q: %p\\n\", *q);
}
在第一部分中,p 作为一个指针,将a[0] 的地址保存为值,因此*p 保存为值1(用 %d 打印)。
不过,在第二部分中,q 似乎拥有与*q 相同的值(在这种情况下我使用 %p),因此我需要使用**q 来打印b[0]。
怎么来的?
-
数组和它的第一个元素的地址相同,但对应的指针类型不同。
-
\"so *p 作为值 1\"... 不,
*p指向值(恰好是 1)...p是一个变量,其数据类型为pointer to int意味着p可以保存一个内存地址(指向),在这种情况下,一个int...我希望这会有所帮助... -
作为奖励,与
p + 1相比,您还可以观察q + 1(不是*(q + 1),请注意)的值。请注意,在使用%p时,您应该转换为void *。 -
int *p = a;与int *p = &a[ 0 ];完全相同(简写)也许看到这一点会更加明显,p被分配了a[ ]的第一个元素的地址... -
@Lundin 是的,你是对的。谢谢你的纠正