• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dynamiczne rezerwowanie pamieci, wskazniki

Object Storage Arubacloud
+1 głos
636 wizyt
pytanie zadane 12 lutego 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)

Witam chce zarezerwowac dynamicznie 4 szufladkowa tablice i potem wlozyc do niej zmienne jednak cos mi nie dziala, moglby ktos powiedziec o co chodzi ? :)

#include <iostream>

using namespace std;

int main()
{
    int* wsk;
    wsk = new int [4];

    for(int i=0; i>4; i++)
    {
        cin >> wsk[i];
        cout << *wsk;
    }

    delete [] wsk;

    return 0;
}

 

3 odpowiedzi

+2 głosów
odpowiedź 12 lutego 2016 przez draghan VIP (106,230 p.)
wybrane 12 lutego 2016 przez Ziuziek
 
Najlepsza

for(int i=0; i>4; i++) - przeanalizuj dokładnie warunek. ;)

No i wypisujesz w każdym obiegu pętli *wsk, czyli zerowy element tablicy. Należy coś jeszcze zrobić, żeby wypisało każdy z elementów, ale nie podpowiem więcej. ;)

komentarz 12 lutego 2016 przez Ziuziek Mądrala (5,140 p.)

A zrobilem :D

 

#include <iostream>

using namespace std;

int main()
{
    int* wsk;
    wsk = new int [4];

cout << "pierwsza petla" << endl;

    for(int i=0; i<4; i++)
    {
        cin >> wsk[i];
        cout << " " << *(wsk+i);
        cout << endl;
    }

    delete [] wsk;

    cout << "druga petla" << endl;

    wsk = new int [2];

    for(int i=0; i<2; i++)
    {
        cin >> wsk[i];
        cout << " " << *(wsk+i);
        cout << endl;
    }
    delete [] wsk;
    return 0;
}

 

komentarz 12 lutego 2016 przez draghan VIP (106,230 p.)
No i super, masz ode mnie plusa. :)
komentarz 13 lutego 2016 przez jpacanowski VIP (101,940 p.)
A czemu raz wsk[i] a potem *(wsk+i) ?
komentarz 13 lutego 2016 przez draghan VIP (106,230 p.)
Zapewne w imię nauki.
0 głosów
odpowiedź 12 lutego 2016 przez Ziuziek Mądrala (5,140 p.)

jak przesłać tablice z tego kodu do funkcji by wpisywala i wypisywala liczby?

 

#include <iostream>

using namespace std;
void funkcja(int *wsk, int size)
{
    
}

int main()
{
    int* wsk;
    wsk = new int [2];

    delete [] wsk;
    
    
    return 0;
}

 

komentarz 12 lutego 2016 przez Krawiec91 Pasjonat (19,600 p.)
Zmienną, która przechowuje ilość elementów tablicy, albo stałą liczbową tak jak to jest w Twoim programie w tym momencie.
komentarz 12 lutego 2016 przez draghan VIP (106,230 p.)
#include <iostream>
 
using namespace std;
void funkcja(int *wsk, unsigned int Size)
{
    for(int i=0; i < Size; i++)
    {
        cin >> wsk[i];
        cout << " " << *(wsk+i);
        cout << endl;
    }
    cout << "rozmiar tablicy" << Size << endl;
}
 
int main()
{
    int* wsk;
    wsk = new int [2];
    funkcja(wsk, 2);
    delete [] wsk;
 
 
    return 0;
}

 

komentarz 12 lutego 2016 przez Krawiec91 Pasjonat (19,600 p.)
No i oczywiście w samej już funkcji musisz operować nazwą argumentu, a nie stałą liczbową. Wywołasz funkcję z tablicą 5 - elementową jako argument, a w funkcji będzie "na sztywno" rozmiar tablicy - 2.
komentarz 12 lutego 2016 przez Ziuziek Mądrala (5,140 p.)

czyli zeby bylo w pelni full dynamicznie trrzeba tak zrobic: ?

#include <iostream>

