Tablica i wskaźnik

Tablica i wskaźnik
DE
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:4
0
Kopiuj
int main()
{

    int liczba, ile;

    cout<<"Ile liczb: ";
    cin>>ile;

    int *tablica;
    int *wskaznik = tablica;
    tablica = new int [ile];

    for(int i=0; i<ile; i++)
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;

        *tablica = liczba;
        *wskaznik++;

    }

    for(int i=0; i<ile; i++)

    {
        cout<<*tablica<<endl;
        *wskaznik++;

    }


    return 0;
}

Może mi ktoś to wytłumaczyć?? Dlaczego nie działa mi to coś... chce wpisać liczby za pomocą wskaźnika do tablicy, a później pokazać co w niej siedzi... Nie mogę pojąć wskaźników i nie ruszę się z miejsca jeśli mój mózg nie dostanie informacji dlaczego??? :D

PA
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:288
0

Ogólnie nie pisze w C++ ale z tego co wiem to żeby wskazać na coś trzeba użyć znaczka &.
Tutaj

Kopiuj
int *wskaznik = &tablica;

Kolejna sprawa to na pewno ta tablica ma być wskaźnikiem?

I w sumie pytanie bo nie korzystam z wskaźników i nie wiem - czy wskaźnik inta może wskazywać na całą tablicę, czy powinien być na konkretnym elemencie tej tablicy?

edytowany 7x, ostatnio: pavarotti
szweszwe
"z tego co wiem to żeby wskazać na coś trzeba użyć znaczka &" no nie... To co napisałeś się nie skompiluje.
PA
A no tak, chyba żeby skorzystać z z tego wskaźnika np wypisac jego wartość w cout trzeba dać &wskaznik, popraw mnie jeśli się mylę ;p tak jak pisałem, nie korzystam z C++
lion137
Dobrze jest chociaż skompilować, jak się coś wrzuca;)
AK
Elit zwykłe zasady nie dotyczą ...
MY
  • Rejestracja:ponad 9 lat
  • Ostatnio:8 dni
  • Postów:1082
1

Ależ tu nic nie jest dobrze. Po pierwsze nie dałeś kodu który się kompiluje, więc nawet jak coś nie da się sprawdzić co jest nie tak...

Więc zacznijmy od początku.

Brak include'ow:

Kopiuj
#include <iostream>

Następnie, zdecyduj czy chcesz używać pełnych nazw std::count, czy dodasz linijkę:

Kopiuj
using namespace std;

Dopiero wtedy zaczyna się kompilować.

Zatem przejdźmy do błędów jakie masz w kodzie:

Kopiuj
    int *tablica;
    int *wskaznik = tablica;
    tablica = new int [ile];

Masz użycie niezainicjowanego wskaźnika tablica podstawiając go pod wskaźnik wskaznik. Następnie dopiero alokujesz pamięć za pomocą new. Powinno być odwrotnie.
Aby się przed tym zabezpieczyć warto wskaźniki inicjować w ten sposób:

Kopiuj
    int *tablica = NULL;
    int *wskaznik = NULL;

W tym fragmencie kodu jakim celu zwiększasz wskaźnik nie robiąc zupełnie nic z nim?

Kopiuj
    for(int i=0; i<ile; i++)
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;

        *tablica = liczba;
        *wskaznik++;

    }

Tutaj natomiast popatrz, że po przebiegu pętli wcześniejszej wskaźnik ustawiony jest na pierwszy element poza tablicą, więc dalsze jego zwiększanie powoduje wypisywanie danych spoza tablicy, czyli śmieci.

Kopiuj

    for(int i=0; i<ile; i++)

    {
        cout<<*tablica<<endl;
        *wskaznik++;

    }

Na koniec nie zwalniasz pamięci wcześniej przydzielonej.

PS. na forum programistycznym określenie "nie działa" nie jest zbyt fajnym opisem problemu ;)

AK
Kolega to rozumie, bo "napisał" program pod Qt ;)
MY
@AnyKtokolwiek to zmienia postać rzeczy. Swoja drogą nie wiedziałem, że w Qt będzie ok :)
DE
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:4
0

Oj nie wkleiłem całości chyba już przez długie godziny siedzenia... widze ze biblioteki brakuje i standardu przestrzeni nazw.. no i zwolnienia zasobu przez delete utworzonej tablicy...

Przepraszam za te błędy... nie wiem jak to wkleiłem.

pavarotti

Ampersant chyba się stosuje dla zmiennych i ewentualnie adresów, w sumie na takim poziomie jestem, że tyle wiem od Pana Mirosława Z.

Ok..

Rozumiem.. faktycznie chyba przerwę muszę zrobić..

