简体   繁体   中英

3d array using pointers

I am new to C programming. Currently am trying to learn 3d array using pointers. Below is a program I am trying to debug. Can any one explain the difference between the two programs given below?

code1:

#include <stdio.h>
int main()
{
    int a;
    int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1};
    printf("%d\n",*(*(*(d +1)+1)+1));
    if(*(*(*(d +1)+1)+1) <(a= sizeof( int )))
        puts(" u got it ");
    else
        puts (" but wrong");
    return 0;
}

code2:

#include <stdio.h>
int main()
{
    int a;
    int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1};
    if(*(*(*(d +1)+1)+1) <(sizeof( int )))
        puts(" u got it ");
    else
        puts (" but wrong");
    return 0;
}

In the first code I am getting the […incomplete…]

 int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1}; 

The initializer is not fully braced but in this situation the initializers apply to the next element of the array in memory, so this assigns d[0][0][0] = 1 , d[0][0][1] = -2 , d[0][1][0] = -3 , etc.

 printf("%d\\n",*(*(*(d +1)+1)+1)); 

The thing full of stars is an obfuscated way of writing d[1][1][1] . The definition of X[Y] is *(X+Y) .

 (a= sizeof( int ))) 

The type of an assignment expression is the type of the left-hand operand. So the first program does (int)-1 < (int)4 . The second program does (int)-1 < (size_t)4 . (assuming your ints are 4 bytes big).

In the first case this is true . In the second case it is a type mismatch. The type mismatch has to be fixed before the comparison can occur. The rules of C say that in this case the signed type is converted to the unsigned type, giving (size_t)-1 < (size_t)4 . Since (size_t)-1 is actually the largest possible size_t value, this comparison is false .

It is basically an integer type comparison problem. First program compares a signed int (-1) with a signed int (a) and the second, a signed int (-1) with an unsigned int (sizeof()). Integer promotion happens in the second case, where signed int (-1) gets converted to unsigned int (-1) -> SIZE_MAX. For more details on type comparison check the thread, What are the general rules for comparing different data types in C?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM