c++
kodziarz: mógłbym prosić kogoś aby mi wypisał obok każdej linijki w komentarzu jaka zmiana zachodzi,
ponieważ uczę się wskaznikow i probuje to zrozumiec
kod:
#include <iostream>
using namespace std;
int main(){
int x=5;
int *pi=&x;
int **ppi = π
int y=x;
*ppi=&y;
*pi=6;
**ppi=7;
cout << x << " " << y << endl; // x=5, y=7
return 0;
}
12 paź 00:04
kodziarz: forum zamieniło mi nazwe na pi a więc poprawiony kod:
kod:
#include <iostream>
using namespace std;
int main(){
int x=5;
int *w=&x;
int **ppi = w
int y=x;
*ppi=&y;
*w=6;
**ppi=7;
cout << x << " " << y << endl; // x=5, y=7
return 0;
}
12 paź 00:05
Dziadek Mróz:
Przyjmijmy, że pamięć została naszemu programowi tak przydzielona:
W adresach znajdują się zmienne:
x: 0x0000 typu całkowitego o wartości 5
w: 0x0001 typu wskaźnikowego o adresie zmiennej a
ppi: 0x0002 typu wskaźnikowego o zawartości zmiennej w
y: 0x0003 typu całkowitego o wartości zmiennej x
int x = 5;
int *w = &x;
int **ppi = &w;
int y = x;
Zmienna: [ x | w | ppi | y ]
Adres: [0x0000| 0x0001| 0x0002| 0x0003]
Zawartość: [ 5 | 0x0000| 0x0001| 5 ]
*ppi = &y; *ppi − ustalamy wartość, czyli adres na w, w = &y
Zmienna: [ x | w | ppi | y ]
Adres: [0x0000| 0x0001| 0x0002| 0x0003]
Zawartość: [ 5 | 0x0003| 0x0001| 5 ]
*w = 6; *w − ustalamy wartość, czyli zmienną y, y = 6
Zmienna: [ x | w | ppi | y ]
Adres: [0x0000| 0x0001| 0x0002| 0x0003]
Zawartość: [ 5 | 0x0003| 0x0001| 6 ]
**ppi = 7; *ppi − ustalamy zawartość, czyli zmienną y, y = 7
Zmienna: [ x | w | ppi | y ]
Adres: [0x0000| 0x0001| 0x0002| 0x0003]
Zawartość: [ 5 | 0x0003| 0x0001| 7 ]
12 paź 03:37
Dziadek Mróz:
Dla kodu
http://pastebin.com/SGrUcsmW
#include <iostream>
int main()
{
int x = 5;
int *w = &x;
int **ppi = &w;
int y = x;
std::cout << "x: " << x << "\t\t&x: " << &x << std::endl;
std::cout << "w: " << w << "\t&w: " << &w << "\t\t*w: " << *w << std::endl;
std::cout << "ppi: " << ppi << "\t&ppi: " << &ppi << "\t*ppi: " << *ppi << "\t**ppi: " <<
**ppi << std::endl;
std::cout << "y: " << y << "\t\t&y: " << &y << std::endl << std::endl;
*ppi = &y;
std::cout << "ppi: " << ppi << "\t&ppi: " << &ppi << "\t*ppi: " << *ppi << "\t**ppi: " <<
**ppi << std::endl;
std::cout << "w: " << w << "\t&w: " << &w << "\t\t*w: " << *w << std::endl <<
std::endl;
*w = 6;
std::cout << "w: " << w << "\t&w: " << &w << "\t\t*w: " << *w << std::endl <<
std::endl;
std::cout << "x: " << x << "\t\t&x: " << &x << std::endl;
**ppi = 7;
std::cout << "ppi: " << ppi << "\t&ppi: " << &ppi << "\t*ppi: " << *ppi << "\t**ppi: " <<
**ppi << std::endl;
std::cout << "w: " << w << "\t&w: " << &w << "\t\t*w: " << *w << std::endl;
std::cout << "y: " << y << "\t\t&y: " << &y << std::endl << std::endl;
return 0;
}
Przykładowy wynik:
x: 5 &x: 0x22feac
w: 0x22feac &w: 0x22fea8 *w: 5
ppi: 0x22fea8 &ppi: 0x22fea4 *ppi: 0x22feac **ppi: 5
y: 5 &y: 0x22fea0
ppi: 0x22fea8 &ppi: 0x22fea4 *ppi: 0x22fea0 **ppi: 5
w: 0x22fea0 &w: 0x22fea8 *w: 5
w: 0x22fea0 &w: 0x22fea8 *w: 6
x: 5 &x: 0x22feac
ppi: 0x22fea8 &ppi: 0x22fea4 *ppi: 0x22fea0 **ppi: 7
w: 0x22fea0 &w: 0x22fea8 *w: 7
y: 7 &y: 0x22fea0
12 paź 04:00
Dziadek Mróz:
Wskaźniki są proste tylko trzeba poćwiczyć. To praca na pamięci i adresach.
12 paź 04:01
Dziadek Mróz:
ppi: 0x22fea8 &ppi: 0x22fea4 *ppi: 0x22feac **ppi: 5
w bezpośrednio wskazuje na a
ppi pośrednio wskazuje na a poprzez w
12 paź 04:31
kodziarz: Jesteś moim Mistrzem! Dziękuję!
12 paź 13:00