C 从函数中获取数组的计数
我正在尝试编写一个函数来打印给定数组的元素。但是,我不明白如何计算传递到函数中的数组元素。代码如下: 在本例中,我试图从函数中获取计数,尽管这只返回1C 从函数中获取数组的计数,c,arrays,pointers,parameter-passing,sizeof,C,Arrays,Pointers,Parameter Passing,Sizeof,我正在尝试编写一个函数来打印给定数组的元素。但是,我不明白如何计算传递到函数中的数组元素。代码如下: 在本例中,我试图从函数中获取计数,尽管这只返回1 #include <stdio.h> void first_function(int ages[], char *names[]) { int i = 0; int count = sizeof(*ages) / sizeof(int); for(i = 0; i < count; i++) {
#include <stdio.h>
void first_function(int ages[], char *names[]) {
int i = 0;
int count = sizeof(*ages) / sizeof(int);
for(i = 0; i < count; i++) {
printf("%s has lived %d years.\n", names[i], ages[i]);
}
}
int main(int argc, char *argv[])
{
int ages[] = { 7, 32, 36 };
char *names[] = {
"Tiger", "Sandy",
"Ryan"
};
first_function(ages, names);
printf("---\n");
return 0;
}
#包括
void first_函数(int ages[],char*names[]){
int i=0;
int count=sizeof(*ages)/sizeof(int);
对于(i=0;i
在这个例子中,我给函数一个额外的参数(count),然后从main中获取count。这是正常的做法吗?不知怎么的,它看起来不干净
#include <stdio.h>
void first_function(int ages[], char *names[], int count) {
int i = 0;
for(i = 0; i < count; i++) {
printf("%s has lived %d years.\n", names[i], ages[i]);
}
}
int main(int argc, char *argv[])
{
int ages[] = { 7, 32, 36 };
char *names[] = {
"Tiger", "Sandy",
"Ryan"
};
int count = sizeof(ages) / sizeof(int);
first_function(ages, names, count);
printf("---\n");
return 0;
}
#包括
void first_函数(整数年龄[],字符*名称[],整数计数){
int i=0;
对于(i=0;i
是,您不能在此处使用sizeof
来获取被调用函数中数组的长度。因为数组在被调用函数中衰减为指针。这就是为什么它将返回指针的大小,而不是数组的大小
解决方案-您需要传递另一个参数来指定数组的大小,或者保留一个像NULL
这样的占位符或一些值来标记数组的结尾。(你在第二个解决方案中也遵循了这一点——这很好,而且很有效)
sizeof
的返回值为size\u t
。使用size\u t
而不是int
。
这是处理操作员返回的
大小的正确方法。您所谓的不干净方法是正常方法。(如果数组参数已衰减为指针类型,sizeof
习惯用法不起作用)。虽然考虑使用<代码> SsieZiT<<代码>类型进行计数,但不使用<代码> int <代码> > < /P>
另一种方法是使用一个特定的值来表示数组的结束。实际上,这就是字符串库函数在C中的工作方式;根据C标准(6.7.6.3函数声明器(包括原型))使用NUL信号发送字符串的结尾。
7应调整参数声明为“类型数组”
到“类型的限定指针”,其中类型限定符(如果有)
是在数组类型的[and]中指定的
派生
所以这个函数声明
void first_function(int ages[], char *names[]);
在调整像数组一样声明的相应参数后,等价于下面的声明
void first_function( int *ages, char **names );
也就是说,参数ages
和names
在函数中具有指针类型。
因此,这个表达式
int count = sizeof(*ages) / sizeof(int);
(我想你是说
int count = sizeof(ages) / sizeof(int);
^^^^
(尽管如此)
相当于
int count = sizeof( int) / sizeof(int);
int count = sizeof(int *) / sizeof(int);
因为子表达式*ages
的类型是int
如果你将表达式写成
int count = sizeof(ages) / sizeof(int);
那么它就相当于
int count = sizeof( int) / sizeof(int);
int count = sizeof(int *) / sizeof(int);
并且同样不会产生作为参数传递的数组的大小
对于没有sentinel值的数组,如果需要,还必须将其大小传递给函数
因此,函数应该声明为
void first_function(int ages[], char *names[], size_t n);
打电话给我
size_t count = sizeof(ages) / sizeof(*ages);
first_function(ages, names, count);
请注意,无需在函数中对变量i
进行两次初始化。该函数可以如下所示
void first_function(int ages[], char *names[], size_t count)
{
for ( size_t i = 0; i < count; i++)
{
printf("%s has lived %d years.\n", names[i], ages[i]);
}
}
void first_函数(整数年龄[],字符*名称[],大小计数)
{
对于(大小i=0;i
谢谢您的解释。不要解释为什么它看起来不干净,因为我实际上正在对数组做几乎相同的事情。@RyanMc:对于带引号的文本字符串(字符数组)'编译器将始终添加一个终止零(只有一个例外)–如果您预先说明需要多少个字符)。对于字符串数组,我使用终止的NULL
。整数数组中的终止值的问题是,您的“魔法”值可能实际上是有效的。在您的情况下,年龄为0
。。。但我注意到,由于您使用的是<代码>签名INT/COM>,一个“代码”>1 < /代码>的“AGE”将工作。OT:考虑使用<代码> Stutt将一个代码>结构> <代码>变量中的名称和年龄粘在一起。您可以让您的函数提供一个有意义的返回<代码>类型< /C> >返回代码>计数< /Cord>到调用函数,您还可以使用指针计数作为参数,并使指针的更改在调用者中可见。根据您的选择,可以执行一个或两个操作。数组位于主函数的堆栈框架中。当调用第一个函数时。您只传递位于主堆栈帧中的数组指针。所以first_fun frame不包含任何关于本地框架的信息任何关于数组大小的信息。。