venerdì 22 agosto 2014

Un nuovo tipo di puntatori in CLI (managed Heap)

Puntatore.
void main(){
	int numero=123;
	int * puntatore;
	puntatore=№
	cout << numero << endl;
	cout << *puntatore << endl;
	getchar();
} 
123
123




Puntatore a una classe:
#include "iostream"
using namespace std;
class Classe{
public:
	int variabile;

	Classe(int parametro){
		variabile=parametro;
	}
	
	void scrivi(){
		cout << "scrivo" << endl;
		getchar();
	}
};

void main(){
	Classe MiaClasse(234);
	Classe * Puntatore;
	Puntatore=&MiaClasse;
	Puntatore->scrivi();
	cout << Puntatore->variabile;
	getchar();
} 
scrivo

234



Vediamo di studiare quello strano tipo di puntatori...

Innanzitutto bisogna attivare il cosiddetto CLI.
Per farlo, devo aprire un progetto CLR.
Ecco: creo un puntatore "tradizionale":
// test1 CLR.cpp : file di progetto principale.

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)
{
    int numero=123;
	int * puntatore = №
	Console::WriteLine(numero);
	Console::WriteLine(*puntatore);
	Console::Read();
    return 0;
}
 
E funziona, regolarmente:
123
123


Adesso vediamo di creare quell'altro genere di puntatori...
#include "stdafx.h"

using namespace System;

int main()
{
	int numero=135;
    int ^ puntatore;
	puntatore=numero;
	Console::WriteLine(numero);
	Console::WriteLine(puntatore);
	Console::Read();
}
135
135


Sì.

Adesso confrontiamolo con il classico modo di creare un puntatore e assegnargli l'indirizzo di una variabile:
#include "stdafx.h"

using namespace System;

int main(){
	int numero=135;
    int ^ puntatore;
	puntatore=numero;

	int *puntatoreTrad;
	puntatoreTrad=№

	Console::WriteLine("Puntatore Handle");
	Console::WriteLine(numero);
	Console::WriteLine(puntatore);
	Console::WriteLine("");

	Console::WriteLine("Puntatore tradizionale");
	Console::WriteLine(numero);
	Console::WriteLine(*puntatoreTrad);
	Console::Read();
}
Puntatore Handle
135
135

Puntatore tradizionale
135
135


Sì, corrisponde perfettamente.

Adesso allochiamo dinamicamente la memoria:
#include "stdafx.h"

using namespace System;

int main(){
	int * puntatore=new int(123);

	int ^ puntatoreNuovo=gcnew int(123);

	Console::WriteLine(*puntatore);
	Console::ReadLine();
	Console::WriteLine(puntatoreNuovo);
	Console::ReadLine();
}
123

123


Sì: per allocare dinamicamente la memoria è necessario usare l'operatore gcnew.

Nessun commento:

Posta un commento