Может кто-нибудь сказать мне, почему я не могу найти длину массива с помощью функции sizeof () здесь? - PullRequest
0 голосов
/ 07 мая 2019

Когда я изменил код, чтобы включить аргумент для размера, код работал правильно.Но я не могу понять, какую ошибку он показывает, когда вычисляю длину массива с помощью sizeof ()?

#include <iostream>
using namespace std;

void display(int arr[]){
    int n=sizeof(arr)/sizeof(arr[0]);
    int* ptr=arr;
    for (int i=0;i<n;i++) {
        cout << i << " : " << *ptr << endl;
        ptr++;
    }
} 

int main(){
    int arr[9] = {2,5,3,8,5,4,6,1,7};
    display(arr);   
    return 0;
}

1 Ответ

4 голосов
/ 07 мая 2019
void display(int arr[], int n)

Это ложь, но это не твоя вина.

Во время компиляции он автоматически переписывается в:

void display(int* arr, int n)

То есть, хотя массивы не являются указателями , старые глупые функции C могут заставить нас думать, что они есть! Невозможно передать массив по значению, поэтому вы просто передаете указатель на первый элемент.

Таким образом, вы делаете sizeof(int*).

Вместо этого я предлагаю использовать sizeof(*arr) * n или передать ссылку в массив:

#include <iostream>

template <std::size_t N>
void display(const int (&arr)[N])
{
    std::size_t i = 0;
    for (std::size_t i = 0; i < N; i++)
        std::cout << i << " : " << arr[i] << '\n';
} 

int main(){
    int arr[9] = {2,5,3,8,5,4,6,1,7};
    display(arr);
}

( демоверсия )

* * & Тысячу двадцать-три hellip; или переписать вашу функцию вместо пары итераторов:
#include <iostream>
#include <iterator>

template <typename It>
void display(const It begin, const It end)
{
    std::size_t i = 0;
    for (It it = begin; it != end; ++it)
        std::cout << i++ << " : " << *it << '\n';
} 

int main(){
    int arr[9] = {2,5,3,8,5,4,6,1,7};
    display(std::begin(arr), std::end(arr));
}

( живая демонстрация )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...