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

Wskaźniki, parę pytań

VPS Starter Arubacloud
0 głosów
214 wizyt
pytanie zadane 28 lipca 2019 w C i C++ przez Yorweth Obywatel (1,310 p.)

Witam,

Uczę się aktualnie wskaźników i mam do nich parę pytań na podstawie kodu:

Pierwsze moje takie pytanie to czy znak & służy jedynie do wyciągania adresu danej wartości z tablicy? 

Bo tak naprawdę dając int* x=y; to gdy wypiszemy x to poda nam cały adres do y bez użycia &.

Więc się tak zastanawiam czy & najlepiej używać do wyjęcia tylko danych adresów z tablicy.

 

 

Drugie pytanie to bardziej do kodu. Czy gdy jest wypisywana wartosc *wsk_waga nie powinny wyświetlić się wszystkie liczby z tablicy, a nie tylko pierwsza? 

//Wskaźniki drugie starcie---------------
#include <iostream>
#include <conio.h>
int main()
{
    using namespace std;
    //tablice deklaracia inicjalizacja
    double waga[ 5 ] = { 55.3, 747.8, 1001.2, 5.2, 6.4 };
    short odliczanie[ 4 ] = { 3, 2, 1, 0 };
    //wskaźniki
    double * wsk_waga = waga; //nazwa tabeli = adres
    short * wsk_odliczanie = & odliczanie[ 0 ];
    
    //Wyświetlanie adresu i wartości wskaźnika wsk_waga
    cout << "wsk_waga = " << wsk_waga
    << ", *wsk_waga = " << * wsk_waga
    << endl
    << "Dodawanie wsk_waga + 1 ";
    wsk_waga += 1;
    cout << "\nTeraz wsk_waga = " << wsk_waga
    << ", *wsk_waga = " << * wsk_waga << endl
    << endl;
    //Wyświetlanie adresu i wartości wskaźnika wsk_odliczanie
    cout << "wsk_odliczanie = " << wsk_odliczanie
    << ", *wsk_odliczanie = " << * wsk_odliczanie
    << endl
    << "Dodawanie wsk_odliczanie + 1 ";
    wsk_odliczanie += 1;
    cout << "\nTeraz wsk_odliczanie = " << wsk_odliczanie
    << ", *wsk_odliczanie = " << * wsk_odliczanie << endl
    << endl;
    
    //Wyświetlanie zapisu tablicowego
    cout << "\nPodobienstwa tablic i wskaznikow\n"
    << "Pierwszy element tab waga[0] = "
    << waga[ 0 ] << endl
    << "Drugi element tab odliczanie[1] = "
    << odliczanie[ 1 ] << endl << endl;
    
    //Wyświetlanie zapisu wskaźnikowego
    cout << "Pierwszy element tab waga "
    "z uzyciem wskaznika *waga = "
    << * waga << endl
    << "Drugi element tab odliczanie "
    "z uzyciem wskaznika *(odliczanie + 1) = "
    << *( odliczanie + 1 ) << endl << endl << endl;
    
    //porównanie wielkości tablic i wskaźników
    cout << "Tablica waga wazy " << sizeof( waga )
    << " bajtow!" << endl
    << "Jednak wskaznik na ta tablice *wsk_waga "
    << "wazy tylko " << sizeof( wsk_waga )
    << " bajty!" << endl;
    
    getch();
    return 0;
}
//---------------------------------------

 

komentarz 28 lipca 2019 przez tkz Nałogowiec (42,000 p.)

Pierwsze moje takie pytanie to czy znak & służy jedynie do wyciągania adresu danej wartości z tablicy? 

Zależy w jakim kontekście, ogólnie jest to syntax sugar, inny zapis wskaźnika.

2 odpowiedzi

0 głosów
odpowiedź 28 lipca 2019 przez DeBos123 Nałogowiec (44,950 p.)
wybrane 28 lipca 2019 przez Yorweth
 
Najlepsza

Co do pierwszego pytania nie jestem pewien, więc nie odpowiem.

Jednak jeżeli chodzi o drugie to wsk_waga jest wskaźnikiem na pierwszy element tablicy, więc *wsk_waga jest wartością na którą owy wskaźnik wskazuje.

komentarz 28 lipca 2019 przez Yorweth Obywatel (1,310 p.)
Ok, rozumiem już. Więc co zrobić aby wypisał wszystkie wartości obok siebie bez pętli for?
komentarz 28 lipca 2019 przez DeBos123 Nałogowiec (44,950 p.)

Nie wiem dlaczego nie chcesz użyć pętli for, ale możesz to zrobić w taki sposób:

while(*wsk_waga){
    cout<<*wsk_waga++;
}

i.e.:

  • Dopóki wartość na którą wskazuje wsk_waga jest różna od zera:
  • Wypisz wartość na którą wskazuje wsk_waga, a następnie zinkrementuj.

