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

Dziwne zachowanie wskaźnika, podczas proby przypisania

Object Storage Arubacloud
0 głosów
214 wizyt
pytanie zadane 17 grudnia 2019 w C i C++ przez profesorek96 Szeryf (91,420 p.)

Witam was.

Ostatnio bawiłem się kodem w C++, konkretnie wskaźnikami. Chciałem stworzyć tablice dynamiczną, następnie za pomocą funkcji powiększyć jej rozmiar o 2 elementy.

O tyle o ile ten kod działa:

#include <iostream>
using namespace std;

void wypisz(int t[],int n)
{
	for(int i=0;i<n;i++)cout<<t[i]<<" ";
	cout<<endl;
}
int * powieksz(int *tab,int n,int nowy)
{
	
	int *tmp=new int[5];
	for(int i=0;i<3;i++)tmp[i]=tab[i];
	
	tmp[3]=8;
	tmp[4]=10;
	
	delete [] tab;
	
	return tmp;
}
int main() {
	int *tab=new int[3];
	tab[0]=2;
	tab[1]=3;
	tab[2]=5;
	wypisz(tab,3);
	
	tab=powieksz(tab,3,5);
	
	wypisz(tab,5);
	delete []tab;
	return 0;
}

 

Niestety ten już nie, nie wiem dlaczego. Przecież przekazujemy do funkcji adres tablicy.

#include <iostream>
using namespace std;

void wypisz(int t[],int n)
{
	for(int i=0;i<n;i++)cout<<t[i]<<" ";
	cout<<endl;
}
void powieksz(int *tab,int n,int nowy)
{
	
	int *tmp=new int[5];
	for(int i=0;i<3;i++)tmp[i]=tab[i];
	
	tmp[3]=8;
	tmp[4]=10;
	
	delete [] tab;
	
	tab=tmp;
}
int main() {
	int *tab=new int[3];
	tab[0]=2;
	tab[1]=3;
	tab[2]=5;
	wypisz(tab,3);
	
	powieksz(tab,3,5);
	
	wypisz(tab,5);
	delete []tab;
	return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 17 grudnia 2019 przez criss Mędrzec (172,590 p.)
wybrane 17 grudnia 2019 przez profesorek96
 
Najlepsza

Adres tablicy tak, ale adres wskaźnika (adres pod którym jest zapisany adres tablicy) już nie. Zadziała jeśli funkcja `powieksz` będzie działała na oryginalnym wskaźniku, np.: 

void powieksz(int*& tab,int n,int nowy)

(`tab` pobierane przez referencje)

komentarz 17 grudnia 2019 przez profesorek96 Szeryf (91,420 p.)

Nie bardzo rozumiem, do funkcji przekazuje adres. Czyli numerek gdzie jest to zapisane. No to skoro mam taki numer to jak powiem ze ten numer jestwny innemu numerowi no to przecież powinno mi zmienić. Bo przecież jeśli mamy do czynienia ze wskaźnikiem no to nie jest przekazywanie przez wartość tylko pracujemy na originale.

 

komentarz 17 grudnia 2019 przez criss Mędrzec (172,590 p.)

Bo przecież jeśli mamy do czynienia ze wskaźnikiem no to nie jest przekazywanie przez wartość tylko pracujemy na originale.

Na oryginale tablicy, nie na oryginale wskaźnika. Musisz patrzeć do czego masz adres a nie że po prostu masz adres. To tak jakbyś oczekiwał, że ten kod wyprintuje 5:

void f(int x)
{
   x = 5;
}

int main()
{
   int a = 2;
   f(a);
   std::cout << a;
}

Wskaźnik też jest po prostu typem prostym przechowującym liczby całkowite, więc sytuacja jest praktycznie identyczna z tym że u ciebie zamiast 2 i 5, są adresy.

komentarz 17 grudnia 2019 przez profesorek96 Szeryf (91,420 p.)
Czyli co nastąpiło skopiowanie adresu, wartości adresu. Ten wskaźnik z funkcji ma ten sam adres jednak to zupełnie inna zmienna ?
1
komentarz 17 grudnia 2019 przez criss Mędrzec (172,590 p.)

Tak, wskaźnik (wartość adresu) został skopiowany. Zatem funkcja operuje na innym wskaźniku, przechowującym ten sam adres ale znajdującym się pod innym adresem.

komentarz 17 grudnia 2019 przez profesorek96 Szeryf (91,420 p.)
Dzięki za pomoc :)

Podobne pytania

0 głosów
1 odpowiedź 469 wizyt
0 głosów
1 odpowiedź 171 wizyt
0 głosów
1 odpowiedź 335 wizyt
pytanie zadane 2 lipca 2022 w C i C++ przez polandonion Mądrala (7,040 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...