using namespace std;
void funkcja(int *wsk, int Size)
{
    for(int i=0; i<2; i++)
    {
        cin >> wsk[i];
        cout << " " << *(wsk+i);
        cout << endl;
    }
cout << "rozmiar tablicy" << Size << endl;
}

int main()
{
    int n = 2;
    int* wsk;
    wsk = new int [n];

    funkcja(wsk, n);
    delete [] wsk;


    return 0;
}

 

komentarz 12 lutego 2016 przez Krawiec91 Pasjonat (19,600 p.)

Żeby było w pełni dynamicznesmiley, to w pętli, która znajduje się w stworzonej przez Ciebie funkcji zamiast stałej (2) musisz używać nazwę argumentu funkcji (Size).

0 głosów
odpowiedź 13 lutego 2016 przez Ziuziek Mądrala (5,140 p.)

Ok a mam pytanie jesli bym tworzyl tablice nie dynamiczna to zrobilbym tak:

#include <iostream>

using namespace std;

int main()
{
    int tab[2];
    int * wsk;
    wsk = &tab[0];

    for(int i=0; i<2; i++)
    {
        cin >> tab[i];
        cout << endl;
        cout << " " << *(wsk+i);
    }
    return 0;
}

 

Czy dobrze interpetuje to? ze tworze tablice, tworze wskaznik

I  musze do wsk przypisac tab[0] zeby wystartowalo i dodac znak ampersanda, i wskaznik zostanie ustawiony na szufladce zerowej a petla do 0 i 1 bedzie wpisywala wartosci?

2. Czy jak dam wsk = &tab;    czemu nie dziala?

komentarz 13 lutego 2016 przez draghan VIP (106,230 p.)

Albo tak, jak masz teraz, albo możesz spróbować tak, zgodnie z regułą, która mówi że nazwa tablicy jest wskaźnikiem do zerowego elementu.:

#include <iostream>
 
using namespace std;
 
int main()
{
    int tab[2];
    int * wsk;
    wsk = tab;
    // ...
}
komentarz 13 lutego 2016 przez Ziuziek Mądrala (5,140 p.)
Ok tylko dlaczego przy

wsk = &tab[0];

musi byc znak ampersanda

a przy

wsk = tab      nie

a  przy

wsk = &tab; nie dziala?
komentarz 13 lutego 2016 przez draghan VIP (106,230 p.)

Zapis tab[0] oznacza wartość z tablicy spod indeksu 0 - więc żeby dostać wskaźnik, trzeba pobrać adres (operatorem &).

Zapis wsk = tab jest możliwy, ponieważ tab jest nazwą tablicy, czyli w myśl tego, co napisałem Ci wyżej - już jest wskaźnikiem (lub raczej - referencją, jako że nie możemy zmienić pokazywanego adresu).

Zapis wsk = &tab oznacza, że chcesz podebrać adres referencji, co nie ma sensu.

komentarz 13 lutego 2016 przez Krawiec91 Pasjonat (19,600 p.)

tab z racji, że jest wskaźnikiem (nazwa tablicy jest jednocześnie wskaźnikiem na pierwszy element tablicy), może być prosto przypisany do innego wskaźnika (wsk).
tab[0] jest "zwykłym" int-em, elementem tablicy, więc żeby jego adres przypisać do wskaźnika, musisz pobrać adres operatorem & i dopiero przypisać do wskaźnika.
W trzecim przypadku do wskaźnika wsk, przypisujesz adres wskaźnika tab (nazwa tablicy, czy wskaźnik na jej pierwszy element), a nie adres na który  tab wskazuje (w tym przypadku, zapewne chodzi o tablicę).

Podobne pytania

0 głosów
1 odpowiedź 87 wizyt
pytanie zadane 10 lutego 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)
0 głosów
1 odpowiedź 493 wizyt
pytanie zadane 11 grudnia 2016 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
5 odpowiedzi 769 wizyt
pytanie zadane 24 czerwca 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)

92,632 zapytań

141,500 odpowiedzi

319,879 komentarzy

62,013 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...