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

wskazniki - cpp

Object Storage Arubacloud
0 głosów
290 wizyt
pytanie zadane 26 czerwca 2022 w C i C++ przez polandonion Mądrala (7,040 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 Ekspert (344,860 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 (194,920 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 (194,920 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 Mądrala (7,040 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 Ekspert (344,860 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 Mądrala (7,040 p.)
ok, dzięki wszystkim, którzy brali udział w tej dyskusji, pozdrawiam :D

Podobne pytania

0 głosów
1 odpowiedź 331 wizyt
pytanie zadane 2 lipca 2022 w C i C++ przez polandonion Mądrala (7,040 p.)
0 głosów
1 odpowiedź 152 wizyt
pytanie zadane 15 kwietnia 2019 w C i C++ przez wz7475 Początkujący (360 p.)
0 głosów
1 odpowiedź 109 wizyt
pytanie zadane 22 kwietnia 2020 w C i C++ przez TOWaD Mądrala (5,700 p.)

92,552 zapytań

141,399 odpowiedzi

319,533 komentarzy

61,938 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!

...