Как узнать размер массива переданного в функцию?
но в SIZE сохраняется 1, независимо от размера массива. Можно, конечно, вместе с массивом передать в функцию и его размер, но может существует более изящное решение? P.S.: Кстати, заметил нечто странное. Запускал эту программу через Visual Studio и Qt. В VS в SIZE сохраняется 1, а в Qt 2.
Отслеживать
44.8k 3 3 золотых знака 38 38 серебряных знаков 89 89 бронзовых знаков
задан 14 окт 2016 в 13:34
130 1 1 золотой знак 1 1 серебряный знак 8 8 бронзовых знаков
sizeof(Array) — размер указателя на int в данном случае.
14 окт 2016 в 13:37
При имеющейся сигнатуре размер массива Вы узнать не сможете.
14 окт 2016 в 13:38
А при чём тут C++? Размер массива в C++ узнать очень просто: методом size() (если это, скажем, vector ) или аналогичным.
14 окт 2016 в 13:40
@PinkTux так вопрос про обычные массивы, не STL-контейнеры же. Хотя согласен, в С++ по возможности стоит отказываться от сишных массивов в пользу vector, array и прочего.
14 окт 2016 в 13:42
Вот еще может помочь
14 окт 2016 в 13:42
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
У вас параметр функции foo объявлен как указатель типа int *
void foo(int* Array); ^^^^^^^^^^
Следовательно внутри функции выражение
sizeof(Array)/sizeof(int)
sizeof(int *)/sizeof(int)
Если, например, размер указателя, то есть типа int * , равен 8 байтам, а размер типа int равен 4 байтам, то в итоге вы получите 2. Если же при этом размер типа int равен также 8 байтам (64-битовая ОС), то вы получите в итоге 1.
Но даже если вы объявите эту функцию как
void foo(int Array[]);
void foo(int Array[10]);
все равно параметр функции неявно преобразуется в указатель на элемент массива. То есть эти два объявления функции объявляют одну и ту же функцию и эквивалетны следующему объявлению
void foo(int* Array);
Так что внутри функции вы снова будете иметь дело с указателем.
Когда массив передается по значению, то вам следует также объявлять второй параметр, который задает размер массива.
Или массив должен иметь некоторый граничный элемент с уникальным значением, по которому можно определить число актуальных элементов, как это имеет место, например, со строками, когда строки завершаются нулем, то есть символом ‘\0’ .
То есть в общем случае вам следует объявлять функцию как
void foo(int* Array, size_t n);
где n — это размер массива.
Другой подход — это объявлять параметр как ссылку на массив. В этом случае длина массива будет известна внутри функции. Например
void foo( int ( &Array )[10] ) < const size_t = sizeof( Array)/ sizeof( *Array ); >
Недостаток этого объявления состоит в том, что эта функция может иметь дело только с массивами, заданного в ее параметре размера.
Чтобы обойти это ограничение, вы можете объявить шаблонную функцию. Например,
template void foo( int ( &Array )[N] )
В этом случае компилятор, используя шаблон, создаст столько функций, сколько массивов разной длины были использованы в качестве аргумента.
Как определить длину массива в C++
По сути, когда мы говорим о длине массива, мы имеем в виду общее количество элементов, присутствующих в соответствующем массиве. Например, посмотрите на массив ниже:
int array1[] =
Размер (или длина) массива равна общему количеству элементов в нем. Следовательно, в данном случае это «5».
Способы определения длины массива в C++
Теперь давайте посмотрим на различные способы, с помощью которых мы можем выяснить длину массива в C++:
- поэлементный подсчет,
- begin() и end(),
- функция sizeof(),
- функция size() в STL,
- указатели.
Теперь давайте обсудим каждый метод подробно и с примерами.
1: Поэлементный подсчет
Самый очевидный способ – перебрать заданный массив и одновременно подсчитать общее количество перебранных элементов.
Но если мы заранее не знаем длину массива для итерации, то в таком случае мы не можем использовать цикл for. Эту проблему можно решить, используя простой цикл for-each. Внимательно посмотрите на приведенный ниже код.
#include #include using namespace std; int main() < int c; int arr[]=; cout cout
Вы получите такой результат:
The array is: 1 2 3 4 5 6 7 8 9 0 The length of the given Array is: 10
Как мы говорили выше, здесь мы перебираем весь массив arr, используя цикл for-each с итератором i. Значение счетчика c увеличивается по мере итерации. Когда перебор закончится, в c вы найдете длину данного массива.
2: Функции begin() и end()
Мы также можем вычислить длину массива, используя стандартные функции begin() и end(). Эти две функции возвращают итераторы, указывающие на начало и конец массива соответственно. Внимательно посмотрите на данный код:
#include #include using namespace std; int main() < //Given Array int arr[] = < 11, 22, 33, 44 >; cout
Следовательно, разница между возвращаемыми значениями двух функций end() и begin() дает нам размер или длину данного массива. Данный код вернет:
The Length of the Array is : 4
3: Функция sizeof()
Оператор sizeof() в C++ возвращает размер переданной переменной или данных в байтах. Кроме того, он возвращает общее количество байтов, необходимых для хранения массива. Следовательно, если мы просто разделим размер массива на размер, занимаемый каждым его элементом, мы узнаем общее количество элементов, присутствующих в массиве.
Давайте посмотрим, как это работает:
#include #include using namespace std; int main() < //Given array int arr[] = ; int al = sizeof(arr)/sizeof(arr[0]); //length calculation cout
В результате мы получим:
The length of the array is: 3
4: Функция size() в STL
В стандартной библиотеке есть функция size(), которая возвращает количество элементов в заданном контейнере (в нашем случае это массив).
#include #include using namespace std; int main() < //Given array arrayarr< 1, 2, 3, 4, 5 >; //Using the size() function from STL cout
В результате вы получите:
The length of the given Array is: 5
5: Определение длины массива с помощью указателей
Узнать длину массива можно с помощью указателей. Давайте посмотрим, как это делается:
#include #include using namespace std; int main() < //Given array int arr[6] = ; int len = *(&arr + 1) - arr; //*(&arr + 1) is the address of the next memory location // just after the last element of the array cout
В результате мы получим:
The length of the array is: 6
Выражение *(arr+1) выдает адрес области памяти сразу после последнего элемента массива. Следовательно, разница между ним и начальным местоположением массива (или базовым адресом, arr) показывает общее количество элементов, присутствующих в данном массиве.
Заключение
Итак, в этом мануале мы обсудили различные методы определения длины массива в C++. Все приведенные выше методы просты в использовании, однако мы предпочитаем применять цикл for-each – не только из-за удобочитаемости кода, но и из-за его кросс-платформенной надежности.
Как узнать размер массива?


- C++
Не могу, понять как компьютер перемещает свой знак?
- 1 подписчик
- 20 часов назад
- 91 просмотр

- C++
- +2 ещё
Почему не компилируется код C++ в VS code/Platformio?
- 1 подписчик
- 23 часа назад
- 69 просмотров

- C++
Что быстрее индексы или указатели?
- 1 подписчик
- 03 янв.
- 175 просмотров

- C#
- +4 ещё
Как реализовать движение частиц в векторном поле или сплошной среде?
- 1 подписчик
- 03 янв.
- 111 просмотров

- Windows
- +2 ещё
Как отлавливать курсор при наведении на дочернее окно?
- 1 подписчик
- 02 янв.
- 120 просмотров

- C++
Как обеспечивается совместимость динамических библиотек при ликовке в рантайме?
- 3 подписчика
- 30 дек. 2023
- 312 просмотров

- C++
Как установить библиотеку c++ если в папке lib пусто и при запуске ошибка LINK2019?
- 1 подписчик
- 29 дек. 2023
- 57 просмотров

- C++
Как лучше добавить перед структурой ещё одну и поместить в массив?
- 1 подписчик
- 29 дек. 2023
- 71 просмотр

- C++
Почему прога билдится, но не запускается?
- 1 подписчик
- 28 дек. 2023
- 100 просмотров

- C++
- +1 ещё
Какие хорошие ресурсы для изучения c++?
- 2 подписчика
- 28 дек. 2023
- 240 просмотров
До 260 000 ₽
от 250 000 ₽
08 янв. 2024, в 20:24
3000 руб./за проект
08 янв. 2024, в 20:10
500 руб./за проект
08 янв. 2024, в 19:59
50000 руб./за проект
Минуточку внимания
Присоединяйтесь к сообществу, чтобы узнавать новое и делиться знаниями
- Как сделать так, чтобы при регистрации пользователя в телеграмм боте его ID сохранялся в файле только один раз?
- 2 подписчика
- 2 ответа
- 4 подписчика
- 3 ответа
- 2 подписчика
- 1 ответ
- 2 подписчика
- 0 ответов
- 2 подписчика
- 2 ответа
- 3 подписчика
- 1 ответ
- 3 подписчика
- 0 ответов
- 2 подписчика
- 0 ответов
- 2 подписчика
- 5 ответов
- 2 подписчика
- 4 ответа
Re: C++, можно ли узнать размер массива ?


а размер можно узнать, если ты позаботился о том что последний элемент NULL, если нет, то увы но никак.
ну а как в плюсах, точнее что есть в stl не знаю.
alphex_kaanoken ★★★
( 06.12.06 17:57:29 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от alphex_kaanoken 06.12.06 17:57:29 MSKRe: C++, можно ли узнать размер массива ?
>размер можно узнать, если ты позаботился о том что последний элемент NULL, если нет, то увы но никак.
А в массиве в качестве значения NULL содержаться конечно не может.
К тому же это тогда обязательно должен быть массив указателей.andron01
( 06.12.06 18:57:16 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от andron01 06.12.06 18:57:16 MSK
Re: C++, можно ли узнать размер массива ?
>А в массиве в качестве значения NULL содержаться конечно не может.
wtf? указатель это указатель. если у нас указатель на указатель то да нужно последним делать NULL. а в случае int* лучше держать например первым элементом количество элементов за ним замаллоченным, или отдельной переменной, не делать же лимитирующим значением 0 ?
к примеру если у меня по указателю находятся какие нить значение, например колебания того или иного, которые могут быть 0.
в случае с int[] уже выше показали как узнать.
alphex_kaanoken ★★★
( 06.12.06 19:15:01 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от aeuo 06.12.06 17:48:06 MSKRe: C++, можно ли узнать размер массива ?
> можно если массива int arr[]
Нельзя. В списке аргументов int arr[] абсолютно равнозначно int *arr.
uj2 ★★★
( 06.12.06 20:09:13 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от uj2 06.12.06 20:09:13 MSKRe: C++, можно ли узнать размер массива ?
> УКАЗАТЕЛЬ != МАССИВ!
int arr[5]; int *ar; ar = new int[5];
кстати где0то читал что в С массив == указатель .
anonymous
( 06.12.06 20:31:33 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от anonymous 06.12.06 20:31:33 MSKRe: C++, можно ли узнать размер массива ?
> Забей на массивы (ибо зло) и пользуй std::vector. Там есть size().
anonymous
( 06.12.06 20:32:08 MSK )Re: C++, можно ли узнать размер массива ?
Вот есть ещё такой немножко нестандартный подход. #include using std::cout; using std::endl; template void print(int (&arr)[Len]) < for (size_t i = 0; i < Len; ++i) cout int main() < int arr[] = ; print(arr); return 0; >
Legioner★★★★★
( 06.12.06 21:21:23 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от Legioner 06.12.06 21:21:23 MSKRe: C++, можно ли узнать размер массива ?
ага. и по одной функции для каждого размера =))
legk
( 06.12.06 22:30:30 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от legk 06.12.06 22:30:30 MSKRe: C++, можно ли узнать размер массива ?
Зато компилятор может цикл развернуть, да и вообще заинлайнить всё 🙂
А так конечно vector надо пользовать.
Legioner★★★★★
( 06.12.06 22:50:56 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от anonymous 06.12.06 20:31:33 MSKRe: C++, можно ли узнать размер массива ?
> объясните разницу: > int arr[5]; int *ar; > ar = new int[5]; > кстати где0то читал что в С массив == указатель .
Не совсем. Имя массива это всегда указатель на ПЕРВЫЙ элемент. Например ты можешь сделать:
int *ma = malloc(5 * sizeof(int)); ma++;
shumer ★
( 07.12.06 13:05:16 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от anonymous 06.12.06 20:31:33 MSKRe: C++, можно ли узнать размер массива ?
> объясните разницу: > int arr[5]; int *ar; > ar = new int[5]; > кстати где0то читал что в С массив == указатель . Не совсем. Имя массива это всегда указатель на ПЕРВЫЙ элемент. Например ты можешь сделать: int *ma = malloc(5 * sizeof(int)); ma++; Но нельзя: int a[] = ; a++;
shumer ★
( 07.12.06 13:06:19 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от shumer 07.12.06 13:06:19 MSKRe: C++, можно ли узнать размер массива ?
> Имя массива это всегда указатель на ПЕРВЫЙ элемент.
Не всегда. Как раз в случаях операций ++ — sizeof x= . массив не генерирует указателя, а является немодифицируемым lvalue.
uj2 ★★★
( 07.12.06 19:50:54 MSK )
Ответ на: Re: C++, можно ли узнать размер массива ? от uj2 07.12.06 19:50:54 MSKRe: C++, можно ли узнать размер массива ?
Вобщем, как говорил Пендальф, нужно обратиться к первоисточнику:
A7.1. Генерация указателя
Если тип выражения или подвыражения есть «массив из T», где T — некоторый тип, то значением этого выражения является указатель на первый элемент массива, и тип такого выражения заменяется на тип «указатель на T». Такая замена не делается, если выражение является операндом унарного оператора &, или операндом операций ++, —, sizeof, или левым операндом присваивания, или операндом оператора . (точка). Аналогично, выражение типа «функция, возвращающая Т», кроме случая, когда оно является операндом для &, преобразуется в тип «указатель на функцию, возвращающую T».
shumer ★
( 07.12.06 21:15:01 MSK )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.Похожие темы
- Форум [C++] массивы и указатели (2010)
- Форум [C]Подскажите как компилер обязан передавать массивы в ф-ю (2008)
- Форум Многомерные массивы и указатели в ANSI C (2016)
- Форум Печать массива символов. (2014)
- Форум Сумма чисел двумерного массива во время компиляции (2018)
- Форум bash. массивы. не понятка с размером массива. (2012)
- Форум Ссылки на элементы массива в PHP (2012)
- Форум Задачка с массивом строк на Си (2008)
- Форум Странность с массивом нулевой длины в C++ (2016)
- Форум Изменение размера массива по указателю (2018)