Ez az eszmefuttatás egész addig érvényes, amíg rá nem jössz, hogy a struct-ok viszont érték szerint adódnak át, ergó lemásolódnak és működik rájuk a sizeof... Sőt még cím szerinti átadás esetén is megy. Semmi oka nincs, hogy tömbökre, legalábbis konstans méretűekre miért ne tudna ugyanígy működni - azt leszámítva, hogy a nyelv nem így működik - azaz szarul. :) Nem különböztet meg konstans méretű és dinamikus méretű tömböket, és hiába ismert egy statikus méretű tömböd mérete, valamiért ez az infó elveszik paraméterátadáskor. Az arr + 5 példa számomra teljesen rossz, és pont annak a példája, hogy a C olyasmit is megenged amit nem kéne - az "arr + 5" számomra egy 1337 elemű tömböt kéne hogy jelentsen attól a címtől kezdve, hiszen az van a típusban - de nem azt fog. Nyilván így nem is tud működni a sizeof(), ezt is értem. De pont ez a problémám a C-vel, hogy _szerintem_ ez így értelmetlen, de ezt elmagyarázni valakinek aki ebben él olyan, mint egy német vagy angol nyelvi beszélőnek hogy a nemre tagolt személyes névmásoknak kb. semmi értelme és lehet enélkül létezni, sőt... Jót tesz mentálisan. :)
Struct-os példa:
#include "stdio.h"
typedef struct {
char arr[1337];
} struct_t;
struct_t struc;
void func_v(struct_t struc)
{
printf("v struc: %ld\n",sizeof(struc));
printf("v struc.arr: %ld\n",sizeof(struc.arr));
}
void func_r(struct_t *struc)
{
printf("r struc: %ld\n",sizeof(*struc));
printf("r struc.arr: %ld\n",sizeof(struc->arr));
}
int main() {
func_v(struc);
func_r(&struc);
return 0;
}
Kimenet:
charlie@chainmbp-m2 arr_t % ./a.out
v struc: 1337
v struc.arr: 1337
r struc: 1337
r struc.arr: 1337
Mint látható, akkor is konzisztensen működik, ha cím szerinti átadás történik... a fenti nem ijesztő akkor? Ezt vajon hogy csinálhatja a fordító! Fekete mágia...! :) Rettegjünk együtt... A válasz amúgy kb. az mint a C, a Pascal, vagy bármilyen más nyelv esetében - tudnod kell mit csinál rá a fordító, és a nyelv. Semmi ijesztő nincs benne. De attól még lehet véleményed arról, hogy egy szabály rossz vagy nem. És nem kell aggódni, a Pascalban, főleg az Object Pascalban van jópár olyan dolog, amit ugyanígy nem konzisztens... De legalább az alapok egyben vannak.
Najó hagyjuk, tényleg...