#include <stdio.h>
void printarray(const int arr[][3]);
int main()
{
    int arr[][3] = {{1,2,3},{4,5,6}};
    
    printarray(arr);
    
    getchar();
    return 0;
}

void printarray(const int arr[][3])
{
     int i,j;
     
     for(i=0;i<2;i++)
     {
        for(j=0;j<3;j++)
        printf("%d\t", arr[i][j]);
        
        printf("\n");
     }
        
}

This above code tends to give me a warning.

9 D:\cprogramming\arr1.c [Warning] passing argument 1 of 'printarray' from incompatible pointer type

but if i specify the arr in the main as const everything goes well.

But the same code with just 1D array it dons't tend to give me any warning, i dont understand why?

#include <stdio.h>
void printarray(const int arr[]);
int main()
{
    int arr[] = {1,2,3,4,5,6};
    
    printarray(arr);
    
    getchar();
    return 0;
}

void printarray(const int arr[])
{
     int i;
     
     for(i=0;i<6;i++)
        printf("%d\t", arr[i]);
}

Can anyone please explain why?

ssharish

This is a tricky one. The two arrays are incompatible because of the const just like you noticed. The first dimension of an array turns into a pointer so int arr[][3] becomes int (*)[3] . But a pointer to an array of int isn't convertible to a pointer to an array of const int and your compiler complains on the first program. A pointer to int is convertible to a pointer to const int so the compiler doesn't complain on the second program.

I know that this is the rule, but I can't decipher the standard legalese enough to tell you exactly why it doesn't work. :( Maybe someone smarter than me can translate it for you.

Hey thanks for the reply, ya i know this rule before. But why is it like that, there should be some reason, for coming up with this rule.

but anyway thanks for your rely.

ssharish

This article has been dead for over six months. Start a new discussion instead.