mój program do nauki wskaźników

0

wynik działania programu:

user image

 // wskazniki3.cpp by rewertyn: Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <conio.h> 
#include <iostream>
#include <windows.h>

//http://www.egrafik.pl/kurs-c-plus-plus/8.1.php
//http://www.egrafik.pl/kurs-c-plus-plus/8.3.php
//http://technet.microsoft.com/pl-pl/library/zarzadzanie-pamiecia-w-32-i-64-bitowych-systemach-windows-cz-2.aspx

using namespace std;
void (__cdecl funkcja1)(int* zmienna3);

int _tmain(int argc, _TCHAR* argv[])
{
    int zmienna1=0;
    zmienna1=-21;

    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 

    cout<<"test"<<endl;
    cout<<"w main()"<<endl;
    //cout<<"*zmienna1=";
    SetConsoleTextAttribute(hConsole, 3);   
    //cout<<*zmienna1;
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<"&zmienna1=";
    SetConsoleTextAttribute(hConsole, 5);   
    cout<<&zmienna1;//wyswietli adres
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<" zmienna1=";
    SetConsoleTextAttribute(hConsole, 11);  
    cout<<zmienna1<<endl;//wyswietli liczbe = -21
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<"wywolanie funkcji: funkcja1(&zmienna1);"<<endl;

    funkcja1(&zmienna1);////////////

    cout<<"znowu w main()"<<endl;
    //cout<<"*zmienna1=";
    SetConsoleTextAttribute(hConsole, 3);   
    //cout<<*zmienna1;
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<"&zmienna1=";
    SetConsoleTextAttribute(hConsole, 5);   
    cout<<&zmienna1;//wyswietli adres
    SetConsoleTextAttribute(hConsole, 7);   
    cout<<" zmienna1=";
    SetConsoleTextAttribute(hConsole, 11);  
    cout<<zmienna1<<endl;//wyswietli liczbe = -12
    SetConsoleTextAttribute(hConsole, 7);   
    system("pause");
    return 0;
}// koniec tmain
//////
void (__cdecl funkcja1)(int* zmienna3)
{
    cout<<"w funkcji: funkcja1(int* zmienna3)"<<endl;
    cout<<"przed zamiana wartosci zmiennej"<<endl;
    HANDLE  hConsole2;
    hConsole2 = GetStdHandle(STD_OUTPUT_HANDLE); 
    cout<<"*zmienna3=";
    SetConsoleTextAttribute(hConsole2, 11);     
    cout<<*zmienna3;//wyswietli liczbe = -21
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<" &zmienna3=";
    SetConsoleTextAttribute(hConsole2, 15);     
    cout<<&zmienna3;//wyswietli adres wskaznika
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<" zmienna3=";
    SetConsoleTextAttribute(hConsole2, 5);  
    cout<<zmienna3<<endl;//wyswietli adres
    SetConsoleTextAttribute(hConsole2, 7); 

    *zmienna3=-12;//////////////

    cout<<"po zamiana wartosci zmiennej"<<endl;
    cout<<"*zmienna3=";
    SetConsoleTextAttribute(hConsole2, 11);     
    cout<<*zmienna3;//wyswietli liczbe = -12
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<" &zmienna3=";
    SetConsoleTextAttribute(hConsole2, 15);     
    cout<<&zmienna3;//wyswietli adres wskaznika
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<" zmienna3=";
    SetConsoleTextAttribute(hConsole2, 5);  
    cout<<zmienna3<<endl;//wyswietli adres
    SetConsoleTextAttribute(hConsole2, 7);  
    cout<<"wyjscie z funkcji: funkcja1(int* zmienna3)"<<endl;
    }
//////
0

Jak na pomoc naukową do opanowywania wskaźników, wszystkie te wywołania SetConsoleTextAttribute() tylko sprawiają, że kod jest absolutnie nieczytelny. Jeśli ktoś chciałby zobaczyć w jaki sposób coś powstało, musiałby się przebijać przez masę zbędnych linii. Przydałaby się także arytmetyka na wskaźnikach, bo to ona jest największą zaletą oraz sprawia najwięcej problemów początkującym (i jest świetnym generatorem błędów, ale to tak na marginesie).

