Difference between “pointer to int” and “pointer to array of ints”

前端 未结 8 1498
甜味超标
甜味超标 2020-11-29 02:48
int main()
{
    int (*x)[5];                 //pointer to an array of integers
    int y[6] = {1,2,3,4,5,6};    //array of integers
    int *z;                              


        
8条回答
  •  独厮守ぢ
    2020-11-29 03:35

    The short answer: There is a difference, but your example is flawed.

    The long answer:

    The difference is that int* points to an int type, but int (*x)[6] points to an array of 6 ints. Actually in your example,

    x = y;
    

    is undefined** behavior, you know these are of two different types, but in C you do what you want. I'll just use a pointer to an array of six ints.

    Take this modified example:

    int (*x)[6];                 //pointer to an array of integers
    int y[6] = {1,2,3,4,5,6};    //array of integers
    int *z;                      //pointer to integer
    int i;
    
    z = y;
    for(i = 0;i<6;i++)
        printf("%d ",z[i]);
    
    x = y; // should be x = &y but leave it for now!
    
    for(i = 0;i<6;i++)
        printf("%d ",x[i]); // note: x[i] not (*x)[i]
    

    First,

    1 2 3 4 5 6
    

    Would be printed. Then, we get to x[0]. x[0] is nothing but an array of 6 ints. An array in C is the address of the first element. So, the address of y would be printed, then the address of the next array in the next iteration. For example, on my machine:

    1 2 3 4 5 6 109247792 109247816 109247840 109247864 109247888 109247912
    

    As you can see, the difference between consecutive addresses is nothing but:

    sizeof(int[6]) // 24 on my machine!
    

    In summary, these are two different pointer types.

    ** I think it is undefined behavior, please feel free to correct my post if it is wrong.

提交回复
热议问题