Sizeof () в массиве C ++ работает в одной функции, но не в другой - PullRequest
2 голосов
/ 12 июля 2011

Я пытаюсь узнать больше о массивах, так как я новичок в программировании.Поэтому я играл с разными частями кода и пытался узнать о трех вещах: sizeof().Как узнать длину массива, а также как поместить массивы в функции (в качестве параметра)?

Мой код:

#include <iostream>

using namespace std;

void arrayprint(int inarray[])
{
    for (int n_i = 0 ; n_i < (sizeof(inarray) / sizeof(int)) ; n_i++)
    {
        cout << inarray[n_i] << endl;
    }
}

int main()
{
    int n_array[5];
    for (int n_i = 0 ; n_i < (sizeof(n_array) / sizeof(int)) ; n_i++ )
    {
        cin >> n_array[n_i];
    }
    arrayprint(n_array);
    return 0;
}

Кажется, sizeof(inarray) / sizeof(int)работает в основной функции, но не в функции arrayprint.В функции печати массива она оценивается в 1, а в основном - в 5. Почему?

Итак, я думаю, что я хочу знать, как они отличаются?И почему?

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

Это

void arrayprint(int inarray[])

Эквивалентно этому:

void arrayprint(int *inarray)

Итак, вы получаете размер int-указателя на вашем компьютере. Даже если ваш вопрос касается C ++ и ваша функция выглядит немного иначе, он сводится к этой записи C FAQ .

Итак, внутри main n_array на самом деле настоящий честный массив. Но когда передается функции, она «разлагается» на указатель. И нет никакого способа узнать реальный размер. Все, что вы можете сделать, это передать дополнительные аргументы вашей функции.

void arrayprint(int inarray[], int len)
{
    for (int n_i = 0 ; n_i < len; n_i++)
    /* .... */

И назовите это так:

arrayprint(n_array, sizeof(n_array) / sizeof(n_array[0]));

Конечно, решение real будет использовать vector s, так как вы используете C ++. Но я не знаю много о C ++.

1 голос
/ 12 июля 2011

В main() ваш n_array является массивом. Когда вы берете sizeof(n_array), вы получаете размер массива в байтах. Чтобы быть точным, вы получаете размер, такой что sizeof (char) тождественно равен единице. В настоящее время на большинстве современных компьютеров это байты.

Массив не является указателем. Однако, когда вы передаете массив какой-либо функции, передается адрес нулевого элемента массива. Массив разлагается в указатель. Так что ваш arrayprint() будет лучше прототипирован как void arrayprint(int* inarray). Когда вы берете sizeof(inarray), вы не вычисляете размер n_array в main(). Вы вычисляете размер указателя.

1 голос
/ 12 июля 2011

Вы столкнулись с преобразованием массива в указатель, функцией языка C, унаследованной от C ++. Существует подробный пост C ++ - faq об этом: Как использовать массивы в C ++?

Поскольку вы используете C ++, вы можете передать массив по ссылке:

template<size_t N>
void arrayprint(int (&inarray)[N])
{
    for (int n_i = 0 ; n_i < (sizeof(inarray) / sizeof(int)) ; n_i++)
        cout << inarray[n_i] << endl;
}

хотя в этом случае размер расчета избыточен:

template<size_t N>
void arrayprint(int (&inarray)[N])
{
    for (size_t n_i = 0 ; n_i < N ; n_i++)
        cout << inarray[n_i] << '\n';
}

И, как уже упоминалось, если вашей целью является не передача массива C в функцию, а передача контейнера или последовательности значений, рассмотрите возможность использования std::vector и других контейнеров и / или итераторов. *

...