LINUX.ORG.RU

Забей на массивы (ибо зло) и пользуй std::vector. Там есть size().

blackice
()

можно если массива int arr[]
return sizeof(arr)/sizeof(int);

но у тебя не массив, а указатель на int - это разные вещи.

aeuo
()

УКАЗАТЕЛЬ != МАССИВ!

а размер можно узнать, если ты позаботился о том что последний элемент NULL, если нет, то увы но никак.

ну а как в плюсах, точнее что есть в stl не знаю.

alphex_kaanoken ★★★
()
Ответ на: комментарий от alphex_kaanoken

>размер можно узнать, если ты позаботился о том что последний элемент NULL, если нет, то увы но никак.
А в массиве в качестве значения NULL содержаться конечно не может.
К тому же это тогда обязательно должен быть массив указателей.

andron01
()
Ответ на: комментарий от andron01

>А в массиве в качестве значения NULL содержаться конечно не может.

wtf? указатель это указатель. если у нас указатель на указатель то да нужно последним делать NULL. а в случае int* лучше держать например первым элементом количество элементов за ним замаллоченным, или отдельной переменной, не делать же лимитирующим значением 0 ?

к примеру если у меня по указателю находятся какие нить значение, например колебания того или иного, которые могут быть 0.

в случае с int[] уже выше показали как узнать.

alphex_kaanoken ★★★
()
Ответ на: комментарий от uj2

> УКАЗАТЕЛЬ != МАССИВ!

объясните разницу:

int arr[5]; int *ar; ar = new int[5];

кстати где0то читал что в С массив == указатель ?????

anonymous
()
Ответ на: комментарий от anonymous

> Забей на массивы (ибо зло) и пользуй std::vector. Там есть size().

thanks a lot

anonymous
()

Вот есть ещё такой немножко нестандартный подход.

#include <iostream>
using std::cout;
using std::endl;

template <size_t Len>
void print(int (&arr)[Len])
{
    for (size_t i = 0; i < Len; ++i)
        cout << " "[!i] << arr[i];
    cout << endl;
}

int main()
{
    int arr[] = {1, 2, 5, 4, 3};
    print(arr);
    return 0;
}

Legioner ★★★★★
()
Ответ на: комментарий от legk

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

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

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

> объясните разницу: > int arr[5]; int *ar; > ar = new int[5]; > кстати где0то читал что в С массив == указатель ?????

Не совсем. Имя массива это всегда указатель на ПЕРВЫЙ элемент. Например ты можешь сделать:

int *ma = malloc(5 * sizeof(int)); ma++;

Но нельзя:

int a[] = {0, 1, 2, 3, 4}; a++;

shumer
()
Ответ на: комментарий от anonymous

> объясните разницу: 
> int arr[5]; int *ar; 
> ar = new int[5]; 
> кстати где0то читал что в С массив == указатель ?????

Не совсем. Имя массива это всегда указатель на ПЕРВЫЙ элемент.
Например ты можешь сделать:

    int *ma = malloc(5 * sizeof(int));
    ma++;

Но нельзя:

    int a[] = {0, 1, 2, 3, 4};
    a++;

shumer
()
Ответ на: комментарий от shumer

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

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

uj2 ★★★
()
Ответ на: комментарий от uj2

Вобщем, как говорил Пендальф, нужно обратиться к первоисточнику:

A7.1. Генерация указателя

Если тип выражения или подвыражения есть "массив из T", где T - некоторый тип, то значением этого выражения является указатель на первый элемент массива, и тип такого выражения заменяется на тип "указатель на T". Такая замена не делается, если выражение является операндом унарного оператора &, или операндом операций ++, --, sizeof, или левым операндом присваивания, или операндом оператора . (точка). Аналогично, выражение типа "функция, возвращающая Т", кроме случая, когда оно является операндом для &, преобразуется в тип "указатель на функцию, возвращающую T".

shumer
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.