//---- Odkomenuj swoj kompilator ----- #define VISUAL //#define BORLAND //------------------------------------ #ifdef BORLAND #include #include #endif #ifdef VISUAL #include #endif #include #include #include //UWAGA: dla kompilatorow 16 bitowych jak BC31 int ma dlugosc 2 bajtow //dla kompilatorow 32 bitowych jak MSV6.0 int ma dlugosc 4 bajtow //ponizsze komentarze przyjmuja dlugosc int == 2 bajty! //wygodnie definiowac jest strukture jako typedef //nie trzeba wtedy przed deklaracja uzywac: struct TYPX X; typedef struct { int x; int y; } TYPX; //------------------------- //unia ma dlugosc tylu bajtow ile najdluzszy jej skladnik //skladniki unii nakladaja sie na siebie w pamieci zajetej przez unie typedef union { TYPX xy1; //1 skladnik dlugosci sizeof(TYPX) = 4 bajty unsigned long xy2; //2 skladnik dlugosci sizeof(unsigned long) = 4 bajty char tab[5]; //3 sklanik 5 bajtow } TYPXun; //unia ma dlugosc 5 bajtow TYPX *ptX; //wskaznik do struktury TYPX //rozmiaru 2 (near pointer) lub 4 (far pointer) //bajtow w zaleznosci od modelu //pamieci ustawionej w kompilatorze //na poczatku wskaznik ma wartosc NULL == 0 // pozniej podstawie pod niego adres o obszaru pamieci w ktorej //bede trzymal strukture. //UWAGA: // wszystkie wskazniki niezaleznie od typu danych do jakich wskazuja // maj taka sama taka sama dlugosc np: // char *str; - wskaznik do tablicy znakow // void *xxx; - wskaznik bez typu // int *yyy; - wskaznik do int'a // TYPX *ptX; - wskznik do struktury // TYPXun *ptXun; - wskznik do unii //------------------------------------------------ void main() { TYPX X; //struktura lokalna allokowana na stosie w momencie wywolania fun. main TYPXun Xun; //unia //clrscr(); //borland czysc ekran printf( "\n\n" ); //rozmiar struktury TYPX i wielkosc wskaznika // sizeof zwraca rozmiar poanego mu typu w bajtach printf( "sizeof TYPX=%d adrres=%d\n", sizeof(TYPX), sizeof(TYPX*) ); //allokujemy pamiec dla naszej struktury // calloc zwraca wsk. do zaallokowanej pamieci = calloc( ilosc_blokow, rozmiar_pamieci_wbloku ) if ( (ptX=calloc( 1, sizeof(TYPX) )) == NULL ) { printf( "ERROR calloc\n"); exit(1); } // wypelniam caly obszar pamieci bajt po bajcie zerami (mozna innymi liczbami) memset( ptX, 0, sizeof(TYPX) ); printf( "1: z->x=%d z->y=%d\n", ptX->x, ptX->y ); ptX->x = 1; //podstawienie za pole x w struct TYPEX przez wskaznik do tej struktury ptX->y = 2; printf( "2: z->x=%d z->y=%d\n", ptX->x, ptX->y ); X.x = 4; //podstawienie za pole struktury X.y = 5; printf( "1: X.x=%d X.y=%d\n", X.x, X.y ); //kopjujemy bajty pamieci struktury z pod adresu ptX do &X w ilosci sizeof(TYPX) memcpy( &X, ptX, sizeof(TYPX) ); printf( "2: X.x=%d X.y=%d\n", X.x, X.y ); //-------------------------- jak uzywac unie ------------------------------- //podstawiamy zapole unii xy1 w strukturze TYPX w polu x i y //po dwa bajty, podane zakami aski Xun.xy1.x = 'ab'; Xun.xy1.y = '12'; //wyswietla pola unii widziane przez strukture TYPX 2*2 int = 4 bajty printf( " Xun.xy1.x=%d Xun.xy1.y=%d\n", Xun.xy1.x, Xun.xy1.y ); //wyswietla pola unii widziane przez unsigned long dlugosci 4 bajtow printf( " Xun.xy2=%ul\n", Xun.xy2 ); printf( " Xun.tab=%.4s\n", Xun.tab ); //%.4s zmusza printf wyswietlic tylko 4 znaki z tablicy //dlatego tak zrobilem bo tablicy nie zakonczono znakiem 0 //printf by tak dlugo wyswietlal bajty pamieci spod adresu Xun.tab az spotkal by znak 0 //sprobujcie! //UWAGA wazne! //zawsze zwolnij po "sobie" pamiec free( ptX ); //zwalnia pamiec przydzielona pod strukture TYPX }