Teoretyczny problem ze wskaźnikami!

0

Słuchajcie, mam problem ze zrozumieniem pewnego tematu.
Dajmy na to mam tablice int tab[2]. I teraz wiadomo, że nazwa tablicy jest adresem jej pierwszego elementu tzn.
tab= &tab[0]. Czyli można powiedzieć że tab jest typu int const* natomiast jeśli pobieram adres zmiennej tzn robie &tab to w tym momencie mam adres stałęj typu int const* czyli można by to przypisać do zmiennej typu int* * . Czyli dajmy na to int* * t = & tab. Jak chce tak zrobić to kompilator wywala mi cannot convert 'int ()[2]' to 'int **' in initialization. Pytanie brzmi czemu tak jest i co oznacza owe int()[2]. Wiem , że może to nie ma większego sesnsu w jakimś konkretnym zastosowaniu i problem wydaje sie byc zagmatwany ale prosze o pomoc i wyjaśnienie jeśli ktoś móglby.

0

I teraz wiadomo, że nazwa tablicy jest adresem jej pierwszego elementu
Nazwa tablicy jest adresem tej tablicy. Adresem oczywiście początku tej tablicy, bo zawsze "wskaźnik na coś" oznacza "wskaźnik na początek tego czegoś".
A na początku tablicy jest oczywiście pierwszy element tej tablicy, czyli element o indeksie [0].

można powiedzieć że tab jest typu int const*
Skąd ci się nagle const wzięło?

Jak chce tak zrobić to kompilator wywala mi cannot convert 'int (*)[2]' to 'int **' in initialization.
Pokaż kod. Prawdopodobnie wystarczy zwykłe rzutowane.

Pytanie brzmi czemu tak jest i co oznacza owe int(*)[2].
Wskaźnik na tablicę dwóch intów.

0

Owszem samo tab możesz rozumieć jako int * const ( int const * - jest tym samym co: const int * ) z tym że ten adres jest wyliczony podczas kompilacji.
To mniej więcej jak: liczba 3 to int to czemu nie da się zrobić int *x=&3 ?

0

Azarien const mi sie wzięło stąd, że jak tworzymy tablice to miejsce dla niej jest przydzielane w pamięci operacyjnej więc jej nazwa wskazuje właśnie na to miejsce, tzn jego początek jak sam powiedziałeś natomiast nazwe przedstawiam jako z wskaźnik z constem ponieważ np. nie możemy zrobić jakiejś drugiej tablicy i przypisać to miejsce w pamięci do tej pierwszej nazwy, w sensie nie jesteśmy w stanie zmienic wartości wskaźnika któtym jest nazwa tablicy.

0

Drugie pytanie dlaczego &tab jest wskaźnikiem do tablicy dwóch intów. Jak dla mnie jest to adres nazwy tablicy czyli adresu więc powinno być typu int ** ...

4
tomcio6969 napisał(a)

I teraz wiadomo, że nazwa tablicy jest adresem jej pierwszego elementu

Azarien napisał(a)

Nazwa tablicy jest adresem tej tablicy. Adresem oczywiście początku tej tablicy

Nie. Tablica to tablica. Tablica nie jest wskaźnikiem. Tablica może zostać skonwertowana na wskaźnik do jej pierwszego elementu. Jest to jedna ze standardowych konwersji, która może nastąpić niejawnie. Tylko ten fakt jest prawdziwy.

Czyli można powiedzieć że tab jest typu int const*

Nie. tab jest dwuelementową tablicą intów.

&tab to w tym momencie mam adres stałęj typu int const*

Nie. &tab to wskaźnik na dwuelementową tablicę intów. Ten typ jest oznaczony właśnie jako to magiczne int(*)[2].

Czyli dajmy na to int* * t = & tab. Jak chce tak zrobić to kompilator wywala mi cannot convert 'int (*)[2]' to 'int **' in initialization.

Standard mówi o konwersji tablicy na wskaźnik, a nie wskaźnika do tablicy na wskaźnik do wskaźnika.

Drugie pytanie dlaczego &tab jest wskaźnikiem do tablicy dwóch intów.

Operator & daje ci wskaźnik do swojego operandu. Operandem jest tablica dwóch intów. Widzisz tutaj jakąś niejasność?

Dlaczego chcesz konwertować tablicę do int**? Miałoby to sens, gdyby elementami tablicy były wskaźniki na int.

0

Dlaczego chcesz konwertować tablicę do int**? Miałoby to sens, gdyby elementami tablicy były wskaźniki na int.
Na przykład żeby mieć „wskaźnik na nieokreślonych rozmiarów tablicę intów” — choćby do przekazania jako parametr wyjściowy z funkcji. w C++ oczywiście lepiej użyć int*&, ale w C mamy tylko int**.

1

Na przykład żeby mieć „wskaźnik na nieokreślonych rozmiarów tablicę intów”

No to chyba wystarczy int* do przekazania elementów w nieokreślonej ich liczbie.

0

Teraz wszystko jasne. Dzieki;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1