Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 66, средняя оценка - 4.71
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
#1

sizeof массива - C++

18.08.2012, 15:40. Просмотров 9724. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void f(float x[])
{ printf("%d\n",sizeof(x)); // Пишет 4 байта (размер элемента массива)
}
 
void f2(float x[125])
{ printf("%d\n",sizeof(x)); // Почему пишет 4 байта, хотя в заголовке указан размер массива?
}
 
int main(int argc, char *argv[], char *env[])
{ float Arr[]={1,2,3,4,5,6,7,8};
  f(Arr);
  f2(Arr);
  printf("%d\n",sizeof(Arr)); // Пишет размер всего массива
  return 0;
}
В f() и main() всё правильно и понятно. Почему в f2(), где у массива x явно указан размер, sizeof выдаёт всёравно размер элемента, а не размер всего массива как в main().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2012, 15:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос sizeof массива (C++):

Sizeof(.) или constexpr size_t tmp = sizeof(.) - C++
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности? правильности?

Определение размера массива + sizeof - C++
Массив из 6 чисел: sizeof возвращает 24 байта. Тот же массив вызван функцией возвращает только 4 байта. #include <iostream> using...

Почему sizeof массива char равно 4? - C++
Почему sizeof ch3 равно 4? #include <iostream> #include <cstring> int main() { char ch1 = "Cpp"; char ch2 = {'C',...

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile) - C++
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до 600, 100 байтов как записать эту...

sizeof( char * ) & sizeof(char) - C++
Здравствуйте, не могу понять почему sizeof(char *) = 4 а sizeof(char) = 1. Ну с последним ясно , а вот с первым непойму... Может кто-то...

sizeof - C++
Подскажите пожалуйста что делаю не так? в базовом классе gameElement, имеется матрица указателей на базовый класс: gameElement* arr; ...

6
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 413
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
18.08.2012, 15:42 #2
Отличие char *argv[] от char ** argv
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
18.08.2012, 15:58 #3
skvor, одна из странных особенностей языка - массив в параметре функции интерпретируется только как указатель
единственный вариант, когда будет возвращаться правильный размер -

C++
1
2
3
void f (int (&arr)[5] ) {
  std::cout << sizeof(arr) << std::endl;
}
при передаче массива по ссылке
но вообще проще сделать

C++
1
2
3
4
5
typedef int Array[5];
 
void f(Array arr) {
  std::cout << sizeof(Array) << std::endl;
}
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.08.2012, 16:34 #4
Цитата Сообщение от alex_x_x Посмотреть сообщение
но вообще проще сделать

C++
1
2
3
4
5
typedef int Array[5];
 
void f(Array arr) {
  std::cout << sizeof(Array) << std::endl;
}
typedef не создаёт типы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
typedef double Array[5];
 
void f(Array arr)
{
  std::cout << "f: "                    << std::endl
            << "  arr: " << sizeof(arr) << std::endl;
}
 
int main()
{
  Array x;
  double y[10];
  double *z = new double[200];
  std::cout << "double: "    << sizeof(double)    << std::endl
            << "double*: "   << sizeof(double*)   << std::endl
            << "Array: "     << sizeof(Array)     << std::endl
            << "double[5]: " << sizeof(double[5]) << std::endl
            << "x: "         << sizeof(x)         << std::endl
            << "y: "         << sizeof(y)         << std::endl
            << "z: "         << sizeof(z)         << std::endl;
  f(x);
  f(y);
  f(z);
}
Внутрь всё равно передаётся как указатель.
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
18.08.2012, 16:40 #5
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
typedef не создаёт типы.
а я не знал
речь идет о том, что размер будет вычислен как ожидается

все в следствии того, sizeof(param) будет возвращать размер указателя, а sizeof(Array) - типа
0
softmob
1248 / 698 / 155
Регистрация: 20.02.2010
Сообщений: 1,035
18.08.2012, 20:16 #6
вариант на шаблонах
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
template <typename T, unsigned N> 
void f(T (&v)[N]) 
{
    std::cout << sizeof v << std::endl;
}
 
int main(void)
{
    bool used[1024];
    f(used);
    return 0;
}
0
Catstail
Модератор
22640 / 11009 / 1785
Регистрация: 12.02.2012
Сообщений: 18,171
18.08.2012, 23:18 #7
Цитата Сообщение от alex_x_x Посмотреть сообщение
skvor, одна из странных особенностей языка - массив в параметре функции интерпретируется только как указатель
- если вдуматься, не такая уж и странная. В С/С++ для массивов не создаются дополнительные структуры. Поэтому и выход индексов за границу описания в C/С++ не контролируется (и не может).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2012, 23:18
Привет! Вот еще темы с ответами:

Sizeof - C++
int a = { 1, 2, 3, 4 },n = sizeof(a) / sizeof(a); Битый час разбираюсь с этой строкой,но понять не могу. Мы делим массив &quot;a&quot; на...

sizeof() - C++
Ребята,объясните пожалуйста для чего нужен sizeof()?А то в книге очень заумно написано...

Operator sizeof - C++
Кто-нибудь знает как реализован этот оператор? И когда он выполняется: на уровне компиляции или во время исполнения?

Немного о sizeof - C++
Не могу найти. Вот такая форма оператора, с несколькими параметрами: sizeof (323, 43241, 555) Что она возвращает?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
18.08.2012, 23:18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru