adres tablicy

0
 int k[2] = { 1,2 };
 cout << k << endl <<&k << endl; 

Cześć :)
Jak wiadomo, zmienna k jest wskaźnikiem na pierwszy element tablicy. Wyłuksanie tego adresu daje nam adres tablicy. Dlaczego

&k = k ?

Jeżeli k jest wskaźnikiem to jest on zapisany gdzieś w pamięci i pobranie jego adresu (&k) powinno zwracać jego adres.

int *k; 
cout << k << endl << &k; 

W tym kodzie jest tak, jak się tego spodziewam.

1

Samo k oraz &k[0] - to adres tablicy w pamięci.

0

int tab[2];
Dobrze,a czym jest w takim razie &tab?
Czy z tego wynika, że tab nie jest wskaźnikiem w sensie takim, że nie jest zmienną? No bo przecież, jeżeli k byłoby zmienną, która jest wskaźnikiem to musi mieć swój adres ( swoje miejsce w pamięci).

1

&tab nie istnieje w tym kontekście.

0

czyli rozumiem, że tak naprawdę tab nie jest wskaźnikiem w takim sensie jak podałem?
W takim razie &tab jest tylko udogodnieniem kompilatora, które w mojej opinii nie ma sensu, jeżeli mówimy o tab jako o wskaźniku na pierwszy element.
Nie sądzisz, że wprowadza to zamęt?

1

tab - jest konwertowany (nawet niejawnie) na stały wskaźnik.
Nie wprowadza to zamętu, jest tak jak samo jak z adresem funkcji.

1

nie, wprowadza wygodę i czytelność w kodzie

&tab[0] to wskaźnik, "tab" to jego alias

0

to wiele wyjaśnia.
W takim razie tab nie jest wskaźnikiem, a jedynie inną nazwą na wskaźnik, czyż nie?

tab - jest konwertowany (nawet niejawnie) na stały wskaźnik.

Jeżeli jest wskaźnikiem, to gdzie jest w pamięci? podaj jego adres ;)

0

Stały wskaźnik nie musi mieć adresu - jest stały - nie do zmiany.

0

jest umieszony w tablicy symboli kompilatora?

6

Nie, nie, nie.

int array[10];

array to nazwa tablicy. array jest typu int[10] to nie jest wskaźnik. array może być skonwertowany na wskaźnik do pierwszego elementu tablicy czyli na &array[0].

int array[10] = {};

std::cout << std::boolalpha
          << std::is_array<decltype(array)>::value << '\n'
          << std::is_pointer<decltype(array)>::value << '\n'
          << std::is_pointer<decltype(&array)>::value << '\n'
          << std::is_pointer<decltype(&(*array))>::value << '\n'
          << std::is_same<decltype(&array), decltype(&array[0])>::value << '\n'
          << std::is_same<decltype(&(*array)), decltype(&array[0])>::value << '\n'
          << (array == &array[0]);

Przeanalizuj: http://ideone.com/j2RUky

  1. array jest tablicą.
  2. array nie jest wskaźnikiem.
  3. &array jest wskaźnikiem
  4. &(*array) też jest wskaźnikiem
  5. &array i &array[0] to nie są te same wskaźniki! (Ten pierwszy to int (*)[10] a drugi int *).
  6. Za to &(*array) oraz &array[0] to te same wskaźniki (int *).
  7. Ponieważ w tym wyrażeniu porównujemy wskaźniki, array jest niejawnie konwertowane na wskaźnik do pierwszego elementu.
0

Endrju, dzięki :)

0
int array[10];

Ponieważ &array jest wskaźnikiem. I to takiego typu:

  1. &array i &array[0] to nie są te same wskaźniki! (Ten pierwszy to int (*)[10] a drugi int *).

W takim razie, czy ja mogę stworzyć wskaźnik takiego typu?
Tzn. Chciałbym np. coś w stylu:
int* mk[10] = &array;
Ale to rzuca błędem, a zastosowałem typ podany przez Ciebie :)
Mam nadzieję, że widać w czym błąd ;)

2
#include <cstdio>
using namespace std;

int main() {
	int tab[10];
	int (*foo)[10] = &tab;
	printf("%p %p %d", &tab, foo, &tab == foo);
	return 0;
}
1

Priorytet operatorów. Ten nawias jest tam nie bez powodu. Powinno być:

int (*mk)[10] = &array;

W tym pomaga cdecl:

int (*mk)[10]: "declare mk as pointer to array 10 of int"
int* mk[10]: "declare mk as array 10 of pointer to int"

0

dzięki ;)

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