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

wskazniki - cpp

Aruba Cloud - Virtual Private Server VPS
0 głosów
542 wizyt
pytanie zadane 26 czerwca 2022 w C i C++ przez polandonion Dyskutant (7,630 p.)
otwarte ponownie 27 czerwca 2022 przez polandonion

Witam,

Niedawno oglądałem film pana Zelenta odnośnie wskaźników (kurs c++) i spróbowałem napisać program ku utrwaleniu świeżo poznanej wiedzy. Niestety podczas próby zkompilowania programu wyskoczył błąd.

#include <iostream>
int main(){
	int arr[]{99,24,501,456};
	int *p=&arr;
	std::cout<<*p;
}

Błąd znajduje się w 4. linii kodu. Zauważyłem także, że usuwając z niej znak ampersanda ('&')

int *p=arr;

program kompiluje się. Dzieje się tak także kiedy zamiast usuwać '&' dodam przed średnikiem '[0]'.

int *p=&arr[0];

I właśnie odnośnie tego mam pytanie: Dlaczego pisząc deklarację:

int *p=&arr;

program się nie kompiluje? Pan Zelent mówił przecież, że "nazwa tablicy jest adresem jej zerowego elementu".

Dam tutaj Państwu logi z błędu kompilacji:

In function 'int main()':

4:16: error: cannot convert 'int (*)[4]' to 'int*' in initialization

    4 |         int *p=&arr; //int *p=&arr[0];
      |                ^~~~
      |                |
      |                int (*)[4]

 

1 odpowiedź

+2 głosów
odpowiedź 26 czerwca 2022 przez adrian17 Mentor (352,580 p.)

Pan Zelent mówił przecież, że "nazwa tablicy jest adresem jej zerowego elementu".

Właśnie dlatego `int *p=arr` działa. Samo `arr` jest niejako wskaźnikiem; nie musisz brać adresu tego wskaźnika używając &, bo dostajesz wtedy wskaźnik na wskaźnik.

 

komentarz 27 czerwca 2022 przez j23 Mędrzec (195,240 p.)

Z jednej strony masz rację, ale ile razy wyjaśniałeś na forum, że sizeof(tab) to nie to samo sizeof(ptr), że tab to jednak nie jest wskaźnik? Ja wielokrotnie. I brało to się właśnie z tego uproszczenia.

Zresztą tamto nie było do Ciebie, tylko do... Zelenta :P

komentarz 27 czerwca 2022 przez j23 Mędrzec (195,240 p.)

więc Twoja uwaga o niejawnej konwersji do filmiku Zelenta i tego konkretnego screenshota  w ogóle się nie aplikuje.)

A tego to nie wiedziałem, bo nie oglądałem filmika, opierałem się na tym, co jest tutaj. Cytat mówi o tablicy, OP ma w kodzie tablicę, więc...

komentarz 27 czerwca 2022 przez polandonion Dyskutant (7,630 p.)

@adrian17, powiedziales, ze

Samo `arr` jest niejako wskaźnikiem

to dlaczego nie moge przesuwac tego "wskaznika" ?

#include <iostream>
int main(){
	int arr[]{99,24,501,456};
	std::cout<<*arr<<'\n';
	arr++;
	std::cout<<*arr;
}
In function 'int main()':

5:9: error: lvalue required as increment operand

    5 |         arr++;
      |         ^~~

 

1
komentarz 27 czerwca 2022 przez adrian17 Mentor (352,580 p.)

Właśnie dlatego że nie jest dokładnie wskaźnikiem, dlatego napisałem "niejako" :P OK, to przyznaję j23 rację, jego dokładniejsze wytłumaczenie jest tutaj lepsze:

Nie, nazwa tablicy oznacza tablicę, która jest konwertowalna w sposób niejawny do wskaźnika na pierwszy element

Nie możesz inkrementować tablicy. Możesz inkrementować wskaźnik; zmienna tablicowa czasem pod spodem konwertuje się na wskaźnik na pierwszy element (jak przy `wskaznik = arr`), ale nie przy takim bezpośrednim użyciu jak `arr++`.

komentarz 27 czerwca 2022 przez polandonion Dyskutant (7,630 p.)
ok, dzięki wszystkim, którzy brali udział w tej dyskusji, pozdrawiam :D

Podobne pytania

0 głosów
1 odpowiedź 558 wizyt
pytanie zadane 2 lipca 2022 w C i C++ przez polandonion Dyskutant (7,630 p.)
0 głosów
1 odpowiedź 192 wizyt
pytanie zadane 15 kwietnia 2019 w C i C++ przez wz7475 Początkujący (360 p.)
0 głosów
1 odpowiedź 141 wizyt
pytanie zadane 22 kwietnia 2020 w C i C++ przez TOWaD Mądrala (6,420 p.)

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 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!

...