为什么我只能传递我的数组的第一个索引?

时间:2015-09-22 17:45:35

标签: c

当我使用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();

2 个答案:

答案 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 );