#include <stdio.h>
void f(char**);
int main() {
char *argv[] = { "ab", "cd", "ef", "gh", "ij", "kl" };
f(argv);
return 0;
}
void f(char **p) {
char *t;
t = (p += sizeof(int))[-1];
printf("%s\n", t);
}
这是我的代码,问题是要求输出。我想知道为什么输出是gh。我假设sizeof(int)将等于char中的元素数量,这将使得它在“t”语句中为6然后减去1。然后我打印了sizeof(int),它给了我4.我很困惑为什么sizeof(int)是4而不是6。 提前谢谢。
答案 0 :(得分:1)
p
的解释:
sizeof(int)
这是一个指针,由sizeof(int)
元素递增。在您的计算机上,4
似乎是p
。"ij"
是指向第五个元素的指针,即[-1]
。p
将t
分配给p
一个元素。 {1}递减1表示您指向"gh"
的指针。哦,由于方括号,这里有一个解除引用操作。t
。为了说明第三点,您可以使用以下行替换f
并检查:
void f(char **p) {
char **t;
t = (p += sizeof(int)) - 1;
printf("%s\n", *t);
}
HTH。
答案 1 :(得分:0)
我很困惑为什么sizeof(int)是4而不是6
其他人已经给了你正确的答案,所以我只是想帮助你弥补你对sizeof(int)
的假设的差距。
sizeof 是C运算符(不是函数)。如果您有可用的Linux或Mac,终端中的 man operator 将显示整个列表。它产生操作数的大小,以字节为单位。与大多数运算符不同,sizeof在变量或类型上运行。当您说sizeof(int)
时,您将sizeof应用于数据类型int
。不出所料,结果始终相同,因为在C中,程序中的每个int
都具有相同的大小。在您的机器上,该大小为4.
更进一步,您可以看到将变量的名称赋予sizeof只是一种便利。编译器解析名称,找到其类型,并获取该类型的大小。
char * argv []
我们可以有效地将sizeof应用于argv
,以了解数组中有多少元素。整个数组的大小(以字节为单位)为sizeof(argv)
。每个元素 - 因为数组中的所有元素具有相同的大小 - 具有sizeof(argv[0])
的大小(以字节为单位)。那么元素的数量是sizeof(argv) / sizeof(argv[0])
。你甚至可以说,
enum { nargv = sizeof(argv) / sizeof(argv[0]) };
因为所有信息都在编译时可用。