Kopiuj
  for(int i=0; i<ile; i++)
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;

        *tablica = liczba;
        *wskaznik++;

    }

Tutaj chciałem wpisać wartość zmiennej liczba do szufladki 0 tablicy a następnie wskaźnikiem przesunąć się w tablicy do kolejnej szufladki...
Popróbuje według sugestii i zobaczę jak to będzie szło... Dzięki za rady i na przyszłość uważniej prześledzę kod, który wlepiam..

edytowany 1x, ostatnio: dernis
szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:4 dni
  • Lokalizacja:Kraków
  • Postów:1694
2

Te wskaźniki nie są jakoś cudownie połączone. To że w skazują na to samo miejsce, nie znaczy, że jak przesuniesz jeden to przesuwasz drugi. Po co w ogóle 2 wskaźniki tam?

Ogólnie na temat tych wskaźników:
Wyobraź sobie, że masz 2 wskaźniki (1 i 2). Wskazujesz oba na element 0 tablicy i mówisz, przypisz tę liczbę tam gdzie wskazuje wskaźnik 1. Potem przesuwasz wskaźnik 2 na kolejną pozycję i mówisz do kogoś, przypisz mi kolejną liczbę tam gdzie wskazuje wskaźnik 1. Następnie znowu przesuwasz wskaźnik 2 i przypisujesz kolejną liczbę tam gdzie wskazuje wskaźnik 1 itd.

DE
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:4
0
Kopiuj
#include <iostream>

using namespace std;

int main()
{

    int liczba, ile;


    cout<<"Ile liczb: ";
    cin>>ile;

    int *tablica;
    tablica = new int [ile];
    int *wskaznik = tablica;


    for(int i=0; i<ile; i++)
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;

        *wskaznik = liczba;
        wskaznik++;

    }

    for(int i=0; i<ile; i++)

    {
        cout<<tablica[i]<<endl;

    }
       delete [] tablica;

    return 0;
}


a czy to jest ok??
chodzi o to żeby cofnąć się do zerowej szuflaki w drugiej pętli i wyświetlić jej zawartość... wiem że to jest trochę bez sensu ale chce przerobić wszystkie opcje..

edytowany 1x, ostatnio: dernis
Azarien
dodaj jeszcze linijkę delete[] tablica; przed return 0.
MY
  • Rejestracja:ponad 9 lat
  • Ostatnio:8 dni
  • Postów:1082
0
dernis napisał(a):

Oj nie wkleiłem całości chyba już przez długie godziny siedzenia... widze ze biblioteki brakuje i standardu przestrzeni nazw.. no i zwolnienia zasobu przez delete utworzonej tablicy...

Przepraszam za te błędy... nie wiem jak to wkleiłem.

No właśnie ;) Na przyszłość mała rada, wklejaj cały kod który kompilujesz. Wtedy będziesz miał 100% pewność, że pytający wie o co chodzi ;)

dernis napisał(a):

chodzi o to żeby cofnąć się do zerowej szuflaki w drugiej pętli i wyświetlić jej zawartość... wiem że to jest trochę bez sensu ale chce przerobić wszystkie opcje..

To po prostu wskaźnik na aktualny element tablicy zapisuj w zmiennej pomocniczej, a przed pętlą ustawiają tą zmienną na pierwszy element tablicy:

Kopiuj
  wskaznik = tablica;
  for(int i=0; i<ile; i++)
  {
    cout<<*wskaznik<<endl;
    wskaznik++;
  }

W ten sposób osiągniesz dokładnie to czego chcesz.

mpaw
  • Rejestracja:około 9 lat
  • Ostatnio:14 dni
  • Postów:530
2

Wskaźnik, to zwykła zmienna, przechowująca adres. Ma ona jednak tą dodatkową cechę, że można pobierać jej wartość (adres), bądź daną, zapisaną pod tym adresem. Jak piszesz:

Kopiuj
int * wsk1;
int * wsk2;

wsk1 = wsk2;
wsk2 = new int [10];

linijka wsk1 = wsk2; powoduje skopiowanie wartości (adresu) zmiennej wsk2 do wsk1. W kolejnej linijce kopiujesz wartość (adres) tablicy na 10 intów, do zmiennej wsk2. W wsk1 cały czas masz starą wartość (adres) [na jaki wskazywał] wsk2. Coś takiego:

Kopiuj
int a = 10;
int b = 20;

b = a;
a = 100;

po napisaniu a = 100;, b nadal ma wartość 10. Nie wiem czy jasno to wytłumaczyłem.

M.


That's all folks ;)
edytowany 4x, ostatnio: mpaw
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)