SanchelliosProg
@SanchelliosProg
Java, Android, Software Testing

Почему в функцию передаётся только первый элемент массива?

Вопрос крайне нубасовский.

Есть массив:
int my_array[5] = { 1, 2, 3, 4, 5 };

Есть функция, которая создана для распечатывания в консоль этого массива:
void print_array(int my_array[]){
	using namespace std;
	cout << "ARRAY = { ";
	int size_of_array = sizeof(my_array) / sizeof(int);
	for (int i = 0; i < size_of_array; i++){
		cout << my_array[i] << " ";
	}
	cout << "}" << endl;
}

Используем эту функцию:
print_array(my_array);
По неведомой мне причине передаётся только первый элемент массива (1).
ARRAY = { 1 }

Но почему?
  • Вопрос задан
  • 572 просмотра
Решения вопроса 1
AxisPod
@AxisPod
Видимо компилируете 32битный бинарник, был бы 64битный, показало бы 2 элемента. Потому что sizeof(my_array) в вашем случае вернет не размер массива, а размер указателя на массив, а он всегда равен sizeof(int) в вашем случае. Размер надо прокидывать снаружи. Компилятор не таскает размер массива вместе с массивом.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Daniro_San
@Daniro_San
Программист
Ну, в плюсах массивы не передаются по значению. Всегда передается указатель на массив, будь то массив или даже матрица. А если точнее, то указатель на первый элемент. Это наследие Си, где массивы тесно связанны с указателями. Помимо прочего благодаря этой особенности лишний раз не выделяется память в стеке - при передаче аргументов.
void anyFunc(int myArray[]) в таком случае просто удобный синтаксис что бы показать, что передается именно указатель на массив, void anyFunc(int *myArray) тоже самое.
Можно, как рекомендует в таких случаях Страуструп определить структуру хранящую указатель на массив и его размер и принимать ее в функции.

struct Arr{ 
    int *arrPtr;
    int Size;
}

void print_array(const Arr &arr){ ... }

И вызов вашей функции сведется к такому действию:
print_array( { my_array, sizeof(my_array) / sizeof(int) } );


Но лучше всего использовать std::vector везде где нет ограничений по памяти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы