Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wskaźniki a tablice? Wychodzą mi jakieś sprzeczności!

Ostatnio zmodyfikowano 2010-11-11 12:05
Autor Wiadomość
malan
» 2010-11-05 00:24:30
Zgodzisz się ze mną że tab jest wskaźnikiem do pierwszego elementu tablicy.
Parę godzin temu powiedziałbym, że tak, ale teraz już się z Tobą nie zgodzę. Teoretycznie nazwa tablicy nie jest adresem jej pierwszego elementu, ponieważ nie ma nic o tym w standardzie. Praktycznie... to funkcjonuje, ale skoro standard tego nie opisuje...

Wskaźnik, jak każda zmienna ma swój adres.
Tak.
C/C++
#include <iostream>
int main()
{
    int array[ 3 ] = { 1, 2, 69 };
    int * foo = array;
   
    std::cout << "Adres tablicy: " << array << std::endl;
    std::cout << "Adres, ktory przechowuje wskaznik: " << foo << std::endl;
    std::cout << "Adres wskaznika, ktory przechowuje adres pierwszego elementu: " <<& foo; //Adres wskaźnika
   
    return 0;
}

(...)Jaki jest ten adres?
Spójrzmy na to, co napisałeś trochę inaczej. Zamiast:
Zgodzisz się ze mną że tab jest wskaźnikiem do pierwszego elementu tablicy
...zróbmy mały replace:
Zgodzisz się ze mną że tab jest adresem do pierwszego elementu tablicy
Brzmi trochę inaczej, nie? Widzisz teraz o co Ty pytasz?
Wskaźnik i adres w tym wypadku znaczą to samo. Tam nie ma nigdzie żadnego wskaźnika... Tzn. nie ma zmiennej przechowującej adres pierwszego elementu. Tam jest po prostu ten cholerny pierwszy element.
Gdyby było np. tak:
C/C++
#include <iostream>
int main()
{
    int array[ 3 ] = { 1, 2, 69 };
    int * foo = array;
    //int* foo = &array[0];
   
    //Tobie cały czas chodzi o to:
    std::cout <<& foo;
    //...czyli o adres wskaźnika na n-ty element tablicy.
   
    return 0;
}

C/C++
// Adres pierwszego elementu, to:
& array[ 0 ]
//Adres drugiego elementu, to:
& array[ 1 ]
//...itd.

Poprawcie mnie jeśli się mylę.
P-23558
marek
Temat założony przez niniejszego użytkownika
» 2010-11-05 09:06:44
Malan
Sprawdziłem, foo jest wskaźnikiem na array i ma inny adres niż array. Czyli jest lege artis.
Ale array mimo wszystko jest też wskaźnikiem. Możesz to sprawdzić że *array = 1, czyli wskazuje na pierwszy element tablicy. Z tym że dalej z array'em wychodzą głupoty, jeżeli będę to traktować jako typowy wskaźnik. Okazuje się, że adres tego wskaźnika jest taki sam jak adres pierwszego elementu tablicy. Czyli pod tym samym adresem np. 1000 jest 1 i adres tego wskaźnika czyli 1000.
Z foo jest już prawidłowo, tzn adres wskaźnika foo jest inny niż adres 1. ALE OPERACJĄ "int * foo = array;" SZTUCZNIE ZOSTAł STWORZONY INNY WSKAŹNIK TEŻ WSKAZUJĄCY NA 1. Powstało takie dziwadło w którym 2 wskaźniki pokazują ten sam element. Dziwadło nie wiadomo do czego porzebne, ale dopuszczalne.
 

Chyba znalazłem na to odpowiedź dlaczego powstaje problem ze znalezieniem adresu wskażnika tab.
W przypadku zwykłego wskaźnika, tzn wskazującego na pojedynczą zmienną, a nie na tablicę, wskaźnik jest umieszczony w jakiejś komórce pamięci operacyjnej.Dlatego łatwo jest znaleźć adres tej komórki.
Natomiast w przypadku wskaźnika wskazującego na tablicę, wskaźnik umieszczony jest w specjalnym rejestrze procesora, w tzw. rejestrze indeksowym. W odróżnieniu od zwykłej pamięci, rejestr ten jest wyspecjalizowany w dokonywaniu obliczeń, bez konieczności korzystania z ALU, tj specjalnej części procesora dokonującej obliczeń. Dzięki temu pobieranie zmiennej z tablicy trwa prawie tak szybko jak pobieranie pojedynczej zmiennej. 

W "prawdziwych" procesorach tzn. Pentium, AMD itd., rejestr ten nie należy do pamięci operacyjnej. Stąd problem że znalezieniem adresu wskaźnika.
W "nieprawdziwych" procesorach, np w mikrokontrolerach (pralki, domofony, karty bankomatowe itd.) wskaźnik może być cześcią  pamięci operacyjnej. Wtedy znalazłbym bez trudu ten adres.
Teraz wiem na 90% dlaczego nie mogłem znaleźć adresu wskaźnika wskazującego na tablicę.
Czy ktoś to potwierdzi?
P-23561
malan
» 2010-11-06 00:35:06
Ręce opadają...

Sprawdziłem, foo jest wskaźnikiem na array i ma inny adres niż array.
foo jest wskaźnikiem na pierwszy element tablicy array. Adres tego wskaźnika (napiszę raz jeszcze: adres wskaźnika) jest inny niż adres pierwszego elementu w tablicy. Zgadza się. Tak powinno być. Wyobrażasz sobie wartości dwóch (różnych) zmiennych zapisane w jednej komórce pamięci?

Ale array mimo wszystko jest też wskaźnikiem.
Eh. array nie jest wskaźnikiem. To, że przyjęło się, iż nazwa tablicy jest równoznaczna z adresem jej pierwszego elementu nie oznacza, że array to wskaźnik. array to tablica typu int i już.

Możesz to sprawdzić że *array = 1, czyli wskazuje na pierwszy element tablicy.
Ponieważ zachodzi niejawna konwersja.

Z tym że dalej z array'em wychodzą głupoty, jeżeli będę to traktować jako typowy wskaźnik.
Ponieważ to nie jest wskaźnik.

ALE OPERACJĄ "int * foo = array;" SZTUCZNIE ZOSTAł STWORZONY INNY WSKAŹNIK TEŻ WSKAZUJĄCY NA 1. Powstało takie dziwadło w którym 2 wskaźniki pokazują ten sam element.
Ja w moim kodzie widzę tylko jeden wskaźnik.
(...)w którym 2 wskaźniki pokazują ten sam element(...)
Jeden wskaźnik typu int wskazuje na pierwszy element tablicy array.

Starałem się zrozumieć Twój tok myślenia, ale nie byłem w stanie. Dlaczego Ty sobie wbiłeś na banie, że tablica jest wskaźnikiem?
Aha...- miłej lektury: Czy tablica to wskaźnik?
P-23592
marek
Temat założony przez niniejszego użytkownika
» 2010-11-06 13:54:18
Zgoda , array nie jest wskaźnikiem tylko adresem pierwszego elementu tablicy, tak jak w wyrażeniach
C/C++
int * wsk_na_x;
wsk_na_x = & x
adres zmiennej x, czyli &x, nie jest wskaźnikiem, tylko zawartością wskaźnika, czyli zawartością komórki pamięci o nazwie (adresie) wsk_na_x.
Problem pojawił się, gdyż w żaden sposób nie mogłem znaleźć komórki pamięci która zawierałaby adres array.
I nie miałem prawa znaleźć adresu tej komórki, bo kompilator adres array nie umieszcza w komórce pamięci operacyjnej, tylko w jakimś rejestrze indeksowym procesora.

Inna rzecz że znam 2 książki w których autor mówi wyraźnie "NAZWA TABLICY JEST WSKAŹNIKIEM"!
np. książeczka z cyklu Komputer Świat "Szkoła pisania  programów od podstaw Programowanie w C++" str. 108.
albo Wojtuszkiewicz "Programowanie strukturalne i obiektowe" PWN 2009 tom 1 str 197.
Trzeba powyższe traktować jako skrót myślowy 
"NAZWA TABLICY JEST WSKAŹNIKIEM" = "NAZWA TABLICY JEST ZAWARTOŚCIĄ WSKAŹNIKA"

Podsumowując, i chyba zgodzisz się ze mną, że poniższe zdanie jest prawdziwe.
"Nazwa tablicy, czyli adres pierwszego elementu tablicy, jest zawsze umieszczona w komórce pamięci, ktora jest wskaźnikiem."

A gdzie kompilator umieścił komórkę, to już jego sprawa. Domyślam się że rolę tej komórki pełni rejestr indeksowy procesora.
 

P-23603
malan
» 2010-11-07 00:26:54
Podsumowując, i chyba zgodzisz się ze mną, że poniższe zdanie jest prawdziwe.
"Nazwa tablicy, czyli adres pierwszego elementu tablicy, jest zawsze umieszczona w komórce pamięci, ktora jest wskaźnikiem."
Nie :].

Nazwa tablicy, czyli(...)
Nazwa tablicy, to nazwa tablicy.