0

http://www.image-share.com/ipng-937-224.html

user image

wywołania SetConsoleTextAttribute(hConsole2, 7); zmieniają kolory wypisywanych wartości zmiennych potem jest ustawiony kolor domyślny do wypisania textu jak sie zmienna nazywa której wartośc jest wypisywana na ekranie , jeszcze dodałem linijkę zaablokowaną :
// wypisanie na ekran: cout<<"zmienna3="<<zmienna3;<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;

// wskazniki3.cpp by rewertyn: Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <windows.h>

//http://www.egrafik.pl/kurs-c-plus-plus/8.1.php
//http://www.egrafik.pl/kurs-c-plus-plus/8.3.php
//http://technet.microsoft.com/pl-pl/library/zarzadzanie-pamiecia-w-32-i-64-bitowych-systemach-windows-cz-2.aspx

using namespace std;
void (__cdecl funkcja1)(int* zmienna3);
void (__cdecl wypisz_na_ekran)(char* str,int i,int j);
void (__cdecl wypisz_na_ekran)(int str,int i,int j);
void (__cdecl wypisz_na_ekran)(int* str,int i,int j);

int _tmain(int argc, _TCHAR* argv[])
{
    int zmienna1=0;
    zmienna1=-21;

    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 
    cout<<"test"<<endl;
    cout<<"w main()"<<endl;
    //wypisz_na_ekran("*zmienna1=",7,7); 
    //wypisz_na_ekran(*zmienna1,3,7); 
    wypisz_na_ekran("&zmienna1=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(&zmienna1,5,7); //wyswietli adres
    wypisz_na_ekran("zmienna1=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(zmienna1,11,7);  //wyswietli liczbe = -21
    cout<<endl; 
    cout<<"wywolanie funkcji: funkcja1(&zmienna1);"<<endl;

    funkcja1(&zmienna1);////////////

    cout<<"znowu w main()"<<endl;
    //wypisz_na_ekran("*zmienna1=",7,7); 
    //wypisz_na_ekran(*zmienna1,3,7); 
    wypisz_na_ekran("&zmienna1=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(&zmienna1,5,7); //wyswietli adres
    wypisz_na_ekran("zmienna1=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(zmienna1,11,7);  //wyswietli liczbe = -12
    cout<<endl; 
    system("pause");
    return 0;
}// koniec tmain
//////
void (__cdecl funkcja1)(int* zmienna3)
{
    cout<<"w funkcji: funkcja1(int* zmienna3)"<<endl;
    cout<<"przed zamiana wartosci zmiennej"<<endl;
    // wypisanie w kolorach na ekran: cout<<"*zmienna3="<<*zmienna3<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;
    wypisz_na_ekran("*zmienna3=",7,7);//7=kolor domyslny  
    wypisz_na_ekran(*zmienna3,11,7);  //wyswietli liczbe = -21
    wypisz_na_ekran("&zmienna3=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(reinterpret_cast<int*>(&zmienna3),15,7); //wyswietli adres
    wypisz_na_ekran("zmienna3=",7,7);//7=kolor domyslny 
    cout<<hex;
    wypisz_na_ekran(zmienna3,5,7); //wyswietli adres
    cout<<dec;
    cout<<endl; 

    *zmienna3=-12;//////////////

    cout<<"po zamiana wartosci zmiennej"<<endl;
    // wypisanie w kolorach na ekran: cout<<"*zmienna3="<<*zmienna3<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;
    wypisz_na_ekran("*zmienna3=",7,7);//7=kolor domyslny  
    wypisz_na_ekran(*zmienna3,11,7);  //wyswietli liczbe = -12
    wypisz_na_ekran("&zmienna3=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(reinterpret_cast<int*>(&zmienna3),15,7); //wyswietli adres
    wypisz_na_ekran("zmienna3=",7,7);//7=kolor domyslny 
    wypisz_na_ekran(zmienna3,5,7); //wyswietli adres
    cout<<endl; 
    cout<<"wyjscie z funkcji: funkcja1(int* zmienna3)"<<endl;
    }
//////
void (__cdecl wypisz_na_ekran)(char* str,int i,int j)
{
    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, i);
    cout<<str;
    SetConsoleTextAttribute(hConsole, j);   
}
//////
void (__cdecl wypisz_na_ekran)(int str,int i,int j)
{
    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, i);
    cout<<str;
    SetConsoleTextAttribute(hConsole, j);   
}
//////
void (__cdecl wypisz_na_ekran)(int* str,int i,int j)
{
    HANDLE  hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, i);
    cout<<str;
    SetConsoleTextAttribute(hConsole, j);   
}

kod programu do przeanalizowania:


// wskazniki3.cpp by rewertyn: Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <conio.h> 
#include <iostream>
#include <windows.h>

//http://www.egrafik.pl/kurs-c-plus-plus/8.1.php
//http://www.egrafik.pl/kurs-c-plus-plus/8.3.php
//http://technet.microsoft.com/pl-pl/library/zarzadzanie-pamiecia-w-32-i-64-bitowych-systemach-windows-cz-2.aspx

using namespace std;
void (__cdecl funkcja1)(int* zmienna3);

int _tmain(int argc, _TCHAR* argv[])
{
    int zmienna1=0;
    zmienna1=-21;

    cout<<"test"<<endl;
    cout<<"w main()"<<endl;
    cout<<" &zmienna1="<<&zmienna1<<" zmienna1="<<zmienna1<<endl;
    cout<<"wywolanie funkcji: funkcja1(&zmienna1);"<<endl;

    funkcja1(&zmienna1);////////////

    cout<<"znowu w main()"<<endl;
    cout<<" &zmienna1="<<&zmienna1<<" zmienna1="<<zmienna1<<endl;
    system("pause");
    return 0;
}// koniec tmain
//////
void (__cdecl funkcja1)(int* zmienna3)
{
    cout<<"w funkcji: funkcja1(int* zmienna3)"<<endl;
    cout<<"przed zamiana wartosci zmiennej"<<endl;
    cout<<"*zmienna3="<<*zmienna3<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;

    *zmienna3=-12;//////////////

    cout<<"po zamiana wartosci zmiennej"<<endl;
    cout<<"*zmienna3="<<*zmienna3<<" &zmienna3="<<&zmienna3<<" zmienna3="<<zmienna3<<endl;
    cout<<"wyjscie z funkcji: funkcja1(int* zmienna3)"<<endl;
    }
//////
0

równie czytelny kod, albo nawet czytelniejszy można uzyskać dzięki znacznikom '\t' i '\n'. A co tak właściwie tutaj potrzebujesz żeby Ci pomóc?

0

nie potrzebuję program działa dobrze

0

Dołączanie "windows.h" do takiego programu, to śmiech na sali...

0

Możesz też stworzyć funkcje, które będą Ci drukowały tekst w określonych kolorach. Np.:

funkcja WydrukujWskaźnik(wartość):
    Wydrukuj("Opis");
    ZmieńKolorNaOczojebnyRóż();
    Wydrukuj(wartość);
    PrzywróćKolorStandardowy();

funkcja WydrukujLiczbę(liczba):
    Wydrukuj("Opis");
    ZmieńKolorNaHawajskaZatokaPoLipcowymDeszczu();
    Wydrukuj(liczba);
    PrzywróćKolorStandardowy();

Czytelność kodu nie będzie idealna, ale znacznie lepsza.

0

dobry pomysł

0

Jeśli chcesz zrobić coś naprawdę wyczesanego, mam dla Ciebie taką propozycję. Zadaniem tego programu jest pomóc w nauce używania wskaźników (jak sądzę), a przy tego typu szkoleniach świetną pomocą jest zobrazowanie (na jakimś poziomie abstrakcji) jak to mniej więcej wygląda w pamięci. W trybie tekstowym musiałbyś to zrobić na semigrafikach, co jest dość trudne, ale możliwe. Np. zobrazowanie wskaźnika na char (z podstawieniem rzeczywistych wartości! poniżej są przykładowe):

0x0043F8C8       0x0043F8CC                       0x0043F948
 .....+---+---+---+---+.....                       .....+------------------+.....
      | A | l | a |\0 |                                 |    0x0043F8C8    |
 .....+---+---+---+---+.....                       .....+------------------+.....
        ^                                                         |
        |                                                         |
        +---------------------------------------------------------+

Do tego arytmetyka, iterakcja, podział na tematy i masz ciekawy program.

0

tutaj są wykorzystane wszystkie możliwe kombinacje:

// wskazniki3.cpp by rewertyn: Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <windows.h>

//http://www.egrafik.pl/kurs-c-plus-plus/8.1.php
//http://www.egrafik.pl/kurs-c-plus-plus/8.3.php
//http://technet.microsoft.com/pl-pl/library/zarzadzanie-pamiecia-w-32-i-64-bitowych-systemach-windows-cz-2.aspx

using namespace std;

void (__cdecl wypisz_na_ekran)(int &str,int i,int j);
void (__cdecl wypisz_na_ekran2)(int str,int i,int j);
void (__cdecl wypisz_na_ekran3)(int* str,int i,int j);

int _tmain(int argc, _TCHAR* argv[])
{
    int zmienna1=0,zmienna2=0,zmienna3=0,&zmienna11=zmienna1;
    zmienna1=-21;

    cout<<"test"<<endl;
    cout<<"w main()"<<endl;
    cout<<"&zmienna1= "<<&zmienna1<<" zmienna1= "<<zmienna1<<endl;
    wypisz_na_ekran(zmienna1,5,7);
    wypisz_na_ekran2(reinterpret_cast<int>(&zmienna1),4,7);
    wypisz_na_ekran3(&zmienna1,3,7);
    cout<<"&zmienna1= "<<&zmienna1<<" zmienna1= "<<zmienna1<<endl;
    int &zmienna4=zmienna1;//robi kopię zmiennej 1 w zmiennej 4
    zmienna4=-11;
    cout<<"&zmienna1= "<<&zmienna1<<" zmienna1= "<<zmienna1<<endl;
    cout<<"&zmienna4= "<<&zmienna4<<" zmienna4= "<<zmienna4<<endl;

    system("pause");
    return 0;
}// koniec tmain
//////
void (__cdecl wypisz_na_ekran)(int &str,int i,int j)
{
        HANDLE  hConsole;
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, i);
        cout<<"&str ="<<&str<<" str ="<<str<<endl;
        str=str-4;  
        cout<<"&str ="<<&str<<" str ="<<str<<endl;
        SetConsoleTextAttribute(hConsole, j);         
}
//////
void (__cdecl wypisz_na_ekran2)(int str,int i,int j)
{
        HANDLE  hConsole;
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, i);
        cout<<"&str2 ="<<&str<<" str2 ="<<hex<<str<<dec<<endl;
        str=str-40; // minus 40 adresow int
        cout<<"&str2 ="<<&str<<" str2 ="<<hex<<str<<dec<<endl;
        SetConsoleTextAttribute(hConsole, j);         
}
//////
void (__cdecl wypisz_na_ekran3)(int* str,int i,int j)
{
        HANDLE  hConsole;
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole, i);
        cout<<"&str3 ="<<&str<<" str3 ="<<hex<<str<<dec<<endl;
        //str=str-4;    
        cout<<"&str3 ="<<&str<<" str3 ="<<hex<<str<<dec<<endl;
        SetConsoleTextAttribute(hConsole, j);         
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0