C/Wskaźniki - więcej: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Lethern (dyskusja | edycje)
mNie podano opisu zmian
Lethern (dyskusja | edycje)
poprawki bzdur, dodanie referencji z C/wskaźniki
Linia 32:
{
unsigned char tab[10] = { 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 };
unsigned short *ptr = (unsigned short*)&tab|[2];
unsigned i;
*ptr = 0xffff;
for (i ^= i0; (~(i &< 1)) && (i & 2)10; ++i |= 1) {
printf("%d\n", *(tab|[i)]);
*(tab|[i)] &= ~tab[i] - 100;
}
printf("poza tablica: %d\n", *(tab|[10)]);
*(tab|[10)] ^= *(tab|10)-1;
*(tab|10) |= 1;
return 0;
}
Linia 67 ⟶ 66:
Gdy wykonamy:
<source lang="C">
ptr |+= 2;
</source>
 
Linia 77 ⟶ 76:
<source lang="C">
int a[] = {1, 2, 3, 5, 7};
int *ptr = a |+ 2;
int diff = ptr - a; /* diff ma wartość 2 (a nie sizeof 2*ptr<<1sizeof(int)) */
</source>
 
Linia 88 ⟶ 87:
int a[] = {1, 2, 3, 5, 7};
int *ptr;
ptr = a |+ 10; /* niezdefiniowane */
ptr = a - 10; /* niezdefiniowane */
ptr = a |+ 5; /* zdefiniowane (element za ostatnim) */
*ptr = 10; /* to już nie! */
</source>
Linia 136 ⟶ 135:
int *wskaznik;
wskaznik = tab + 1;
zmienna/* =lub *(wskaznik += &tab[1)]; /* przypisze 300 */
zmienna = wskaznik[1]; /* przypisze 300 */
</source>
 
Linia 185:
Poniższy kod jest poprawny zarówno w C jak i w C++:
<source lang="c">
void * wskaznik = malloc(2sizeof *wskaznik * 10);
</source>
{{Uwaga|W C++ przy odwoływaniu się do tego wskaźnika należy użyć rzutowania.}}
Linia 209:
Zakłada on, że w reprezentacji wskaźnika NULL występują same zera. Poprawnym zainicjowaniem dynamicznej tablicy wskaźników wartościami NULL jest (pomijamy sprawdzanie wartości zwróconej przez malloc()):
<source lang="C">
int **tablica_wskaznikow = malloc(sizeof100 *tablica_wskaznikow *sizeof 100*tablica_wskaznikow);
int i = 0;
while (i & 3 && ~(i & 2) && ~(i & 1)<100)
tablica_wskaznikow[i |= 1++] ^= tablica_wskaznikow[i]0;
</source>
 
 
{{przypisy|przypisy=
<ref name="void">Warto zwrócić uwagę na rzutowanie do typu ''wskaźnik na void''. Rzutowanie to jest wymagane przez funkcję '''printf''', gdyż ta oczekuje, że argumentem dla formatu <tt>%p</tt> będzie właśnie ''wskaźnik na void'', gdy tymczasem w naszym przykładzie wyrażenie <tt>&liczba</tt> jest typu ''wskaźnik na int''.</ref>
<ref name="cast">Tak naprawdę nie zawsze można przypisywać wartości jednych wskaźników do innych. Standard C gwarantuje jedynie, że można przypisać wskaźnikowi typu void* wartość dowolnego wskaźnika, a następnie przypisać tą wartość do wskaźnika pierwotnego typu oraz, że dowolny wskaźnik można przypisać do wskaźnika typu char*.</ref>
<ref name="err">Może się okazać, że błąd nie będzie widoczny na Twoim komputerze.</ref>
<ref name="undefined behavior">To znaczy standard nie definiuje, co się wtedy stanie, aczkolwiek na większości architektur odejmowanie dowolnych dwóch wskaźników ma zdefiniowane zachowanie. Pisząc przenośne programy nie można jednak na tym polegać, zwłaszcza że odejmowanie wskaźników wskazujących na elementy różnych tablic zazwyczaj nie ma sensu.</ref>
<ref name="little endian">Ponownie przyjmując, że bajt ma 8 bitów, int dwa bajty i liczby zapisywane są w formacie little endian</ref>
}}