• 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

42 Warsaw Coding Academy
0 głosów
435 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ź 760 wizyt
0 głosów
1 odpowiedź 203 wizyt
0 głosów
1 odpowiedź 574 wizyt
pytanie zadane 2 lipca 2022 w C i C++ przez polandonion Dyskutant (7,630 p.)

93,377 zapytań

142,380 odpowiedzi

322,530 komentarzy

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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...