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

znak ampersand

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
2,995 wizyt
pytanie zadane 12 grudnia 2016 w C i C++ przez qlucha Obywatel (1,790 p.)
tablica=new int [ile];
     int *wskaznik=tablica;

w fragmencie kodu powyrzej nie zastosowano znaku ampersand & dla wskaznika;

i kod jest poprawny ,

natomiast definujac wskazniki zapisujemy kod  w postaci

int liczba;

int*wskaznik;

wskaznk=&liczba;

I tu już musimy zastosowac znak ampersand,  przyznam ze pytanie na pewno jest proste ,

ale potrzebowałbym utrwalić sobie na 100% kiedy używamy & dla wskaznika a kiedy nie .dzieki za odpowiedz.

2 odpowiedzi

+3 głosów
odpowiedź 12 grudnia 2016 przez L33TT12 Gaduła (3,950 p.)

Nazwa tablicy domyślnie przechowuje adres na pierwszy jej element, natomiast nazwa typu prostego (int) wartość, dlatego trzeba użyć znaku & by pobrać adres wartości.
 

int * tablica = new int[3]{ 1,2,3 };
int * x = tablica;
*x = 5; //teraz tablica zawiera elementy 5,2,3
std::cout << tablica[0]<<std::endl; //wyswietli 5

 

komentarz 12 grudnia 2016 przez unknown Nałogowiec (39,560 p.)

Nazwa tablicy domyślnie przechowuje adres na pierwszy jej element

Nie. Nazwa tablicy to po prostu nazwa tablicy. Nic więcej. Po prostu w niektórych sytuacjach jest niejawnie konwertowana na wskaźnik do pierwszego elementu tablicy.

komentarz 13 grudnia 2016 przez MyWash Bywalec (2,640 p.)
Pan Zelent przez cały kurs powtarzał,a właściwie to chyba cytował Pana Grębosza. "Nazwa tablicy jest jednocześnie adresem jej zerowego elementu".
komentarz 13 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
Pan Grębosz w swojej książce popełnił wiele błędów i to jest jeden z nich(w ogóle całe jego książka to błąd). MZ też popełnił błąd cytując ten fragment z książki Grębosza.
komentarz 14 grudnia 2016 przez MyWash Bywalec (2,640 p.)
Można wiedzieć dlaczego?
komentarz 14 grudnia 2016 przez unknown Nałogowiec (39,560 p.)

C++14, §4.2/1

An lvalue or rvalue of type "array of N T" or "array of unknown bound of T" can be converted to a prvalue of type pointer to T. The result is a pointer to the first element of the array.

komentarz 14 grudnia 2016 przez MyWash Bywalec (2,640 p.)
Okej, tylko czy na całkowicie początkującym poziomie to ma aż takie znaczenie? Myślę, że po prostu jest to tak łatwiej wytłumaczyć, a w pytanie w sumie bardziej chodziło mi o to dlaczego cała książka to błąd.
komentarz 14 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
Autor nie porusza wielu ważnych kwesti tj. kontenery STL, wyjątki, szablony i jeszcze parę innych. Niektóre z nich są opisanie w 2. książce Grębosza, ale jak na książke, która ma omawiać podstawy C++, to ich brak jest bardzo dużą wadą "Symfonii C++". Poza tym autor tłumaczy, nie które rzeczy źle(przykładem jest podany przez Ciebie przykład). Widziałem parę osób, które po przeczytaniu książki Grębosza błędnie rozumiały pewne zagadnienia. No i styl autora nie podoba się wielu osobom(w tym mi). Autor traktuje czytelnika jak 10-letnie dziecko.
komentarz 14 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
No i najważniejsze. Autor na okładce chwali się, że książka jest zgodna ze standardem C++03. W 2011 wyszedł C++11, w 2014 C++14 a już za rok ma wyjść C++17. Ta książka jest już dzisiaj po prostu stara.
0 głosów
odpowiedź 12 grudnia 2016 przez ribeiro Stary wyjadacz (11,440 p.)
& zwraca adres zmiennej w pamięci. Jeśli chcesz przypisać do wskaźnika na int adres jakiejś zmiennej int to używasz &. Nie musisz jednak tego robić, jeśli ta zmienna int już jest wskaźnikiem. Tj jeśli chcesz przypisać do wskaźnika na int wskaźnik na int (a nie jego adres) to po prostu dajesz = bez znaku &.

Zmienna określana nazwą nablicy (u Ciebie tablica) to wskaźnik na jej pierwszy element.
komentarz 12 grudnia 2016 przez qlucha Obywatel (1,790 p.)
mam jeszcze jedno pytanie, dzieki  za odpowiedz, znam definicje tablicy np:

int zmienna[100]; //utworzyłem tablice o nazwie zmienna z rezerwacja[100] komorek w RAM

natomiast :

czy to tez jest utworzenie tablicy ???(wiem ze tak tworzy sie wskazniki )

int*zmienna; //
komentarz 12 grudnia 2016 przez qlucha Obywatel (1,790 p.)
 int ile;
    cout<<"Ile komorek pamieci RAM zarezerwowac (Dynamiczna Alokacja RAM) :";
    cin>>ile;

    double *tablica;

    tablica= new double [ile];
    for(int i=0;i<ile;i++)

    {
        tablica[i]=200;
        tablica[i]+=175;
        cout<<i<<" "<<tablica[i]<<endl;
    }
    cout<<tablica[9];

    delete [] tablica;

PODAJE kod żeby byłow wiadomo o czym rozmawiamy .dzieki

komentarz 13 grudnia 2016 przez ribeiro Stary wyjadacz (11,440 p.)
int* zmienna;

To tylko stowrzenie wskaźnika na typ int o nazwie zmienna. Ponieważ jednak taki wskaźnik może być tablicą (tzn może wskazywać na jej pierwszy element) to możemy tablicę do niego przypisać:

tablica= new double [ile];

Ale równie dobrze moglibyśmy zrobić np:

tablica = &jakasInnaZmienna;

Podobne pytania

0 głosów
2 odpowiedzi 306 wizyt
pytanie zadane 27 grudnia 2019 w C i C++ przez Szymczak_7 Obywatel (1,860 p.)
0 głosów
0 odpowiedzi 270 wizyt

93,113 zapytań

142,093 odpowiedzi

321,656 komentarzy

62,453 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...