Задать вопрос
@evg_96

Почему sizeof показывает фактический размер массива хотя по сути имя массива это указатель на первый элемент?

Почему sizeof marbles равняется 40 байтам, хотя marbles это указтель на первый элемент массива? (printf("%d", marbles == &marbles[0]); // true)
Вот в функции sum все логично, в функцию передается указатель на первый элемент, и собственно выводится размер указателя равный 8 байтам.

почему marbles == &marbles[0], но sizeof(marbles) != sizeof &marbles[0]?

#include <stdio.h>
#include <conio.h>

#define SIZE 10

int sum(int * arr, int n);

int main(void)
{
    int marbles[SIZE] = { 20, 10, 5, 39, 4, 16, 19, 26, 31, 20 };
    long answer = sum(marbles, SIZE);

    printf("Common sum of array items = %ld.\n", answer);
    printf("Memory: %zd bytes.\n", sizeof marbles); // 40
    printf("%d", marbles == &marbles[0]); // true

    _getch();

    return 0;
}

int sum(int * arr, int n)
{
    int index;
    int total = 0;
    
    for (index = 0; index < n; index++)
        total += *(arr + index);

    printf("Size of arr = %zd bytes.\n", sizeof arr); // 8

    return total;
}
  • Вопрос задан
  • 927 просмотров
Подписаться 1 Простой Комментировать
Ответ пользователя Mercury13 К ответам на вопрос (2)
@Mercury13
Программист на «си с крестами» и не только
Несмотря на то, что массив часто отождествляют с указателем, массив — это НЕ указатель. У него, например, другие операции приводят к неопределённому поведению.

И самое противное в Си — это то, что в коде
void sort(int x[5]);
x — это не массив, а именно что указатель. Чтобы был массив, надо Си++
void sort(int (&x)[5]);
И компилятор даже подсвечивает, что параметр функции, отмеченный как массив — всегда указатель.
typedef int Arr[SIZE];
int sum(Arr arr, int n)
// warning: 'sizeof' on array function parameter 'arr' will return size of 'int *' [-Wsizeof-array-argument]|
Ответ написан
Комментировать