Ir ao conteúdo
  • Cadastre-se

Struct em função sem ou com ponteiro


Visitante
Ir à solução Resolvido por Ansi C,

Posts recomendados

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

 

Link para o comentário
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? >_<

Link para o comentário
Compartilhar em outros sites

  • Solução

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.

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...