Ostatnio trafiłem na przydatną konstrukcję: sizeof buffer (bez nawiasów!).

Dzięki temu dowiedziałem się, że operator sizeof ma tak naprawdę dwa zastosowania:

  • sizeof(int) – zwróci rozmiar typu int w bajtach
  • sizeof buffer – zwróci rozmiar tablicy w bajtach (pod warunkiem, że jest to tablica statyczna)

Przykład

int main()
{
	const char *strings[] = {"ala", "ma", "kota"};
	cout << sizeof strings;

	return 0;
}

zwróci liczbę 12 (bajtów), czyli rozmiar trzech wskaźników *char. Zgodne to jest z prawdą – nasza tablica rzeczywiście zawiera trzy wskaźniki.  Możemy stąd bardzo łatwo wyciągnąć  ilość elementów tablicy – wystarczy podzielić przez rozmiar pojedynczego elementu!

Zastosowanie

Można sobie np. uprościć iterowanie po tablicy statycznej:

int main()
{
	const char *strings[] = {"ala", "ma", "kota", "\n"};
	for (int i = 0; i < sizeof strings / sizeof strings[0]; i++)
		cout << strings[i] << " ";

	return 0;
}

W efekcie dostaniemy na konsolę:

ala ma kota
 Press Enter to continue!

Dzięki temu nie musimy deklarować stałej określającej rozmiar tablicy, np. NUM_STRINGS.

Podsumowanie

Na koniec powtarzam, że ta konstrukcja działa tylko dla tablic alokowanych statycznie. Dla tablicy dynamicznej, sizeof buffer zwróci to samo, co sizeof(buffer) – czyli rozmiar pojedynczego wskaźnika w bajtach.

Related Posts: