Ir ao conteúdo
  • Cadastre-se

Ponteiros


rafaelrrf
Ir à solução Resolvido por isrnick,

Posts recomendados

Apesar de ser possível atribuir um valor inteiro a char, essa pergunta não faz muito sentido.

Primeiro, para trabalhar com ponteiro você deve criar uma variável ponteiro com o operador '*'. E essa variável é que vai apontar para o endereço de outra.

Agora se você quiser converter int para vetor de char, há funções específicas para isso.

Link para o comentário
Compartilhar em outros sites

Não quero usar nenhum tipo de conversão como sprintf etc.

 

O que eu queria fazer era atribuir o valor inteiro que tem 4 bytes no meu sistema, para o vetor char, ocupando apenas 4 bytes no mesmo, seria possível?

Hey'!' @rafaelrrf

Sim, use 'casting'

 

Ilustração:

   int x = 10;   char int32_b[4];   *(int*)int32_b = x;   printf( "show int32_b: = %d\n", *(int*)int32_b );

;)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Mas em quais posições do array eu estou inserindo o numero 10 que é o valor de x? Como eu faria para inserir em outra posição? Pelo visto você esta convertendo o array para um inteiro com o cast, mas eu não quero me desfazer dele, preciso imprimir ele como uma string. Pois também tenho que inserir nesse array, caracteres, além dos valores inteiros. Seria possível?

Link para o comentário
Compartilhar em outros sites

@rafaelrrf

Se eu te entendi você quer imprimir 3 dígitos; Of couser!

Cada variável char cabe apenas um digito, isso mesmo 1 digito por char, pode ser letra ou numero.

Apenas um por char;

 

Assim sendo sua intenção é fazer

int x = 10;

ser convertido em strings (3 char) e armazenado no seu vetor de 4 char?

e por fim impresso pela função printf, contudo esta conversão sem auxilio da função sprintf?

Link para o comentário
Compartilhar em outros sites

Eu quero imprimir meu buffer. Sim, cada char ocupa 1 Byte. Vejamos um novo exemplo, tenho um vetor de char de 50 bytes : char buffer[50]. E uma variavel inteira: int x = 10. O que eu quero é passar apenas o valor de "x" para o "buffer", ou seja, como x tem 4 bytes, acredito que ocupara então 4 bytes no buffer. Sendo assim ocupará 4 posições no buffer, certo? Mas eu quero fazer essa passagem sem usar funções de conversão, como sprintf. O que eu quero é algo como passar o conteudo do endereço de cada byte do inteiro para o buffer usando ponteiros, mas n estou conseguindo fazer isso. Conseguiu entender?

Link para o comentário
Compartilhar em outros sites

Não sei se isso é possível com ponteiros, mas acredito que você poderia obter isto usando deslocamentos de bits (se entendi corretamente o que você quer):

unsigned char v[10];unsigned long x = 10;v[0] = (x >> 24) & 0xFF;v[1] = (x >> 16) & 0xFF;v[2] = (x >> 8) & 0xFF;v[3] = x & 0xFF;
Link para o comentário
Compartilhar em outros sites

  • Solução

Vamos escolher um número melhor pra explicar, como 66314.

 

66314 em binário com 32bits:

00000000000000010000001100001010
Dividindo em 4 bytes:

00000000 00000001 00000011 00001010
Se nós deslocarmos este número para a direita nestas quantidades de bits teremos:

>> 24 bits - 00000000 00000000 00000000 00000000>> 16 bits - 00000000 00000000 00000000 00000001>> 8 bits  - 00000000 00000000 00000001 00000011>> 0 bits  - 00000000 00000001 00000011 00001010
Mas observe nos 2 últimos casos que a parte que nos interessa são apenas os 8 bits mais a direita, entretanto existem números diferentes de 0 nas posições mais a esquerda destes bits, e precisamos eliminá-las antes de atribuir o valor ao char (que tem apenas 1 byte = 8 bits).

 

Para isso usamos o valor hexadecimal 0xff (=255) que em binário é igual a:

...000011111111 (8 bits mais a direita 1, e o restante 0)
E realizamos a operação booleana AND (que em C é simbolizado por &) entre o número deslocado e 0xff. Resultando que apenas os valores dos 8 bits mais a direita do número deslocado permanecem, e o restante a esquerda se torna 0, podendo então ser armazenado na variável char.

Resultado final:

>> 24 bits & 0xff - 00000000 00000000 00000000 00000000 = 00000000>> 16 bits & 0xff - 00000000 00000000 00000000 00000001 = 00000001>> 8 bits & 0xff  - 00000000 00000000 00000000 00000011 = 00000011>> 0 bits & 0xff  - 00000000 00000000 00000000 00001010 = 00001010
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

É interessante observar nesse tipo de operação de fazer 1 deslocamento para a direita é o mesmo que dividir por 2 e fazer 1 para a esquerda é o mesmo que multiplicar por dois.

Por exemplo;

y = x >> 1;
É o mesmo que

y = x / 2;
Agora quando se faz mais de 1 deslocamento, é preciso considerar a quantidade de deslocamentos na base 2 para ter o mesmo resultado com os operadores de multiplicação ou divisão, por exemplo.

y = x << 8;
É igual

y = x * 256; // já que 256 = 2^8
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Hey'!' Feras!!!

 

Ajuda-me aqui a entender também o que fez essa tal de; Operação com Bits,

que ao meu entendimento nos resultados obtidos foram os mesmo.

Corrigi ai por favor se estive errando !!!!!!!!!!!

 

Ilustração:

int main( void ){   unsigned char v[10] = { 0 };   unsigned long x = 10;   v[0] = (x >> 24) & 0xFF;   v[1] = (x >> 16) & 0xFF;   v[2] = (x >> 8) & 0xFF;   v[3] = x & 0xFF;//"Prova dos nove" com ponteiros '!'   if ( *((unsigned long*)(v + 3)) == x ) printf( "SIM\n\n" );   else printf( "NAO\n\n" );return 0;   }

:confused::tantan:

 

<A precisa mais não, entendi...>

;) Foi a maneira de copiar os 4 bytes de Um no Outro sequencialmente. 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...