У меня есть простой main, который называется простым методом с массивом в качестве параметра
размер в массиве прав, но тогда, когда я пытаюсь напечатать массив im, получающий разный массив sizeof:
int bubbleSort(int arr[]) // yeah i know this sort is not complete
{
int arrSize = sizeof(arr); // HERE IS SIZE IS 4
bool bSorted = true;
while(bSorted)
{
for(int i=0;i<arrSize;i++)
{
if(arr[i]>arr[i+1])
{
int tmp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tmp;
}
}
bSorted = false;
}
return 1;
}
int main(int argc, char* argv[])
{
int arr[] = {4,3,7,8,9};
bubbleSort(arr);
int sOf = sizeof(arr); // HERE THE SIZE IS 20 ????
for(int j=0;j < sOf ;j++)
{
printf("%d",arr[j]);
}
return 0;
}
Вы не можете передавать массивы * по значению в качестве параметров функции (и не возвращать их таким образом). Синтаксис void f(int a[])
- это просто синтаксический сахар, который во всех аспектах идентичен void f(int * a)
, а параметр функции - это указатель, а не массив. Таким образом, вы в конечном итоге измеряете размер указателя.
Альтернативный синтаксис может служить нечеткой документацией о намерениях, сигнализируя, что вы планируете вызывать эту функцию с адресом элемента массива, но фактической разницы в синтаксисе указателя нет.
*) Типы массивов и типы функций ограничены таким образом, поэтому люди часто говорят, что они не являются первоклассными гражданами системы типов.
Из-за того, что язык глуп, это:
int bubbleSort(int arr[])
на самом деле означает следующее:
int bubbleSort(int* arr)
Таким образом sizeof(arr)
- это размер указателя.
std::array
.arr
- указатель на функцию.