(...)czyli adres pierwszego elementu tablicy(...)
Do adresu pierwszego elementu tablicy możemy się odwołać poprzez jej nazwę i to tylko dzięki niejawnej konwersji.

jest zawsze umieszczona w komórce pamięci, ktora jest wskaźnikiem
Totalna bzdura. Jak komórka pamięci może być wskaźnikiem?!

http://portalwiedzy.onet.pl/13826,,,,komorka_pamieci,haslo.html
Komórka pamięci, w informatyce, elementarny rejestr pamięci służący do zapamiętania jednego bajtu lub jednego słowa danych. Komórka pamięci ma przypisany numer porządkowy, czyli adres, umożliwiający jej jednoznaczną identyfikację w celu odczytania lub zapisania (zmiany) zawartości. Operacje na zawartości komórki pamięci są treścią odpowiednich rozkazów.

Tak w ogóle, to po co Ci adres tablicy?
P-23635
marek
Temat założony przez niniejszego użytkownika
» 2010-11-07 10:22:33
Dzięki Malan
Przekonałeś mnie do tego że nazwa tablicy jest adresem a nie wskaźnikem.Chociaż wbrew literaturze którą Ci podałem. Dzięki temu wątpliwości wynikające z tego postu zostały rozwiane.
"Nazwa tablicy, czyli adres pierwszego elementu tablicy, jest zawsze umieszczona w komórce pamięci, która jest wskaźnikiem."
Prawda, prawda, prawda!
Nazwa tablicy, to nazwa tablicy.
Kot to jest kot a Pałac Kultury to Pałac Kultury.Powiedziałeś prawdę, z którą się zgadzam i nic z tego nie wynika.
Totalna bzdura. Jak komórka pamięci może być wskaźnikiem?!
Komórka pamięci może być wskaźnikiem, tak jak komórka pamięci może być zmienną. Być może jest to skrót myślowy. Rzeczywiście, dla elektronika, komórka pamięci to zbiór przerzutników, a nie jakiś wskaźnik. A dla informatyka wskaźnik to jest komórka, która ma adres ( czyli nazwę wskaźnika) i stan tych przerzutników tworzy adres wskazujący na jakąś zmienną.
Tak w ogóle, to po co Ci adres tablicy?
Adres tablicy potrzebny jest tylko kompilatorowi. Ale dzięki tej dyskusji, wiem że nazwa tablicy jest adresem a nie wskaźnikiem. I nie wychodzą mi takie sprzeczności że we wskaźniku jest adres tego wskaźnika, czyli wskaźnik pokazuje sam na siebie.
Każdy moze sprawdzić że
array == &array
I to jest oczywistą oczywistością przy założeniu że array jest adresem, a nie wskaźnikiem.
Natomiast z założenia że array jest wskaźnikiem wynikałoby, że że zawartością wskaźnika array ( o adresie array) jest jest adres array. Czyli wskaźnik wskazywałby sam na siebie.
 
P-23640
DejaVu
» 2010-11-08 01:10:00
Widzę, że drążysz nurtujące Ciebie tematy :) masz predyspozycje do tego by zostać w przyszłości dobrym programistą :)
P-23695
malan
» 2010-11-09 19:14:02
Totalna bzdura. Jak komórka pamięci może być wskaźnikiem?!
Komórka pamięci może być wskaźnikiem, tak jak komórka pamięci może być zmienną. Być może jest to skrót myślowy. Rzeczywiście, dla elektronika, komórka pamięci to zbiór przerzutników, a nie jakiś wskaźnik. A dla informatyka wskaźnik to jest komórka, która ma adres ( czyli nazwę wskaźnika) i stan tych przerzutników tworzy adres wskazujący na jakąś zmienną.
Dla mojej babci komórka pamięci to "skrytka" pod schodami, w której trzyma się słoiki z powidłami... Już nie kombinuj ;p.

array == &array
I to jest oczywistą oczywistością przy założeniu że array jest adresem, a nie wskaźnikiem.
array to nazwa tablicy...

Przeczytaj raz jeszcze, dokładnie wszystkie posty, wyciągnij w nioski, może napisz jakieś podsumowanie :).
Aha, i o tym zapomnij:
Nie wiem dlaczego &Tab=Tab?
Ponieważ (uogólniając), to zapis &Tab jest równoznaczny z zapisem Tab. Jednak trzeba przy tym zaznaczyć, iż przy zapisie Tab zachodzi niejawna konwersja do *Tab.
Amen.
Dlaczego? Sam sobie odpowiedz :).
P-23764
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona