Ir ao conteúdo

Posts recomendados

Postado

Quero pegar o endereço de memoria da variável char[15] do registro para poder apontar para o valor e imprimir. Não existe uma forma? Eu sei que consigo fazer isso sem apontar.

 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct estrutura {
	int id;
	char cores[15];
};

int main() {
	int *ptr;
	char *ptr_s;	
	struct estrutura lapis[3];

	for (int i = 0; i < 3; i++) {
		lapis[i].id = i+1;
		if ( i == 0 ) {
			strcpy(lapis[i].cores, "vermelho");
		} else if ( i == 1 ) {
			strcpy(lapis[i].cores, "amarelo");
		} else {
			strcpy(lapis[i].cores, "verde");
		}
	}
	
	for (int i = 0; i < 3; i++) {
		ptr = &lapis[i].id;
		printf("Valor de id %d = %d   -   ", i ,*ptr);
		//não consegui nem com strcpy();
		ptr_s = &lapis[i].cores;
		printf("Cor: %s\n\n", *ptr_s);
	}
	
	system("Pause");
	return(0);
}

 

 

O trecho em específico:

    ptr_s = &lapis[i].cores;
    printf("Cor: %s\n\n", *ptr_s);

 

  • Curtir 1
Postado

cores   é um tipo matriz e seu nome é também o endereço do seu primeiro elemento.

 

ptr_s = lapis[i].cores;

printf("Cor: %s\n\n", ptr_s);

  • Curtir 1
  • Amei 1
Postado

@Luiz Paulo Escobar

27 minutos atrás, Luiz Paulo Escobar disse:

O trecho em específico:


    ptr_s = &lapis[i].cores;
    printf("Cor: %s\n\n", *ptr_s);

Você pode omitir o & ou então fazer ptr_s apontar para o primeiro elemento da string cores manualmente:

ptr_s = lapis[i].cores;

// Ou

ptr_s = &lapis[i].cores[0];

E chamando a printf() daquela forma, sabe o que será impresso? O caractere na posição 0 da string cores, pois esse é o conteúdo apontado pelo ponteiro naquele momento.

Omitimos então o operador *, veja:

printf("Cor: %s\n\n", ptr_s);

Assim printf() imprime na saída até que seja encontrado um caractere nulo.

  • Obrigado 1
Postado

@Lucca Rodrigues bem esclarecedor

@mauro_b obrigado

17 minutos atrás, Lucca Rodrigues disse:

ptr_s = &lapis[i].cores[0];

Em C cada espaço do vetor tem um endereço?

3 minutos atrás, Luiz Paulo Escobar disse:

ptr_s = &lapis[i].cores[0];

No caso então eu teria que printar o valor de endereço por endereço até o numero maximo do vetor (strlen)

  • Curtir 1
Postado
1 hora atrás, Luiz Paulo Escobar disse:

Em C cada espaço do vetor tem um endereço?

 

Como em qualquer linguagem. Mesmo que você não possa acessar ou saber qual é.
 

1 hora atrás, Luiz Paulo Escobar disse:

endereço de memoria da variável char[15] do registro

 

char[15] não é uma variável. É um tipo. A variável é cores e o tipo dela é char[15].

 

struct estrutura {
	int id;
	char cores[15];
};

 

está declarada dentro de estrutura e o compilador vai reservar um espaço para ela no código, fixo, de tamanho necessário para conter 15 char. E esse endereço vai ser o endereço de início do vetor, cores.

 

Nunca declare essas coisas fora de main() ou fora de qualquer função. Isso faz com que a estrutura toda seja global, válida no programa todo. E isso praticamente NUNCA é o que você quer. Só dá problema e é proibido em toda parte.

 

E como está já declarada em geral não há razão para querer saber o endereço dela. É fixo e constante e pode ser obtido usando o operador & que retorna o endereço de qualquer coisa em C.

 

Se quer apenas imprimir algum dos 15 pode usar a única coisa que C faz com vetores e matrizes: calcular o deslocamento a partir do início. De cores[0] até cores[14] estarão as letras.

 

Uma string em C tem um zero no fim. Isso quer dizer que se tem uma string em cores pode imprimir direto usando %s na especificação do printf(). Ou pode escrever puts(cores) para ver na tela.

 

Se quer imprimir 1 a 1 use claro um loop, for, while, do/while, goto, qualquer um.

  • Obrigado 2
Postado

@Luiz Paulo Escobar

2 horas atrás, Luiz Paulo Escobar disse:

Em C cada espaço do vetor tem um endereço?

Declaramos, por exemplo:

int vet[10];

Reservamos então um conjunto de espaços de memória de modo a conter 10 inteiros.

Para se referir a um certo elemento do vetor, basta indexa-lo:

vet[0] = 1;

Então a resposta da sua pergunta é sim, se tratando de um conjunto, cada elemento tem um endereço.

 

2 horas atrás, Luiz Paulo Escobar disse:

No caso então eu teria que printar o valor de endereço por endereço até o numero maximo do vetor (strlen)

Se sua variável é uma string, então ela é terminada em '\0', ou caractere nulo.

printf() irá imprimi-la até encontrar esse caractere, essa é a razão pela qual você consegue imprimir uma string sem um loop, mas não consegue fazer o mesmo com um vetor de inteiros por exemplo, já que este não tem um terminador, a não ser que você coloque um lá, e mesmo assim precisará de um loop.

ptr_s aponta para o início de uma string, não há razão em imprimir elemento por elemento.

  • Curtir 1
Postado
1 hora atrás, arfneto disse:

Se quer imprimir 1 a 1 use claro um loop, for, while, do/while, goto, qualquer um.

vou agilizar isso

No caso, vocês me esclareceram o que eu queria fazer, obrigado!

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct estrutura {
	int id;
	char cores[15];
};

int main() {
	int *ptr;
	char *ptr_c, *ptr_s;	
	struct estrutura lapis[3];

	for (int i = 0; i < 3; i++) {
		lapis[i].id = i+1;
		if ( i == 0 ) {
			strcpy(lapis[i].cores, "vermelho");
		} else if ( i == 1 ) {
			strcpy(lapis[i].cores, "amarelo");
		} else {
			strcpy(lapis[i].cores, "verde");
		}
	}
	
	for (int i = 0; i < 3; i++) {
		ptr = &lapis[i].id;
		printf("Valor de id %d = %d   -   ", i ,*ptr);
		ptr_s = lapis[i].cores;
		
		//aqui irei imprimeiro endereço por endereço
		printf("Cor: ");
		for (int j = 0; j < strlen(ptr_s); j++ ) {
			ptr_c = &lapis[i].cores[j];
			printf("%c", *ptr_c);
		}
		printf("\n");
	}
	
	system("Pause");
	return(0);
}

 

Postado

:)

 

Muito bem.

 

Mas ainda não está bom. Não use uma estrutura global. Nunca.

 

Não aloque nada fora das funções. Em muitas linguagens sequer é possível. Isso é problema.

 

Vou deixar um exemplo de como seria um programa para fazer a mesma coisa do modo como deve encontrar em programas modernos em produção, e sugiro que compare a mecânica.

 

Antes de tudo entenda que seu programa não cria nada: ao ser compilado já se sabe o que vai acontecer: os valores são constantes. Os loops sempre vão dar o mesmo resultado. Então deve ser possível o compilador já fazer isso ao invés de rodar código TODA vez que roda o programa para gerar SEMPRE o mesmo resultado.

 

A saída do exemplo

 


clube>gcc -o tst -Wall -std=c17 ch0520ptr.c
clube>./tst

Valor do ultimo id usando o ponteiro = 3
Valor do ultimo id usando a variável = 3

Valor da segunda cor usando o ponteiro para char= verde
Valor da segunda cor usando o ponteiro para estrutura = verde
Valor da segunda cor usando a variável = verde

Valor da cor na estrutura usando a variavel = doze x
Valor da cor na estrutura usando o ponteiro para char = doze x
clube>

 

O código

 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct
{
	int     id;
	char    cores[15];

}   Estrutura;

int main(void)
{

Estrutura estrutura = { .id = 1432, .cores = "doze x" };

Estrutura lapis[3] =
{
    [0] = { .id = 1, .cores = "vermelho" },
    [2] = { .id = 3, .cores = "verde"    },
    [1] = { .id = 2,.cores = "amarelo"   }
};


    // usando ptr para acessar a ultima id do vetor lapis
    int*        ptr = &lapis[2].id; // usando o operador &
    printf("\nValor do ultimo id usando o ponteiro = %d\n", *ptr);
    printf("Valor do ultimo id usando a variável = %d\n", lapis[2].id );

    char*       ptr_s = lapis[2].cores; 
    Estrutura*  pE = &lapis[2]; // usando o operador & = 'endereco de'
    printf("\nValor da segunda cor usando o ponteiro para char= %s\n", ptr_s);
    printf("Valor da segunda cor usando o ponteiro para estrutura = %s\n", pE->cores);
    printf("Valor da segunda cor usando a variável = %s\n", lapis[2].cores);

    // mudando o ponteiro para outro lugar
    ptr_s = &  estrutura.cores[0]; 
    printf("\nValor da cor na estrutura usando a variavel = %s\n", estrutura.cores );
    printf("Valor da cor na estrutura usando o ponteiro para char = %s\n", ptr_s);

    return(0);
}

 

Compare e escreva de volta se não entender algo

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!