【发布时间】:2015-07-05 08:42:32
【问题描述】:
我正在尝试编写一个简单的 c 程序来打印字符串数组中字符串的地址。这是程序:
#include <stdio.h>
int main(void)
{
char *words[] = {"hello", "cruel", "world"};
int count = sizeof(words) / sizeof(char*);
int i;
for(i = 0; i < count; i++){
printf("address: %p\n", (words+i));
printf("address: %p\n", &(words[i])); //<- why does this work?
printf("address: %p\n", words[i]); //<- not the same as first print?
printf("---\n");
}
return 0;
}
和输出:
address: 0x7fff043110f0
address: 0x7fff043110f0
address: 0x4006b4
---
address: 0x7fff043110f8
address: 0x7fff043110f8
address: 0x4006ba
---
address: 0x7fff04311100
address: 0x7fff04311100
address: 0x4006c0
---
现在我是这样理解的:words 是一个指向指针的指针,指向这个数组数组的首地址。
那么words[i]是一个指向字符数组的指针,words[0]指向“hello”的首地址,words[1]指向“cruel”的首地址。
现在我正在尝试以不同的方式打印出字符串的地址。
第一种方法是有意义的:(指向words 的指针增加一个指针的大小,然后我打印出来,将其格式化为指针)
在第二个中,我认为应该发生的事情:words[i] 返回一个指向索引字的指针,并在其上使用& 运算符返回地址。但我不清楚%p 是如何用于第一个打印语句中的指针类型和第二个语句中的地址类型的。
如果第三个打印语句给出了第二个打印语句的输出,对我来说有意义的是。 ((words+i)和words[i]在指针上下文中是一样的吗?)
请有人帮我解决这个问题。谢谢
【问题讨论】:
-
“但我不清楚 %p 如何用于第一个打印语句中的指针类型和第二个语句中的地址类型。” - 您认为“地址类型”是什么,特别是,您认为它与指针类型有何不同?
-
首先将
sizeof(char)修改为sizeof(char*)- 你的第一个问题真的应该是“为什么我得到的地址超过三组?” -
@user2357112 指针是一个具有体系结构特定格式的变量,用于保存有关地址的信息?显然
ptr和&ptr在内存中不能相同。但我希望有人能写一个简单的解释而不是问更多问题 -
@jhabbott 是的,对不起。我之所以忽略这一点是因为我创建了一个“虚拟程序”来说明我的观点,但我心不在焉,完全忽略了我打印出太多东西的事实。它仍然没有解决我的问题
-
words[i]等价于*(words+i),而不是(words+i)