为什么sizeof(argv)/ sizeof(argv [0])给出了C中数组的大小?
如果我在main中有一个数组作为参数
int main(int argc,char* argv[]) 为什么会 sizeof(argv)/sizeof(argv[0]) 总能可靠地给我阵列的长度? 解决方法
它没有.
在写这个答案时,我可能会有点失望;对于一个相当简单的问题,语言 – 律师方法太过分了.我将添加这个快速摘要,足以回答这个问题.答案的迂腐和过于冗长的版本低于水平线. 鉴于: int main(int argc,char* argv[]) argv根本不是一个数组;它是一个指针. (C和C不允许数组类型的参数;看起来像数组参数的东西实际上是指针参数.)argv确实指向(在运行时)数组的第一个元素,但声明中没有信息这个数组有多大.这就是我们需要argc参数来提供该信息的原因. 因此sizeof(argv)/ sizeof(argv [0])不会给出数组中元素的数量;它只是将指针的大小除以指针的大小,这可能会给你1.(为什么只有“可能”?这是下面过于迂腐的答案的一部分.) 现在,如果您将某些内容显式定义为数组对象: int an_array[42]; 你可以用这个成语来计算数组中元素的数量: sizeof an_array / sizeof an_array[0] 这产生42,即阵列中元素的数量.它的工作方式(我认为)非常简单:它是整个数组的字节大小除以其中一个元素的字节大小. 但它只适用于实际的数组,而不是类似argv的东西,它看起来像一个数组,但实际上是一个指针. 数组和指针之间的关系可能令人困惑. comp.lang.c FAQ的第6节解释得非常好,大部分或全部都适用于C和C. 现在是冗长的迂腐解释,有太多的离题: argv是一个指针,特别是指向char的指针.作为参数声明(仅在该上下文中),char * argv []等同于char ** argv. sizeof(argv)是char **指针中的字节数. sizeof(argv [0])是char *指针中的字节数. sizeof(argv)/ sizeof(argv [0])很可能是1(假设char *和char **具有相同的大小,它们在大多数实现中都是这样做的). 现在对于被定义为数组对象的东西: some_type an_array[COUNT]; 表达确实有效;这个: sizeof an_array / sizeof an_array[0] 确实为你提供了an_array中元素的数量,即COUNT.我认为,原因应该是相当明显的.数组中的字节数是数组的一个元素中的字节数乘以元素数.所以: sizeof an_array == sizeof an_array[0] * COUNT 并重新安排条款: sizeof an_array / sizeof an_array[0] == COUNT 顺便说一句,sizeof an_array [0]也可以写成sizeof * an_array,因为索引运算符在C中定义的方式. (请注意,如果该参数是一个表达式,如对象名,则sizeof运算符不需要括号括起来.如果sizeof的操作数是表达式或带括号的类型名称.但是如果您更喜欢始终使用括号sizeof,你可以这样做.) 这是计算数组中元素数量的常用习惯用法 – 但只有当您拥有数组本身的名称而不是指向其第一个元素的指针时,它才有效. [以下内容适用于C.我相信它也适用于C(我最初没有注意到问题标记为C,而不是C).] 在回答注释中提出的问题时,不,char *和char **不需要具有相同的大小. C标准对指针表示的要求是:
参考:N1570,6.2.5p28. C标准至少有一部分内容; N3485草案第3.9.2节[basic.compound]说:
我没有找到我从C标准中引用的其余部分的相应文本. 在字寻址机器上,char *指针可能需要更多信息来指定该字内的字和字节,而不是char **指针所需要的,只需要指定一个对齐的字. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |