Перейти к содержимому

Как узнать размер массива c

  • автор:

Как узнать размер массива переданного в функцию?

но в 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 – не только из-за удобочитаемости кода, но и из-за его кросс-платформенной надежности.

Как узнать размер массива?

myjcom

cpp

  • C++

Не могу, понять как компьютер перемещает свой знак?

  • 1 подписчик
  • 20 часов назад
  • 91 просмотр

cpp

  • C++
  • +2 ещё

Почему не компилируется код C++ в VS code/Platformio?

  • 1 подписчик
  • 23 часа назад
  • 69 просмотров

cpp

  • C++

Что быстрее индексы или указатели?

  • 1 подписчик
  • 03 янв.
  • 175 просмотров

c#

  • C#
  • +4 ещё

Как реализовать движение частиц в векторном поле или сплошной среде?

  • 1 подписчик
  • 03 янв.
  • 111 просмотров

windows

  • Windows
  • +2 ещё

Как отлавливать курсор при наведении на дочернее окно?

  • 1 подписчик
  • 02 янв.
  • 120 просмотров

cpp

  • C++

Как обеспечивается совместимость динамических библиотек при ликовке в рантайме?

  • 3 подписчика
  • 30 дек. 2023
  • 312 просмотров

cpp

  • C++

Как установить библиотеку c++ если в папке lib пусто и при запуске ошибка LINK2019?

  • 1 подписчик
  • 29 дек. 2023
  • 57 просмотров

cpp

  • C++

Как лучше добавить перед структурой ещё одну и поместить в массив?

  • 1 подписчик
  • 29 дек. 2023
  • 71 просмотр

cpp

  • C++

Почему прога билдится, но не запускается?

  • 1 подписчик
  • 28 дек. 2023
  • 100 просмотров

cpp

  • 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 MSK

    Re: 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 MSK

    Re: C++, можно ли узнать размер массива ?

    > можно если массива int arr[]

    Нельзя. В списке аргументов int arr[] абсолютно равнозначно int *arr.

    uj2 ★★★
    ( 06.12.06 20:09:13 MSK )
    Ответ на: Re: C++, можно ли узнать размер массива ? от uj2 06.12.06 20:09:13 MSK

    Re: 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 MSK

    Re: 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 MSK

    Re: C++, можно ли узнать размер массива ?

    ага. и по одной функции для каждого размера =))

    legk
    ( 06.12.06 22:30:30 MSK )
    Ответ на: Re: C++, можно ли узнать размер массива ? от legk 06.12.06 22:30:30 MSK

    Re: C++, можно ли узнать размер массива ?

    Зато компилятор может цикл развернуть, да и вообще заинлайнить всё 🙂

    А так конечно vector надо пользовать.

    Legioner ★★★★★
    ( 06.12.06 22:50:56 MSK )
    Ответ на: Re: C++, можно ли узнать размер массива ? от anonymous 06.12.06 20:31:33 MSK

    Re: 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 MSK

    Re: 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 MSK

    Re: C++, можно ли узнать размер массива ?

    > Имя массива это всегда указатель на ПЕРВЫЙ элемент.

    Не всегда. Как раз в случаях операций ++ — sizeof x= . массив не генерирует указателя, а является немодифицируемым lvalue.

    uj2 ★★★
    ( 07.12.06 19:50:54 MSK )
    Ответ на: Re: C++, можно ли узнать размер массива ? от uj2 07.12.06 19:50:54 MSK

    Re: 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)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *