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».
Найти длину массива в C++
В этой статье мы узнаем о различных способах определения длины массива в 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
The Length of the Array is : 4
Следовательно, здесь, как мы видим, разница между возвращаемыми значениями двух функций end() и begin() дает нам размер или длину данного массива, привязка . То есть в нашем случае 4.
3. Использование функции sizeof() для определения длины массива в C++
Оператор 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. Использование указателей для определения длины массива в C++
Мы также можем найти длину данного массива с помощью указателей. Давайте посмотрим, как
#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. Не только из-за удобочитаемости кода, но и из-за его кросс-платформенной надежности.
Если у вас возникнут дополнительные вопросы, не стесняйтесь использовать комментарии ниже.
Рекомендации
- Как найти длину массива? – Вопрос о переполнении стека,
- цикл for-each в C++ — сообщение JournalDev.
Как определить длину массива в 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)
будет работать? а то у меня что-то не особо работает=([/QUOTE]Не будет работать, так как в функции уже идет речь не о массиве, а об указателя на массив. А длина указателя равна 4 байта.
21 сентября 2006 года
5.6K / / 13.08.2003
int сhsize(int a[], int n) if (n> sizeof(a)/sizeof(int) )
return 1;
>
будет работать? а то у меня что-то не особо работает=([/quote]
эээ. а как она должна работать? на i386 архитектуре, при n>1 она будет возвращать 0.
21 сентября 2006 года
5.6K / / 13.08.2003
добавтье в функцию параметр - размер передаваемого массива
21 сентября 2006 года
2.2K / / 04.02.2006
учитывая смысл функции, то надо не добавить а заменить параметр.
вместо указателя на функцию (int a[]), передавать его размер(sizeof(a)),
и тогда получим:
int сhsize(int sizeA, int n) <
if (n > sizeA/sizeof(int) ) return 0;
return 1;
>
а можно в функцию сразу послать как параметр namefunction(sizeof(a)/sizeof(int), тогда
int сhsize(int n1, int n2) <
if (n2 > n1 ) return 0;
return 1;
>
21 сентября 2006 года
267 / / 25.07.2006
[QUOTE=OlgaKr]учитывая смысл функции, то надо не добавить а заменить параметр.
вместо указателя на функцию (int a[]), передавать его размер(sizeof(a)),
и тогда получим:
int сhsize(int sizeA, int n) <
if (n > sizeA/sizeof(int) ) return 0;
return 1;
>
а можно в функцию сразу послать как параметр namefunction(sizeof(a)/sizeof(int), тогда
int сhsize(int n1, int n2) <
if (n2 > n1 ) return 0;
return 1;
>
[/QUOTE]Это уже решение. Только Знак больше нужно заменить на больше равно.
22 сентября 2006 года
2.2K / / 04.02.2006
Только Знак больше нужно заменить на больше равно.
а это уже не ко мне, я мысли читать не умею.
у fly_girl написано больше (copy/paste), ей видней что она хочет.
з.ы. для меня вообще ситуация немного странная, когда неизвестен размер стати-го массива.
22 сентября 2006 года
4.8K / / 20.01.2000
int сhsize(int a[], int n) if (n> sizeof(a)/sizeof(int) )
return 1;
>
будет работать? а то у меня что-то не особо работает=([/QUOTE]
В C++ будет работать так:
template
int сhsize( int (&a)[N], int n )
return (n > N) ? 0 : 1;
>
22 сентября 2006 года
2.2K / / 04.02.2006
[quote=Green]В C++ будет работать так: . [/quote]
у нее задача по С
22 сентября 2006 года
1.1K / / 19.09.2006
При помощи sizeof можно определить только размер массива в стеке текущей функции, что зачастую бессмысленно, ибо этот размер задаёт сам программист константой
const int cArSize = 100;
char str [cArSize];
А для определения размера объекта (массива) по его указателю используется функция _mSize (void *obj) - точное название функции не помню, хелпа под рукой сейчас нет 🙁
Function (TRecord *pRecArray)
int Size = _mSize (pRecArray) / sizeof (*pRecArray); // или / sizeof (TRecArray)
>
22 сентября 2006 года
267 / / 25.07.2006
[QUOTE=el scorpio]А для определения размера объекта (массива) по его указателю используется функция _mSize (void *obj) - точное название функции не помню, хелпа под рукой сейчас нет 🙁
Function (TRecord *pRecArray)
int Size = _mSize (pRecArray) / sizeof (*pRecArray); // или / sizeof (TRecArray)
>
[/QUOTE]Согласно help _msize.
#include
#include
#include
int сhsize(int *a, int n)
if(n>=_nsize(a)/sizeof(int) )
return 0;
return 1;
>
void main()
int *a = (int *)malloc(100*sizeof(int));
int t = chsize(a, 80);
.
.
22 сентября 2006 года
221 / / 11.09.2006
Да никак нельзя узнать размер массива. Для чего придумали строки заканчивающиеся нулем?
22 сентября 2006 года
13 / / 24.04.2006
я попробую _nsize.
дело в том, что у меня есть функция, в которую передаются 2 параметра: массив и число n, обозначающее с каким кол-вом элементов этого массива нужно работать.
но нужно обработать ситуацию, когда n больше кол-ва элементов в массиве.
22 сентября 2006 года
1.1K / / 19.09.2006
[QUOTE=fly_girl]дело в том, что у меня есть функция, в которую передаются 2 параметра: массив и число n, обозначающее с каким кол-вом элементов этого массива нужно работать.
но нужно обработать ситуацию, когда n больше кол-ва элементов в массиве.[/QUOTE]
Хорошая функция 🙂
Вот только ситуацию такую проще не создавать, чем решать:D
А вообще, в подобных ситуациях лучше использовать стандартный Builder'овский шаблон DynamicArray. Этот объект-контейнер изображает массив и сам следит за выделением/освобождением памяти, а также корректностью индексации.
22 сентября 2006 года
13 / / 24.04.2006
просто задание с обычными массивамии
и просили эту ситуацию учесть..
22 сентября 2006 года
221 / / 11.09.2006
[QUOTE=fly_girl]просто задание с обычными массивамии
и просили эту ситуацию учесть..[/QUOTE]
Мое мнение: либо это задача на смекалку, либо твой учитель курит грибы. Но в обоих случаях переданный функции указатель - это всего лишь число соответствующее адресу в памяти.
