Ir ao conteúdo
  • Cadastre-se
nanquinote

RESOLVIDO Struct em função sem ou com ponteiro

Recommended Posts

Gente, Bom dia. Qual a vantagem de passar um vetor de struct por ponteiro? Li que é a única forma de gravar no struct, mas eu fiz sem e, aparentemente, está gravando...

O código abaixo está funcionando, mas pelo que li não deveria. Ou estou deixando passar alguma coisa?

 

#include <iostream>
#define MAX_USER 4
using namespace std;

typedef struct{
	string cpf;
	string nome;
	int senha;
}Usuarios;

bool preenche(Usuarios u[], int &c);

int main(){
	Usuarios l_user[MAX_USER];
	int ultimo = 0;

	preenche(l_user, ultimo);

	cout << "\n\nNome: " << l_user[0].nome;

}

bool preenche(Usuarios u[], int &c){
	char resp;
	if(c == MAX_USER){
		cout << "\nERRO - LISTA CHEIA" << endl;
		return false;
	}

	cout << "\n\b--- CADASTRO DE USUARIOS -- \n";


	for(int i=0; i<MAX_USER; ++i){
		cout << "Insira Nome: " << endl;
		getline(cin, u[i].nome);
		cout << "Insira Senha: " << endl;
		cin >> u[i].senha;
		cout << "Insira CPF: " << endl;
		cin >> u[i].cpf;
		cin.sync();
		c++;
		cout << endl;
		cout << "Continuar? [S/N]" << endl;;
		cin.get(resp);
		resp = toupper(resp);
		if(resp == 'N'){
			cout << "\nSaindo... " << endl;
			break;
		}
		cin.sync();
	} 
	return true;
}

//confirmaSenha

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, nanquinote disse:

...eu fiz sem e,...

Sem quê? Ponteiros? Não é isso o que eu vejo, se fizer um sizeof do vetor de estructs você vai obter o tamanho do ponteiro, mais que suficiente para que você se de conta que você esta passando por referencia e não por valor o tal vetor de structs.

 

#include <iostream>
#define MAX_USER 4
using namespace std;

typedef struct{
	string cpf;
	string nome;
	int senha;
}Usuarios;

bool preenche(Usuarios u[], int &c);

int main(){
	Usuarios l_user[MAX_USER];
	int ultimo = 0;
    printf("Tamanho de um objeto do tipo usuarios %d\n\n", sizeof(Usuarios));
	printf("Tamanho da lista %d, é 4 vezes maior que o tamanho de um objeto pois você tem um MAX_USER do tamanho de 4.\n\n", sizeof(l_user));
	preenche(l_user, ultimo);
    
    
    return 0;
}

bool preenche(Usuarios u[], int &c){
    printf("dentro de preenche %d\n", sizeof(u));
	return true;
}

//confirmaSenha

no primeiro printf vai imprimir 52, no segundo vai imprimir um valor 4 vezes maior, ou seja 208, porém dentro da função vai imprimir um medíocre 4 bytes. Por quê? Por que é um ponteiro hahaha!

Usuarios u[] é a mesma coisa que Usuarios *u. Capiche? >_<

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia todos,

13 horas atrás, nanquinote disse:

Qual a vantagem de passar um vetor de struct por ponteiro?

Utilizando ponteiros podemos reduzir o uso significativo de memória por parte do programa e permite também a manipulação direta dos dados contidos, apesar de que manipular estes dados diretamente reduz lhe a segurança, pensando neste último fator, podemos modificada a função que através do retorno alterar dados, para isso, será necessário mais memória.

13 horas atrás, nanquinote disse:

Li que é a única forma de gravar no struct, mas eu fiz sem e, aparentemente, está gravando...

O código abaixo está funcionando, mas pelo que li não deveria. Ou estou deixando passar alguma coisa?

 

bool preenche(Usuarios u[], int &c); Aqui há o cabeçario escrito; Os parâmetros desta função "são todos ponteiros", pois até mesmo uma referência pode se dizer que contém um ponteiro abstrato ou o próprio objeto.

Individualmente explico que no caso do parâmetro u[ ] é de fato um ponteiro, que aponta para um vetor de tamanho indefinido. E ainda do parâmetro &c que é uma referência onde disse que contem um objeto, se pode falar que é o próprio objeto, e dentro do universo da linguagem C' posso dizer ser um ponteiro sem a possibilidade de aritmética de ponteiros.

Editado por dif
Excesso de cor no texto
  • Curtir 1

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

×