چرا من [arr] و همچنین arr [i] در C با انواع داده های بزرگتر کار می کنم؟

کاملاً رایج است که اگر به عنصری از یک عنصر دسترسی پیدا کنید array as arr [i] در C که می توانید به عنصر as i [arr] دسترسی پیدا کنید ، زیرا اینها فقط به * خلاصه می شوند (arr + i) و جمع جایگزین است. سوال من این است که چرا این مورد برای انواع داده های بزرگتر از char کار می کند ، زیرا sizeof (char) 1 است و برای من این باید نشانگر را فقط با یک کاراکتر پیش ببرد.

شاید این مثال واضح تر است:

#include <string.h>
#include <stdio.h>

struct large { char data[1024]; };

int main( int argc, char * argv[] )
{
    struct large arr[4];
    memset( arr, 0, sizeof( arr ) );

    printf( "%lu\n", sizeof( arr ) ); // prints 4096

    strcpy( arr[0].data, "should not be accessed (and is not)" );
    strcpy( arr[1].data, "Hello world!" );

    printf( "%s, %s, %s\n", arr[1].data, 1[arr].data, (*(arr+1)).data );
    // prints Hello world!, Hello world!, Hello world!
    // I expected `hold not be accessed (and is not)' for #3 at least

    return 0;

}

پس چرا افزودن یک به نشانگر آرایه ، آن را با sizeof (ساختار بزرگ) پیش می برد؟

10
задан templatetypedef 16 February 2012 в 20:18
поделиться