'C array vs pointer in these examples

This question doesn't require any initial explanation, other that to show the examples.

Why does this work (prints the contents of array a):

#include <stdio.h>

int a[100];

void check(int **b)
{
    int i;
    for (i = 0; i < 100; i++)
        printf("%d ", b[0][i]);
}

int main()
{
    int *arr = a;
    int i;
    for (i = 0; i < 100; i++)
    {
        a[i] = i;
    }
    
    check(&arr);

    return 0;
}

and this doesn't (compiles with onlinegdb c compiler, but prints nothing)?

#include <stdio.h>

int a[100];

void check(int **c)
{
    int i;
    for (i = 0; i < 100; i++)
        printf("%d ", c[0][i]);
}

int main()
{
    int i;
    for (i = 0; i < 100; i++)
    {
        a[i] = i;
    }

    check((int**)&a);

    return 0;
}

I understand that array is a special data type in C, but shouldn't casting it to a pointer type or assigning it to one be the same? Is there a way to make the second example work without the additional pointer?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source