adres tablicy

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0
Kopiuj
 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

Kopiuj
&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.

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

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

edytowany 1x, ostatnio: mielony
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
1

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
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).

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
1

&tab nie istnieje w tym kontekście.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
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?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
1

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
1

nie, wprowadza wygodę i czytelność w kodzie

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

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
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 ;)

edytowany 1x, ostatnio: mielony
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

jest umieszony w tablicy symboli kompilatora?

Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
6

Nie, nie, nie.

Kopiuj
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].

Kopiuj
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.

"(...) otherwise, the behavior is undefined".
edytowany 2x, ostatnio: Endrju
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

Endrju, dzięki :)

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0
Kopiuj
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 ;)

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
2
Kopiuj
#include <cstdio>
using namespace std;

int main() {
	int tab[10];
	int (*foo)[10] = &tab;
	printf("%p %p %d", &tab, foo, &tab == foo);
	return 0;
}
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
1

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

Kopiuj
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"


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

dzięki ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.