Musisz pamiętać, że po wykonaniu tej pętli wsk_waga wskazuje na wartość poza tablicą, więc musisz spowrotem go zdekrementować lub ustawić na poprzednią wartość.

komentarz 28 lipca 2019 przez Yorweth Obywatel (1,310 p.)
Wielkie dzięki naprawdę i to pomogło.

A co sądzisz o 1 pytaniu? W jakich przypadkach używać & a w jakich po prostu wpisywać zmienną?  Z tego co widziałem & używają głównie żeby wziąć dany element z całości dlatego tak pomyślałem, ale jeszcze się uczę dlatego zadałem tutaj to pytanie :)
komentarz 28 lipca 2019 przez DeBos123 Nałogowiec (44,950 p.)

Z tego co wiem to jest odwrotność *, czyli dla przykładu:

int a=10;
int* b=&a;
int* c=b;
  • a to jest normalna zmienna o wartości 10.
  • b to jest wskaźnik i możesz do tej zmiennej przypisać inny wskaźnik. &a oznacza wskaźnik na a.
  • c to również wskaźnik, a b też jest wskaźnikiem, czyli możesz bez problemu przypisać b do c bez dereferencji. Gdybyś użył &b to byś przypisał do c wskaźnik na b. Czyli podsumowując c oraz b są takimi samymi wskaźnikami, które wskazują na a, czyli w tym przypadku *c*b oraz a mają taką samą wartość, 10.
komentarz 28 lipca 2019 przez niezalogowany
edycja 28 lipca 2019

@Yorweth,

#include <iostream>
using namespace std;
int main() {
    int tab[2][4]= {{1,2,3,4},
                    {5,6,7,8}
                    };
    // tab to wskaznik 0 elementu wiersza
//   int *wsktab = tab; // bład
    int *wsktab = tab[0];
    int *wskinny = &tab[0][0];
    cout << "*(tab+7) ="<< *(tab+7)<< endl;
    cout << "*(*tab+7) ="<< *(*tab+7)<< endl;
    cout << "*(tab[0]+7) ="<< *(tab[0]+7)<< endl;
    cout << "*(wsktab+7) ="<< *(wsktab+7)<< endl;
    cout << "*(wskinny+7) ="<< *(wskinny+7)<< endl;
    return 0;
}

 

0 głosów
odpowiedź 29 lipca 2019 przez MetRiko Nałogowiec (37,110 p.)

Czy znak & służy jedynie do wyciągania adresu danej wartości z tablicy? 

 Znak & (ang. ampersand) w C++ ma całkiem sporo zastosowań i każde poznaje się w swoim czasie wraz z dalszą nauką o języku. Aby zaspokoić Twoją ciekawość wylistowałem poniżej kilka zagadnień, w których ampersand jest wykorzystywany (mniej więcej w kolejności w jakiej będziesz się ich prawdopodobnie uczył):
- operator logiczny AND (a && b),
- pozyskanie adresu zmiennej/obiektu (&a),
- operator bitowy AND (a & b),
- tworzenie referencji na obiekt (np. b& = a),
- przesyłanie/zwracanie referencji w funkcjach,
- klauzula przechwytywania w funkcji lambda (ang. lambda capture).
- semantyka przenoszenia (ang. move semantics) w tym r-value reference,
- ang. forwarding reference (pot. universal reference).

W kwestii dalszej części pytania:
To tak w dużym skrócie. W C++ istnieje pewna składnia, która może trochę mieszać początkującym podczas nauki wskaźników. Mianowicie.. nazwa tablicy jest jednocześnie traktowana jako adres jej pierwszego elementu. Więc jest to jeden z niewielu przypadków gdzie NIE WOLNO używać `&`, bo już sama nazwa zmiennej zwraca adres (użycie ampersandu w tym wypadku wskazywałoby na to, że chciałbyś uzyskać adres adresu pierwszego elementu tablicy). W przypadkach "nietablicowych", aby uzyskać adres zmiennej TRZEBA użyć `&`.

Jakiś czas temu napisałem odpowiedź, w której tłumaczę czym jest wskaźnik, kiedy warto ich używać i jak one się mają do tablic, znajdziesz ją na dole pod tym linkiem: https://forum.pasja-informatyki.pl/168496/c-wskazniki-kiedy-ich-uzywac Nawet jeżeli trochę nie powiązane z Twoim pytaniem to polecam się zapoznać bo powinno Ci to pomóc na przyszłość. Co prawda jest to stara wypowiedź i napisałbym ją teraz w zupełnie inny sposób, ale powinna dać sobie radę.

Na pytanie dotyczące kodu już Ci ktoś odpowiedział więc daruję sobie.

Podobne pytania

0 głosów
2 odpowiedzi 385 wizyt
pytanie zadane 26 października 2019 w Inne języki przez Hype Początkujący (340 p.)
0 głosów
1 odpowiedź 438 wizyt
0 głosów
2 odpowiedzi 5,970 wizyt
pytanie zadane 6 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...