C (język programowania): Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
→‎Krytyka: drobne merytoryczne
m →‎Typy pochodne: arytmetyka wskaźników; przeredagowanie zdania o tym, że nazwa tablicy to adres zerowego elementu
Linia 283:
 
=== Typy pochodne ===
Z niezerowej liczby obiektów tego samego typu można stworzyć [[Tablica (informatyka)|tablicę]]{{odn|ISO/IEC9899:2017|s=32}}. Jej elementy są ułożone w pamięci komputera po kolei i bez żadnych przerw{{odn|Kernighan|Ritchie|2002|s=136}}, a dostęp do nich można uzyskać za pomocą składni <code>''tablica''[''indeks'']</code>, gdzie indeksy rozpoczynają się od zera{{odn|Kernighan|Ritchie|2002|s=45}}{{#tag:ref|Operator indeksowania tablic <code>tab[i]</code> jest z definicji równoważny wyrażeniu <code>*(tab+i)</code>, a zatem indeksowanie jest przemienne. Konsekwencją tego faktu jest że zapisy <code>tab[i]</code> oraz <code>i[tab]</code> są równoważne i odnoszą się do i-tego elementu tablicy <code>tab</code>{{odn|Kernighan|Ritchie|2002|s=288}}.|group=uwaga}}. Do raz utworzonej zmiennej typu tablicowego nie jest możliwe [[przypisanie]] innej tablicy{{odn|Kernighan|Ritchie|2002|s=138}}. NazwaKiedy nazwa tablicy stanowizostanie jednocześnieużyta [[Adresw pamięci|adres]]wyrażeniu, dokonuje się jej niejawna konwersja na wskaźnik do zerowego elementu tablicy. Wskaźnik ten nie może być użyty w charakterze l-wartości{{odn|Kernighan|RitchieOdn|2002ISO/IEC9899:2017|s=14140}}.
 
Do przechowywania adresu obiektu określonego typu służą [[Wskaźnik (typ danych)|wskaźniki]]{{odn|Kernighan|Ritchie|2002|s=130–131}}. Dozwolone jest wykonywanie na nich niektórych operacji arytmetycznych. Dowolny wskaźnik można przyrównać do zera (oznaczającego [[literał pusty]], zapisywany też jako <code>NULL</code>){{odn|Kernighan|Ritchie|2002|s=141–143}}. Porównywanie oraz odejmowanie dwóch wskaźników jest dozwolonezdefiniowane wyłącznie wtedy, kiedy dotyczą one tej samej tablicy lub – wyłącznie w przypadku porównywania – tego samego obiektu złożonego{{Odn|ISO/IEC9899:2017|s=67, 69}}. Do wartości wskaźnika można również dodać lub odjąć dowolną liczbę całkowitą. Zabronione jest wykonywanie innych działań, takich jak mnożenie czy dzielenie{{odn|Kernighan|Ritchie|2002|s=141–143}}. W działaniach arytmetycznych, w których biorą udział liczby całkowite oraz wskaźniki, liczba jest traktowana jako liczba elementów tablicy odpowiedniego typu, a nie liczba bajtów<ref group="uwaga">Oznacza to, że dodanie liczby <code>n</code> do wskaźnika <code>ptr</code> na typ <code>T</code> zwróci nowy wskaźnik o adresie <code>ptr + n * sizeof(T)</code>. Podobnie, odjęcie od siebie dwóch wskaźników, zwróci różnicę indeksów tabeli, odpowiadających wskazywanym elementom.</ref>{{Odn|ISO/IEC9899:2017|s=67}}.
 
Jedna lub kilka zmiennych może tworzyć [[Struktura (programowanie)|strukturę]]. W przeciwieństwie do tablic, takie składowe mogą być różnych typów, a poszczególne pola rozróżnia się z użyciem ich identyfikatorów{{odn|Kernighan|Ritchie|2002|s=173–175}}. Każda struktura stanowi odrębną [[przestrzeń nazw]], toteż pole o tej samej nazwie może występować w kilku strukturach{{odn|Kernighan|Ritchie|2002|s=174}}{{odn|ISO/IEC9899:2017|s=29}}. Zagnieżdżanie struktur jest dozwolone – składowe mogą również być strukturami. Standard ISO C zabrania natomiast [[Rekurencja|rekursywnego]] zagnieżdżania struktury samej w sobie. Mimo to struktura może zawierać wskaźnik na inną strukturę tego samego typu{{odn|ISO/IEC9899:2017|s=81}}. Zarówno przypisywanie do zmiennej typu strukturalnego nowej wartości, jak i przekazywanie jej jako argument oraz zwracanie z funkcji są dopuszczalnymi operacjami{{odn|Kernighan|Ritchie|2002|s=175–176}}.