当我使用getEnglishWord(counterLine);
传递数组时,counterLine
是数组。但当它进入void getEnglishWord(int countLine[])
函数时,唯一传递的是countLine[0]
或数组first index
中的countLine[]
。
CODE
if (countWords == countWordsInput + 1)
{
fclose(fpB);
getEnglishWord(counterLine);
}
void getEnglishWord中的代码(int counterLine []):
int c;
int countLine = 0, countWords = 0, countLetters = 0;
char translatedWords[words][letters];
int indexCount = 0;
c = getc(fpE);
for (int y = 0; y < words; y++)
{
for (int x = 0; x < letters; x++)
translatedWords[y][x] = NULL;
}
while (c != EOF)
{
if (c == '\n')
{
if (countLine == counterLine[indexCount])
{
translatedWords[countWords][countLetters] = c;
countLetters++;
}
indexCount++;
countLine++;
}
c = getc(fpE);
}
fclose(fpE);
_getch();
答案 0 :(得分:2)
在C中,表达式类型&#34; N元素数组T
&#34;将被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向T
&#34;的指针,并且表达式的值将是第一个元素的地址。阵列。此规则的例外情况是,数组表达式是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字。
数组对象本身是不是指针;它们不会存储指针值。
所以,当你打电话
getEnglishWord(counterLine);
表达式(不是对象!)counterLine
是从类型&#34; N元素数组转换为int
&# 34; to&#34;指向int
&#34;的指针,表达式的值是counterLine
(&counterLine[0]
)的第一个元素的地址。
在函数原型
中void getEnglishWord(int counterLine[])
声明int counterLine[]
被视为已经写成int *counterLine
; IOW,counterLine
被声明为int
的指针,而不是int
的数组(对于函数参数声明,这只是 为真)。
所以你的所有函数都可以接收到指向数组第一个元素的指针。但是,您仍然可以在指针值上使用[]
下标运算符(实际上,它在指针操作方面已定义,但我们不需要获取现在进入那个)。您仍然可以从您的函数中访问counterLine
的所有元素,您只需要确保不要尝试访问counterLine
结尾之后的元素。将数组大小作为单独的参数传递给数组通常是一个好主意:
void getEnglishWord ( int *counterLine, size_t counterLineSize )
{
...
if ( i < counterLineSize )
do_something_with( counterLine[i] );
...
}
size_t numElements = ...; // see below
getEnglishWord( counterLine, numElements );
有几种方法可以确定数组的大小。您可以在数组本身上使用sizeof
运算符,给出数组中的总字节数,并将其除以单个数组元素中的字节数:
int counterLine[N];
size_t numElements = sizeof counterLine / sizeof counterLine[0];
这仅适用于数组表达式;你不能在指向数组第一个元素的指针上使用它。你只需要将指针的大小除以元素的大小,它就不会给你你想要的东西。
否则,只需通过N
:
getEnglishWord( counterLine, N );
答案 1 :(得分:1)
此代码正常运行:
void getEnglishWord ( int *counterLine, size_t counterLineSize )
{
...
if ( i < counterLineSize )
do_something_with( counterLine[i] );
...
}
size_t numElements = ...; // see below
getEnglishWord( counterLine, numElements );