好的,假设下面是执行时内存的样子
int s[]={1,2};
int *b=s;
s[]
+-----+-----+
| 1 | 2 |
+-----+-----+
100 104
^
|
| int *b = &s
+-----+
| 100 |
+-----+
200
s
是一个数组。这意味着,它是与变量关联的连续内存位置s
通过偏移数组变量名来访问每个元素。
所以当你使用s
它实际上归结为数组的地址(即100
在这种情况下)。当你这样做时*s
,归结为*(s+0)
这相当于s[0]
and so *s
表示存储在第零个位置的内容(在本例中s[0]
is 1
)。什么时候做&s
,这将打印地址s (which is
在本例中为 100`)。
请注意,这里s
and &s
代表一个地址;*s
and s[x]
代表一个整数。
这同样适用于指针。所以,b
打印它的内容,即地址s
(这是100
在这种情况下)。&b
打印地址b
,即200
在这种情况下。和,*b
打印数组第一个元素的内容s
这是1
.
我已经修改了你的程序以使其打印地址。
#include <stdio.h>
int main(void)
{
int s[]={1,2};
int *b=s;
printf("%p, %p, %d\n", (void *)s, (void *)&s, *s);
printf("%p, %p, %d\n", (void *)b, (void *)&b, *b);
return 0;
}
Output:
0xbfc4f3e4, 0xbfc4f3e4, 1
0xbfc4f3e4, 0xbfc4f3ec, 1
EDIT: %p
期望void *
。加了一样!