Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulo Albuquerque_143794

ponteiro tipo char em c

Recommended Posts

Olá pessoal sou novo no fórum, para falar a verdade eu fiz minha conta porque não consegui tirar minhas questões em nenhum lugar.

 

Minha dúvida é a seguinte, quanto estudei ponteiro aprendi que era necessária apontar o ponteiro para uma variável estática antes de se atribuir algum valor a ele. Mas então me deparei com o seguinte:

 

char* nome="Nome qualquer";

 

como posso fazer essa atribuição sem ante apontar esse ponteiro para uma variável do tipo char? E onde vai ser armazenada a string "Nome qualquer"? E também posso fazer strcpy(nome,"Outro nome"); sem restrição de quantidade de caracteres?

 

Mas uma dúvida: qual a vantagem de usar ponteiro para ponteiro, qual situação eu seria obrigado a usar essa forma? Me disseram que dá maior performance ao programa, mas, esse melhora seria em que exatamente?

 

int **x;

 

ou

 

int *x;

 

desde já obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá e bem-vindo!

 

Esqueça a maioria dos conselhos sobre performance. É difícil fazer afirmações genéricas (ex.: "ponteiros para ponteiros melhoram performance") que se apliquem a diferentes implementações. A linguagem não tem, em sua definição, requisito algum de velocidade ou uso máximo de memória por operação.

 

Cuidado com o nome "variável estática". C possui o que chamamos de storage durations, ou "durações" de objetos. Existem 4: static, automatic, allocated e thread. Infelizmente, no Brasil, é comum dizer que objetos com duração automatic usam memória "estática", e que objetos de duração allocated usam memória "dinâmica". Isto causa confusão entre "memória estática" e static stoarge duration, e não faz sentido nenhum.

 

Ponteiros são objetos como quaisquer outros: são regiões contíguas de memória que podem conter valores.

 

O valor de um ponteiro pode ser:

 

1. Indeterminado (se ele ainda não tiver sido inicializado);

2. NULL;

3. Igual ao endereço de outro objeto (ou função, mas vamos ignorar este tópico pra não perdermos o foco).

 

No terceiro caso, note que há 2 objetos em questão: o ponteiro e o objeto ao qual ele "aponta".

 

No seu exemplo, é criada uma string literal, que tem duração static e cujos elementos são, cada um, caracteres. Portanto, seu ponteiro é sim inicializado corretamente. Não existem restrições sobre onde o literal é armazenado.

 

Não se pode chamar strcpy passando nome como primeiro argumento, pois isto tentaria copiar os bytes do segundo argumento para o endereço apontado por ele, e, por definição, não se pode modificar string literals.

 

Ponteiros para ponteiros são igualmente simples: apontam para outros objetos, com a particularidade de que estes objetos são, em si, ponteiros. Não há mistério aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sei como é.

 

Minha recomendação é a mesma de alguns anos atrás: K&R 2. Os autores conseguek transmitir os coceitos fundamentais da linguagem com simplicidade e precisão incríveis.

 

Se quiser algo em português, escrevi este material na época da faculdade: https://gist.github.com/85e4d0cc1791f60165c1

 

Salve o conteúdo com extensão .htm e boa leitura.

 

Se tiver qualquer dúvida, só dizer :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.