Ir ao conteúdo
  • Cadastre-se
Cambalinho

sobre operador '.'(ponto) e ponteiros

Recommended Posts

desculpem mas qual é o nome do operador '.'(ponto) e o operador '*' dos ponteiros?

outra coisa quando se faz:

class.membro

como posso obter o endereço ou o valor apontado pelo endereço do membro?

(desculpem, mas esta-me a falar alguns termos correctos)

Compartilhar este post


Link para o post
Compartilhar em outros sites

imagina que tenho 1 variavel dentro de 1 class que precisa de receber o endereço de 1 variavel:

void ReceberEndereco(void *endereco)
{
void *r;
r=endereco;
}

é possivel meter só o nome da variavel e ir buscar o endereço dela?

void ReceberEndereco(void &endereco)
{
void *r;
r=endereco;
}

//uso
int b;
objecto.ReceberEndereco(;

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>


void ReceberEndereco(void *ptr)
{
printf("%x\n", ptr);
}

int main()
{
int b;

printf("%x\n", &;


ReceberEndereco(&;

getchar();
return 0;
}

isso eu entendi... mas eu queria desta forma amigo:

#include <stdio.h>


void ReceberEndereco(void *ptr)//o que posso alterar aqui nesta linha?
{
printf("%x\n", ptr);
}

int main()
{
int b;

printf("%x\n", &;


ReceberEndereco(;

getchar();
return 0;
}

(tenho mais 1 duvida, mas depois vemos isso amigo)

Compartilhar este post


Link para o post
Compartilhar em outros sites

#include <stdio.h>


void ReceberEndereco(int &ptr)//o que posso alterar aqui nesta linha?
{
printf("%p\n", &ptr);
}

int main()
{
int b;

printf("%p\n", &;


ReceberEndereco(;

getchar();
return 0;
}

Compile como C++

:natal:

LNW

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>


void ReceberEndereco(int &ptr)//o que posso alterar aqui nesta linha?
{
printf("%p\n", &ptr);
}

int main()
{
int b;

printf("%p\n", &;


ReceberEndereco(;

getchar();
return 0;
}

Compile como C++

:natal:

LNW

boas festas tambem para ti amigo. e para todo o forum :natal:

ve esta alteraçao no codigo, por favor:

int main()
{
int b=200;

//printf("%p\n", &;
void *test;

//ReceberEndereco(;
test=&b;
getchar();
return 0;
}

como posso imprimir o valor de 'b' usando o ponteiro test sem saber mos o tipo de 'b'?

Compartilhar este post


Link para o post
Compartilhar em outros sites
int main()
{
int b=200;

//printf("%p\n", &;
void *test;

//ReceberEndereco(;
test=&b;
getchar();
return 0;
}

como posso imprimir o valor de 'b' usando o ponteiro test sem saber mos o tipo de 'b'?

Eu acho que não dá.. em algum momento o tipo teria de ser conhecido para depois fazer um casting de void* para int*:

printf("%d\n", *((int*)test));

Boas festas também, Cambalinho. ;)

:natal:

LNW

Compartilhar este post


Link para o post
Compartilhar em outros sites
como posso imprimir o valor de 'b' usando o ponteiro test sem saber mos o tipo de 'b'?

Template.

Basta criar um tipo genérico de maneira que o tipo de b seja o tipo do pointer.


template<typename [COLOR="blue"]tipo[/COLOR]>
void ReceberEndereco(const [COLOR="blue"]tipo[/COLOR] &
{
[COLOR="blue"]tipo[/COLOR] *b_ptr;
b_ptr = &b;
// continua
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
Eu acho que não dá.. em algum momento o tipo teria de ser conhecido para depois fazer um casting de void* para int*:

printf("%d\n", *((int*)test));

Boas festas também, Cambalinho. ;)

:natal:

LNW

e que tal imprimi-lo(seja numero\char*\numero) em string?

consegui algo:

printf("%s\n", static_cast<string *>(test));

mas converte o 200 para char lol

como posso alterar isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites
e que tal imprimi-lo(seja numero\char*\numero) em string?

consegui algo:

printf("%s\n", static_cast<string *>(test));

mas converte o 200 para char lol

como posso alterar isso?

Daria para fazer assim, Cambalinho:

cout << to_string(*(static_cast<int *>(test)));

Já adianto que std::to_string não está disponível no MingW. Rode o código acima no Visual C++.

EDIT

Uma correção: para que a função std::to_string possa ser usada, é necessário especificar o novo padrão ao g++:

$ g++ -std=c++11

:natal:

LNW

Compartilhar este post


Link para o post
Compartilhar em outros sites
Daria para fazer assim, Cambalinho:

cout << to_string(*(static_cast<int *>(test)));

Já adianto que std::to_string não está disponível no MingW. Rode o código acima no Visual C++.

:natal:

LNW

tenho essa funçao sim senhor ;)

mas nao queria dessa forma :(

esquece o int, como transformo o valor em string?(em vez de imprimir int quero imprimir directamente em string)

(desculpa alguma coisa amigo)

Compartilhar este post


Link para o post
Compartilhar em outros sites

esquece o int, como transformo o valor em string?

Usa a std :: ostringstream: http://www.cplusplus.com/reference/sstream/ostringstream/


template <typename data_type>
std::string to_string(const data_type &given_number)
{
std::ostringstream converter;
converter << given_number;
return converter.str();
};

No exemplo acima você converte qualquer coisa para std::string.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Usa a std :: ostringstream: http://www.cplusplus.com/reference/sstream/ostringstream/


template <typename data_type>
std::string to_string(const data_type &given_number)
{
std::ostringstream converter;
converter << given_number;
return converter.str();
};

No exemplo acima você converte qualquer coisa para std::string.

desculpa mas nao funciona:

int main()
{
int b=200;

//printf("%p\n", &;
void *test;

//ReceberEndereco(;
test=&b;
std::ostringstream converter;
converter << *test;
getchar();
return 0;
}

eu nao quero saber que tipo é o *test, mas quero que ele imprime em forma de string

Compartilhar este post


Link para o post
Compartilhar em outros sites

O uso de um objeto do tipo std :: ostringstream deve ser mais ou menos como nesse exemplo:


// ostringstream constructor
#include <iostream> // std::cout, std::ios
#include <sstream> // std::ostringstream

int main () {
std::ostringstream foo; // out
std::ostringstream bar (std::ostringstream::ate); // out|ate

foo.str("Test string");
bar.str("Test string");

foo << 101;
bar << 101;

std::cout << foo.str() << '\n';
std::cout << bar.str() << '\n';
return 0;
}

Daí basta arrumar o teu código da maneira que quiser. Pra mais detalhes: http://www.cplusplus.com/reference/sstream/ostringstream/ostringstream/

Compartilhar este post


Link para o post
Compartilhar em outros sites
O uso de um objeto do tipo std :: ostringstream deve ser mais ou menos como nesse exemplo:


// ostringstream constructor
#include <iostream> // std::cout, std::ios
#include <sstream> // std::ostringstream

int main () {
std::ostringstream foo; // out
std::ostringstream bar (std::ostringstream::ate); // out|ate

foo.str("Test string");
bar.str("Test string");

foo << 101;
bar << 101;

std::cout << foo.str() << '\n';
std::cout << bar.str() << '\n';
return 0;
}

Daí basta arrumar o teu código da maneira que quiser. Pra mais detalhes: http://www.cplusplus.com/reference/sstream/ostringstream/ostringstream/

desculpa. mas ve este codigo:

int a=1200;
void *b=&a;
cout << string(*;//esta linha esta mal, mas eu estou tentar demonstrar o que preciso

no cout quero imprimir o valor 'a' mas como string("1200")...

(desculpa o meu portugues mas estou a tentar :()

eu sei que tenho:

cout << static_cas<int *>(;

mas em vez do int quero string, para imprimir como string

Compartilhar este post


Link para o post
Compartilhar em outros sites
desculpa. mas ve este codigo:

int a=1200;
void *b=&a;
cout << string(*;//esta linha esta mal, mas eu estou tentar demonstrar o que preciso

no cout quero imprimir o valor 'a' mas como string("1200")...

(desculpa o meu portugues mas estou a tentar :()

eu sei que tenho:

cout << static_cas<int *>(;

mas em vez do int quero string, para imprimir como string

É simples.

Uso:


cout << string(;

Implementação:


#include <sstream>

template <typename type>
std::string string(const type &
{
std::ostringstream a;
a << b;
return a.std::ostringstream::str();
};

Compartilhar este post


Link para o post
Compartilhar em outros sites
É simples.

Uso:


cout << string(;

Implementação:


#include <sstream>

template <typename type>
std::string string(const type &
{
std::ostringstream a;
a << b;
return a.std::ostringstream::str();
};

friend ostream& operator <<(ostream &os,const variant2 &obj)
{
os <<string(obj.Vvariant) ;//Vvariant é do tipo void*
return os;
}

e tenho este erro:

- "error: invalid conversion from 'void*' to 'const char*' [-fpermissive]"

outra coisa: posso criar 1 variavel que posso receber o tipo de variavel?

typeid d;//este tipo nao existe, mas é para entenderes o que pretendo
d=typeid(nomevariavel);

porque nao usar o string? porque só recebo 1 ou 2 letras e assim nao posso usar no casting ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

void significa "sem tipo". E obviamente o compilador não sabe converter um não-tipo pra um tipo.

O que você deve dar como argumento de string() deve ser algo com tipo: int, double, float, char, ou alguma de suas variações long, long long, short, unsigned etc.

Remova esse ponteiro void*, não se usa isso para armazenar valores. Apenas endereços da memoria.

Compartilhar este post


Link para o post
Compartilhar em outros sites
void significa "sem tipo". E obviamente o compilador não sabe converter um não-tipo pra um tipo.

O que você deve dar como argumento de string() deve ser algo com tipo: int, double, float, char, ou alguma de suas variações long, long long, short, unsigned etc.

Remova esse ponteiro void*, não se usa isso para armazenar valores. Apenas endereços da memoria.

mas posso criar 1 variavel que possa receber os tipos de variavel?

Compartilhar este post


Link para o post
Compartilhar em outros sites
mas posso criar 1 variavel que possa receber os tipos de variavel?

Claro. Quando tentar programar de forma genéria, já sabes a solução: template.


template <typename tipo>

e tipo se comporta como quiser: int, double, float, char etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Claro. Quando tentar programar de forma genéria, já sabes a solução: template.


template <typename tipo>

e tipo se comporta como quiser: int, double, float, char etc.

nao resulta nest situaçao:

class variant2
{
private:
void *Vvariant=NULL;
string typ;
public:

template<typename b>
variant2 (b &value)
{
Vvariant=&value ;
typ=typeid(value).name();
}

template<typename b>
variant2 & operator = (b &value)
{
Vvariant=&value ;
typ=typeid(value).name();
}

friend ostream& operator <<(ostream &os,const variant2 &obj)
{
os <<*static_cast<typ>( obj.Vvariant) ;
return os;
}
};

Compartilhar este post


Link para o post
Compartilhar em outros sites
nao resulta nest situaçao:

class variant2
{
private:
void *Vvariant=NULL;
string typ;
public:

template<typename b>
variant2 (b &value)
{
Vvariant=&value ;
typ=typeid(value).name();
}

template<typename b>
variant2 & operator = (b &value)
{
Vvariant=&value ;
typ=typeid(value).name();
}

friend ostream& operator <<(ostream &os,const variant2 &obj)
{
os <<*static_cast<typ>( obj.Vvariant) ;
return os;
}
};

Nunca vai funcionar, veja o que esta tentando fazer ¬¬.

Já te mostrei neste Topico uma implemetação para Variant, você vai precisar guardar a informação com o tipo do dado em alguma variavel.

Mas implementei um copiazinha da Variant que te mostrei em C++, acho que consegue terminar o restante;

#include <iostream>
#include <string>

using namespace std;

const long CV_EMPTY = 0x0;
const long CV_VOID = 0x1;
const long CV_BOOLEAN = 0x2;
const long CV_CHAR = 0x3;
const long CV_I1 = 0x4;
const long CV_U1 = 0x5;
const long CV_I2 = 0x6;
const long CV_U2 = 0x7;
const long CV_I4 = 0x8;
const long CV_U4 = 0x9;
const long CV_I8 = 0xa;
const long CV_U8 = 0xb;
const long CV_R4 = 0xc;
const long CV_R8 = 0xd;
const long CV_STRING = 0xe;
const long CV_PTR = 0xf;
const long CV_DATETIME = 0x10;
const long CV_TIMESPAN = 0x11;
const long CV_OBJECT = 0x12;
const long CV_DECIMAL = 0x13;
const long CV_ENUM = 0x15;
const long CV_MISSING = 0x16;
const long CV_NULL = 0x17;
const long CV_LAST = 0x18;

class Variant
{
private:
void *m_objref = NULL;
int m_data1;
int m_data2;
long m_flags = 0;

string result;
public:

Variant(bool val) {
m_objref = NULL;
m_flags = CV_BOOLEAN;
m_data1 = (val) ? 1 : 0;
m_data2 = 0;
}

Variant(int val) {
m_objref = NULL;
m_flags = CV_I2;
m_data1 = (int) val;
m_data2 = (int) (((long) val) >> 32);
}

string to_string()
{
switch (m_flags)
{
case CV_BOOLEAN:
result = m_data1 ? "True" : "False";
break;
case CV_I2:
result = std::to_string((int) m_data1);
break;
default:
break;
}
return result;
}
};

int main()
{
Variant b = false;
Variant i = 10;

cout << b.to_string() << endl;
cout << i.to_string() << endl;

getchar();
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
Nunca vai funcionar, veja o que esta tentando fazer ¬¬.

Já te mostrei neste Topico uma implemetação para Variant, você vai precisar guardar a informação com o tipo do dado em alguma variavel.

Mas implementei um copiazinha da Variant que te mostrei em C++, acho que consegue terminar o restante;

#include <iostream>
#include <string>

using namespace std;

const long CV_EMPTY = 0x0;
const long CV_VOID = 0x1;
const long CV_BOOLEAN = 0x2;
const long CV_CHAR = 0x3;
const long CV_I1 = 0x4;
const long CV_U1 = 0x5;
const long CV_I2 = 0x6;
const long CV_U2 = 0x7;
const long CV_I4 = 0x8;
const long CV_U4 = 0x9;
const long CV_I8 = 0xa;
const long CV_U8 = 0xb;
const long CV_R4 = 0xc;
const long CV_R8 = 0xd;
const long CV_STRING = 0xe;
const long CV_PTR = 0xf;
const long CV_DATETIME = 0x10;
const long CV_TIMESPAN = 0x11;
const long CV_OBJECT = 0x12;
const long CV_DECIMAL = 0x13;
const long CV_ENUM = 0x15;
const long CV_MISSING = 0x16;
const long CV_NULL = 0x17;
const long CV_LAST = 0x18;

class Variant
{
private:
void *m_objref = NULL;
int m_data1;
int m_data2;
long m_flags = 0;

string result;
public:

Variant(bool val) {
m_objref = NULL;
m_flags = CV_BOOLEAN;
m_data1 = (val) ? 1 : 0;
m_data2 = 0;
}

Variant(int val) {
m_objref = NULL;
m_flags = CV_I2;
m_data1 = (int) val;
m_data2 = (int) (((long) val) >> 32);
}

string to_string()
{
switch (m_flags)
{
case CV_BOOLEAN:
result = m_data1 ? "True" : "False";
break;
case CV_I2:
result = std::to_string((int) m_data1);
break;
default:
break;
}
return result;
}
};

int main()
{
Variant b = false;
Variant i = 10;

cout << b.to_string() << endl;
cout << i.to_string() << endl;

getchar();
return 0;
}

dessa forma tenho de fazer 1 construtor para cada tipo... mas avalia-me esta por favor:

#include <iostream>
#include <string.h>
#include <typeinfo.h>

using namespace std;

class Variant
{
private:

string result;
public:

Variant()
{
}

template<typename B>
Variant(B val)
{
result=to_string(val);
}

Variant(string val)
{
result=val;
}

Variant(char *val)
{
result=val;
}

Variant(bool val)
{
result=to_string(val);
if (result=="0")
{
result="false";
}
else
{
result="true";
}
}

friend ostream& operator<< (ostream &out, Variant &VResult)
{
out <<VResult.result;
return out;
}

friend istream& operator>> (istream &in, Variant &VResult)
{
getline(in,VResult.result);
return in;
}
};

int main()
{
Variant b = false;
Variant i = 10;

cout <<b << "\n";//prints "false"
cout <<i << "\n";//prints "10"
cin >> i;//read i
cout << i;//prints i
int a=1000;
string v="hello world";
i=a;
cout << "\n" << i;
i=v;
cout << "\n" << i;
getchar();
return 0;
}

só nao consigo com que aceite o endereço da variavel :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×