Dúvida de iniciante sobre um ponteiro [RESOLVIDO]

1. Dúvida de iniciante sobre um ponteiro [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 23/02/2019 - 11:45h

MeuArquivo = fopen("arquivo.txt", "r"); 

Na declaração acima, Eu estou lendo o arquivo INTEIRO para MeuArquivo? OU criei apenas um atalho para arquivo.txt como os atalhos que criamos no computador!
Tentando entender melhor isso porque as explicações que encontrei sobre ponteiros não combinam, cada pessoa diz uma coisa diferente.
Acho que a única coisa que entendi se eu realmente entendi é que PONTEIRO na verdade é um endereço na memória (Espaço Separado na memória pra usar)
Mas outras pessoas na internet dizem que Ponteiro é um atalho... E entendo como atalho algo que NEM SEQUER existe (Referindo-me a atalhos para arquivos ou pastas em um computador)

Na Internet o que mais se repete sobre ponteiros é isso:
Ponteiros ou apontadores, são variáveis que armazenam o endereço de memória de outras variáveis.
Dizemos que um ponteiro “aponta” para uma varíável quando contém o endereço da mesma.

Logo parece que ponteiro é NADA, pq no exemplo acima eu estou enviando TEXTO para esse ponteiro! O que para mim fica sem sentido com as afirmações acima! Pois ou eu envio o texto ou ele é um atalho, ou ele é o que?

Sendo mais específico na dúvida
#include <stdio.h>
void main() {
char Conteudo_da_Linha[50];
FILE *MyFile; // MyFile é um ponteiro
MyFile = fopen("arquivo.txt", "r"); // MyFile recebe o conteúdo do arquivo.txt? Ou não recebe nada? Ou ele é atalho?

// AQUI o fgets está lendo a LINHA. OU se ele não le de MyFile está lendo diretamente do arquivo! Quero saber o que está acontecendo, o que ele está fazendo, como ele está funcionando!
while(fgets(Conteudo_da_Linha, 50, MyFile) != NULL) // Leio MyFile linha a linha enviando cada linha para a variável Conteudo_da_Linha
printf("%s", Conteudo_da_Linha);
fclose(MyFile);
}


Por isso quero entender o que é um Ponteiro, PQ ele informa vazio, e se ele está vazio pq ele não existe, e o que existe é apenas o arquivo? Quero entender!


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/02/2019 - 19:43h

Steve escreveu:

Eu também sou iniciante como você e nunca entendi de verdade o que é um ponteiro.


Ponteiro é um valor que tem duas características:

  • representa um endereço de memória, e

  • traz associado a si o tipo de dado que pode ser encontrado no endereço representado.

Esses tipos de valores podem ser armazenados em variáveis declaradas com a finalidade específica de armazenar tais valores, mas um valor de um tipo ponteiro pode ser obtido de várias formas, sem necessariamente estar associado a uma variável de um tipo ponteiro.

Explicitamente, ponteiros, sendo valores, podem ser obtidos das seguintes maneiras:

  • por meio do operador unário &, que devolve um ponteiro que indica o endereço de um elemento alocado como dado na memória e carrega a informação do tipo de dado do elemento cujo endereço foi obtido;

  • como decaimento automático de um dado de um tipo array (em C, um array só é tratado como tal no momento de sua declaração e quando é passado como argumento para os operadores unários & e sizeof; em todos os outros contextos, ele decai para ponteiro, produzindo um valor ponteiro que é idêntico ao que seria produzido se o operador unário & tivesse sido aplicado ao seu primeiro elemento);

  • como valor de retorno de uma função que devolve um valor ponteiro;

  • quando se obtém o valor de uma variável declarada com um tipo ponteiro; e

  • pela conversão de tipo (em inglês chamada de type casting), forçada ou implícita, de um valor inteiro qualquer ou de um ponteiro para dados de outro tipo para um tipo ponteiro.

Os casos acima podem ser ilustrados em código.
int n;  // n é uma variável que contém um dado do tipo “int”.
const long l=5; // l é uma “variável” com valor constante igual a 5.
char nome[]="Paulo"; // nome é um array com 6 elementos do tipo char.
char *pc; // pc é uma variável que contém um dado do tipo “ponteiro para dado do tipo char”.
char **ppc; // ppc é uma variável que contém um dado tipo “ponteiro para dado do tipo ‘ponteiro para dado do tipo char’”.

&n; // produz um valor do tipo “ponteiro para dado do tipo int”: o endereço é aquele onde n está armazenada, e o tipo de dado associado é “int”.
&l; // produz um valor do tipo “ponteiro para dado constante do tipo long”: o endereço é aquele onde l está armazenada, e o tipo de dado associado é “const long”.

&nome[0]; // produz um valor do tipo “ponteiro para dado do tipo char”: o endereço é aquele onde nome[0] está armazenado, e o tipo de dado associado é “char”.
nome; // produz, por decaimento do array para ponteiro, um valor idêntico ao produzido por “&nome[0]”.
&nome; // não há decaimento pois o operador & foi aplicado ao array: nesse caso produz um valor do tipo “ponteiro para dado do tipo ‘array com 6 elementos do tipo char’”:
// o endereço é aquele de onde o array começa, e o tipo de dados associado é “array com 6 elementos do tipo char”.

pc=strdup(nome); // A função strdup() aloca uma nova região de memória e copia para ela o conteúdo do array nome (que decaiu para ponteiro antes de se chamar
// a função) e retorna um ponteiro para o primeiro elemento da área alocada, cujo tipo de dado associado é “char”.
ppc=&pc; // produz um valor do tipo “ponteiro para dado do tipo ‘ponteiro para dado do tipo char’” e o atribui a ppc: o endereço é aquele onde pc está armazenado
// (não o valor contido em pc) e o tipo de o dado associado é “ponteiro para dado do tipo char”.

#define NULL ((void *)0) // Definição padrão de NULL em C: a conversão explícita para “ponteiro para dado de qualquer tipo” (qualquer, aí, indicado por “void”) do valor
// inteiro 0: o tipo de dados associado é “ponteiro para dado de qualquer tipo” (pode ser convertido implicitamente de e para qualquer outro ponteiro).

free(pc); // O valor de pc é implicitamente convertido para “ponteiro para qualquer tipo” (o parâmetro de free() é do declarado como “void *”) e é passado como argumento
// para a função; o endereço é o mesmo endereço representado por pc (obtido do retorno de strdup(), acima), mas seu tipo associado foi agora convertido para
// “ponteiro para dado de qualquer tipo”.


Eu acredito que ponteiros sejam exatamente o que dizem. Eles não recebem nenhum valor e não fazem nada. São apenas um atalho do programa para um objeto no sistema operacional, igual mesmo um atalho do windows.


Como você viu acima, na verdade ponteiros são valores, e pode haver variáveis que recebem, armazenam e devolvem tais valores.

Atalhos do Windows não são a mesma coisa que (ou, como você disse, iguais a) ponteiros. Pode ser que, em alguns aspectos, possamos fazer analogias (por exemplo: o ponteiro e o atalho oferecem maneiras de chegar a um objeto original na memória ou no sistema de arquivos, respectivamente, e eles próprios podem ocupar espaço, respectivamente, na memória ou no disco, ondes esses apontamentos possam ser armazenados). Mas, sendo coisas distintas e com propósitos distintos, nenhuma entre eles será analogia será perfeita (por exemplo: um atalho é uma entidade presente no disco; um ponteiro nem sempre será explicitamente armazenado numa região de memória dedicada a ele).

Como o programa não pode ler o arquivo sem algum comando, parece que o ponteiro indicaria onde o arquivo está para ele ser lido.


É mais complexo que isso. Na verdade, o tipo “FILE” de <stdio.h> esconde um dado composto de múltiplos campos diferentes, que normalmente são preenchidos quando se chama fopen() para receber um objeto que representa um tipo de interação com o sistema operacional. Internamente, dados desse tipo contêm informações tais como:

  • uma representação para que o sistema operacional possa manipular o objeto;

  • quais operações são possíveis sobre ele (leitura, escrita, operações de terminal e possivelmente outras, dependendo do sistema envolvido);

  • indicadores de possíveis erros e estado da última operação válida;

  • buffers de entrada e/ou saída;

  • índíces que indicam a última posição a que se fez a acesso e/ou próxima posição a aceder no buffer e/ou no próprio objeto do sistema operacional;

  • etc.

Acho que no caso do fgets abaixo, ele deve ter instruções para acessar VIA ATALHO no caso o ponteiro, o arquivo verdadeiro do seu computador para então ler as linhas do arquivo. talvez por isso que qdo você tentou ler a variável ela é vazia, pq não é um armazenador de nada, e sim apenas um atalho para outro lugar.


Num sistema como o UNIX ou Linux, tipicamente o ponteiro para dado do tipo FILE contém um descritor de arquivo fornecido pelo sistema operacional e informações sobre buffers em memória. Quando se chama fgets() ou qualquer outra função de leitura, a função primeiro examina se o buffer em memória contém os dados solicitados. Se os contiver, copia os dados para o local indicado pelo usuário e retira esses dados do buffer. Se faltarem dados no buffer, uma operação de leitura a partir do arquivo é solicitada ao sistema operacional, de modo a encher de novo todo o buffer, mesmo que isso exceda a quantidade de dados solicitada pelo usuário, na esperança de que uma próxima operação de leitura não tenha de ir ao disco de novo (porque ir ao disco é sempre uma operação custosa).

Caso, ao longo do processo, alguma dessas operações falhe, como por se ter atingido o fim do arquivo ou o sistema operacional ter encontrado um erro, os respectivos campos sinalizadores dessas condições são preenchidos no dado do tipo FILE indicado pelo ponteiro (que, no caso de fgets(), é passado como seu terceiro argumento).

Bom, como eu disse, eu não sei a resposta, apenas escrevi o que parece ser para mim, outras pessoas vão te ajudar com explicações verdadeiras sobre a questão.


Espero que eu tenha sido bem sucedido nesse mister.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. Re: Dúvida de iniciante sobre um ponteiro

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 23/02/2019 - 13:00h

Amigo, não me leve a mal, na boa mesmo, mas se está com essa dúvida é porque deve voltar aos livros e estudar mais. Acredito que haja bons materiais na internet. Não creio que vá aprender programação por meio de fóruns - a esses se deve recorrer em último caso e quando se tem uma dúvida específica e bem definida. Nem sempre os foristas dispostos a ajudar - e os há em grande número - terão tempo ou paciência para ministrar verdadeiras aulas. Que eu seja bem entendido então: não estou a dizer que não pode ou não deve ir a fóruns com dúvidas como essa, claro que pode. Mas penso que quase nunca terá o feedback esperado.

Sobre sua dúvida: Com a declaração, você não está lendo o arquivo, inteiro ou parte dele. E também não criou atalho algum, apesar de que essa idéia não seja de toda errada. O que fopen faz é receber como argumentos as strings nome do arquivo (o endereço dele tal como o localiza o sistema operacional) e modo de abertura (o uso que pretende fazer do arquivo: leitura, escrita...) e devolver, em caso de sucesso na abertura, um apontador ao arquivo aberto e será com esse ponteiro que a partir de então o programa passará a manipular o arquivo.




4. Re: Dúvida de iniciante sobre um ponteiro [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 23/02/2019 - 14:43h

DeuRuimDotCom escreveu: Amigo, não me leve a mal, na boa mesmo, mas se está com essa dúvida é porque deve voltar aos livros e estudar mais.

Eu continuo estudando, e livros não tiram dúvidas! Não pense que já não li mais de 200 livros sobre o C sozinho, a maioria em inglês idioma que não domino! Já li inúmeros artigos sobre ponteiros e variáveis, que apenas ensinam como declarar ou fazer, sem nenhuma explicação mais a fundo de como funciona de verdade!

Não creio que vá aprender programação por meio de fóruns

Então está dizendo pra mim que se eu não pagar um Curso de C em uma Escola Particular, eu nunca conseguirei aprender C?

Nem sempre os foristas dispostos a ajudar

Desculpe-me mas discordo completamente dessa sua afirmação, neste mesmo fórum vejo muitas pessoas com muito carinho e boa vontade em ajudar, assim como eu sempre ajudei a responder dúvidas em outros assuntos em muitos fóruns da internet. E nunca me faltou disposição para ajudar ninguém!

Sobre sua dúvida: Com a declaração, você não está lendo o arquivo, inteiro ou parte dele. E também não criou atalho algum, apesar de que essa idéia não seja de toda errada. O que fopen faz é receber como argumentos as strings nome do arquivo (o endereço dele tal como o localiza o sistema operacional) e modo de abertura (o uso que pretende fazer do arquivo: leitura, escrita...) e devolver, em caso de sucesso na abertura, um apontador ao arquivo aberto e será com esse ponteiro que a partir de então o programa passará a manipular o arquivo.

Desculpe mas ainda não entendi o que quis dizer em sua explicação. Esse é o problema, entender o que estão explicando!

Vc diz:
O que fopen faz é receber como argumentos as strings nome do arquivo (o endereço dele tal como o localiza o sistema operacional)
você não está lendo o arquivo, inteiro ou parte dele. E também não criou atalho algum

Não faz sentido algum isso pra mim, Pq se o fopen não está lendo NADA quem é que está passando o TEXTO do arquivo para a variável ponteiro (MeuArquivo)? Pq não existe outro comando junto desse!
Outra coisa ele não está passando nenhum nome de arquivo como você diz, pq se fosse assim o conteúdo da variável seria o nome do arquivo e não o texto dentro do arquivo.
Também não entendi sobre o que o Sistema Operacional tem a ver com isso?

Sobre o Modo de Abertura eu sei o que é! Não seria essa a dúvida!
Eu perguntei sobre a variável ponteiro (MeuArquivo). Quero entender melhor sobre o ponteiro. Já li sobre isso muitas vezes e todo mundo explica que um Ponteiro é um Ponteiro, um Apontador, ou seja ele é nada mais que um atalho! E isso não acho que está bem explicado! Não me parece exatamente uma explicação do que ele É de como ele funciona!


5. Re: Dúvida de iniciante sobre um ponteiro

Steve
Steve

(usa Slackware)

Enviado em 23/02/2019 - 15:12h

Eu também sou iniciante como você e nunca entendi de verdade o que é um ponteiro.

Eu acredito que ponteiros sejam exatamente o que dizem. Eles não recebem nenhum valor e não fazem nada. São apenas um atalho do programa para um objeto no sistema operacional, igual mesmo um atalho do windows.
Como o programa não pode ler o arquivo sem algum comando, parece que o ponteiro indicaria onde o arquivo está para ele ser lido.

Acho que no caso do fgets abaixo, ele deve ter instruções para acessar VIA ATALHO no caso o ponteiro, o arquivo verdadeiro do seu computador para então ler as linhas do arquivo. talvez por isso que qdo você tentou ler a variável ela é vazia, pq não é um armazenador de nada, e sim apenas um atalho para outro lugar.

Bom, como eu disse, eu não sei a resposta, apenas escrevi o que parece ser para mim, outras pessoas vão te ajudar com explicações verdadeiras sobre a questão.


6. Re: Dúvida de iniciante sobre um ponteiro [RESOLVIDO]

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 23/02/2019 - 15:51h

Nick-us escreveu:

DeuRuimDotCom escreveu: Amigo, não me leve a mal, na boa mesmo, mas se está com essa dúvida é porque deve voltar aos livros e estudar mais.

Eu continuo estudando, e livros não tiram dúvidas! Não pense que já não li mais de 200 livros sobre o C sozinho, a maioria em inglês idioma que não domino! Já li inúmeros artigos sobre ponteiros e variáveis, que apenas ensinam como declarar ou fazer, sem nenhuma explicação mais a fundo de como funciona de verdade!

Não creio que vá aprender programação por meio de fóruns

Então está dizendo pra mim que se eu não pagar um Curso de C em uma Escola Particular, eu nunca conseguirei aprender C?

Nem sempre os foristas dispostos a ajudar

Desculpe-me mas discordo completamente dessa sua afirmação, neste mesmo fórum vejo muitas pessoas com muito carinho e boa vontade em ajudar, assim como eu sempre ajudei a responder dúvidas em outros assuntos em muitos fóruns da internet. E nunca me faltou disposição para ajudar ninguém!

Sobre sua dúvida: Com a declaração, você não está lendo o arquivo, inteiro ou parte dele. E também não criou atalho algum, apesar de que essa idéia não seja de toda errada. O que fopen faz é receber como argumentos as strings nome do arquivo (o endereço dele tal como o localiza o sistema operacional) e modo de abertura (o uso que pretende fazer do arquivo: leitura, escrita...) e devolver, em caso de sucesso na abertura, um apontador ao arquivo aberto e será com esse ponteiro que a partir de então o programa passará a manipular o arquivo.

Desculpe mas ainda não entendi o que quis dizer em sua explicação. Esse é o problema, entender o que estão explicando!

Vc diz:
O que fopen faz é receber como argumentos as strings nome do arquivo (o endereço dele tal como o localiza o sistema operacional)
você não está lendo o arquivo, inteiro ou parte dele. E também não criou atalho algum

Não faz sentido algum isso pra mim, Pq se o fopen não está lendo NADA quem é que está passando o TEXTO do arquivo para a variável ponteiro (MeuArquivo)? Pq não existe outro comando junto desse!
Outra coisa ele não está passando nenhum nome de arquivo como você diz, pq se fosse assim o conteúdo da variável seria o nome do arquivo e não o texto dentro do arquivo.
Também não entendi sobre o que o Sistema Operacional tem a ver com isso?

Sobre o Modo de Abertura eu sei o que é! Não seria essa a dúvida!
Eu perguntei sobre a variável ponteiro (MeuArquivo). Quero entender melhor sobre o ponteiro. Já li sobre isso muitas vezes e todo mundo explica que um Ponteiro é um Ponteiro, um Apontador, ou seja ele é nada mais que um atalho! E isso não acho que está bem explicado! Não me parece exatamente uma explicação do que ele É de como ele funciona!


Não sou programador profissional, aprendi C lendo livros e, principalmente, codificando. Nunca paguei por cursos. Respeito muito sua opinião, pois sei que cada um deve seguir seus próprios caminhos, e desejo-lhe boa sorte!




7. Re: Dúvida de iniciante sobre um ponteiro [RESOLVIDO]

Fernando A. Vita
fernandoavita

(usa Debian)

Enviado em 23/02/2019 - 17:59h

Nick-us, eu não sei responder sua pergunta, mas talvez eu possa adicionar alguns elementos que te coloquem mais pra frente no caminho de encontrar a resposta.

De antemão eu queria dizer que uma vantagem das linguagens de programação é que ela abstrai o computador para o programador, ou seja, o usuário não precisa saber como o computador funciona para saber programar. O que eu quero dizer com isso é ainda há muita "mágica" por trás de um simples programa em C e acho compreensível o fato dos livros de programação não incluírem tantos detalhes sobre o baixo nível de um computador.

Posso te dizer com certeza que quando você declara uma variável do tipo ponteiro, do tipo char ou int, o compilador alocará um espaço na memória para cada uma delas, e dentro destes espaços você pode colocar o valor que você quiser. Entretanto, o compilador espera que você coloque um endereço de memória na variável ponteiro, um valor ASCII na variável char e um inteiro na variável int.

Em resumo, um ponteiro é uma variável que armazena valores assim como qualquer outra.

O ponteiro para o tipo FILE não é diferente. Trata-se de uma variável cujo conteúdo informa qual o endereço do primeiro byte da estrutura do tipo FILE (caso ainda não tenha estudado estruturas, pesquisa por estruturas em C). Por curiosidade colei aqui uma definição da struct FILE que encontrei na net.

typedef struct {
unsigned char *_ptr;
int _cnt;
unsigned char *_base;
unsigned char *_bufendp;
short _flag;
short _file;
int __stdioid;
char *__newbase;
#ifdef _THREAD_SAFE
void *_lock;
#else
long _unused[1];
#endif
#ifdef __64BIT__
long _unused1[4];
#endif /* __64BIT__ */
} FILE;


Voltando a pergunta, como é que funciona a leitura de um arquivo? Isso eu não sei responder, eu só sei que seu programa não consegue acessar o arquivo diretamente. Na realidade ele faz uma chamada de sistema (System call) pedindo para que o sistema operacional leia o arquivo e coloque o conteúdo em uma região de memória que você pode ler.

Acredito que funções como o fopen ou fread além de entender e manipular a estrutura do tipo FILE, elas em algum momento devem fazer requisições ao sistema operacional através do syscall.

Apenas repetindo, no fim das contas, o fopen retorna o endereço da posição de memória onde a estrutura FILE está. Sua variável MyFile apenas armazena esse endereço de memória.


8. Re: Dúvida de iniciante sobre um ponteiro [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 23/02/2019 - 20:29h

paulo1205 escreveu:

A Resposta que vc deu ao Steve, abriu um Leque de novos estudos! Sua explicação sobre FILE me fez perceber que por trás de um pequeno objeto tem um mundo de coisas.
Também agradeço pelos inúmeros exemplos dados detalhados tipo: unário &
Eu nunca iria saber o nome desse operador, pq nunca vi isso no material que li.
Uma verdadeira Aula.

Não sei se pode responder, mas por acaso vc saberia porque o GDB ou o Eclipse informa um valor vazio?
Ou se neste caso por ser um Ponteiro eu deveria ler o espaço na memória alocado? Tipo não sei se é a pergunta certa! Mas compreendi que talvez essas respostas estejam no tipo FILE neste caso específico. E não exatamente no ponteiro!

De qualquer forma, farei mais testes, tipo inicialmente declarando tipos simples (char, int) com ponteiros, talvez me ajude na compreensão para entender esses valores. Até pq acho que tipos simples creio que informem valor de forma normal.
E talvez no FILE isso ainda dependa como vc falou de seus elementos internos, que estudarei depois.




9. Re: Dúvida de iniciante sobre um ponteiro

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/02/2019 - 21:23h

Nick-us escreveu:

Também agradeço pelos inúmeros exemplos dados detalhados tipo: unário &
Eu nunca iria saber o nome desse operador, pq nunca vi isso no material que li.
Uma verdadeira Aula.


Talvez agora eu tenha entendido de modo errado, e peço desculpas se o tiver feito, mas me pareceu que você entendeu que o nome do operador é “unário”.

Se for o caso, quero esclarecer que não é isso. O que ocorre é que, em C, o operador & é usado em dois contextos diferentes: ele pode receber dois argumentos (um operador binário, portanto) para calcular o valor do e-lógico bit-a-bit dos seus dois operandos (por exemplo: “a & b”), ou pode ser usado num contexto de ter um operando só (por isso se diz que é unário), para obter o endereço do seu único argumento (por exemplo: “&a”).

O nome do operador, se é que se pode falar em termos de nome, normalmente reflete a operação realizada: quando como operador binário, seria o “operador de e-lógico bit-a-bit”; no modo unário, seria o “operador de obtenção de endereço” ou “operador de indireção” (porque acessos via endereço, em lugar do nome da variável, são ditos acessos indiretos).

Não sei se pode responder, mas por acaso vc saberia porque o GDB ou o Eclipse informa um valor vazio?


Em que situação? Pode mostrar o trecho de código?

Ou se neste caso por ser um Ponteiro eu deveria ler o espaço na memória alocado? Tipo não sei se é a pergunta certa! Mas compreendi que talvez essas respostas estejam no tipo FILE neste caso específico. E não exatamente no ponteiro!


O tipo FILE tem realmente o propósito de esconder toda a complexidade interna referente a acesso a arquivos, de modo a evitar que o programador se sinta tentado a interferir com eventuais operações de baixo nível e, com isso, acabar atrapalhando (e se atrapalhando com) tais operações. Além disso, ao esconder especificidades de cada sistema, fica mais fácil levar o programa para outros sistemas diferentes, e mesmo assim conseguir o mesmo comportamento. É por isso que nós, aqui neste fórum voltado primeiramente a Linux, podemos ajudar e ser ajudados uns pelos outros, usem alguns de nós Linux, Windows, BSD, MS-DOS, MacOS, Solaris ou qualquer outro sistema.

Assim, eu não entendi o que você gostaria de ver no GDB/Eclipse. Se você puder explicar melhor, eu agradeço.

De qualquer forma, farei mais testes, tipo inicialmente declarando tipos simples (char, int) com ponteiros, talvez me ajude na compreensão para entender esses valores. Até pq acho que tipos simples creio que informem valor de forma normal.


O que você quer testar, e o que você gostaria de observar?

E talvez no FILE isso ainda dependa como vc falou de seus elementos internos, que estudarei depois.


Eu não sei se vale a pena mexer com isso, a não ser que você queira muito aprender como a biblioteca de entrada e saída funciona por dentro.

Se for o caso, pode ser útil ler o código de uma implementação da parte de I/O da biblioteca padrão — e eis uma vantagem de sistemas de código aberto. Alternativamente, você poderia tentar implementar uma biblioteca de I/O alternativa, em que você criaria as interfaces com o usuário final e cuidaria de transformar as operações do usuário em operações do seu sistema operacional.

Outra possibilidade, se você não se importar de usar C++, em vez de C, é se valer do fato que a biblioteca de I/O do C++ abre espaço para você criar seus próprios mecanismos de transformação entre as operações que o usuário vê e aquelas que o sistema operacional (ou alguma outra camada intermediária) vai receber, ao invés de lhe impor um único modelo monolítico, como faz o C. Isso torna mais fácil não apenas o estudo, mas também a criação de coisas novas.

Eu, por exemplo, uma vez fiz uma classe derivada de std::stream que compactava dados com o mesmo algoritmo de utilitário gzip, e tudo o que eu tive de fazer para que um programa preexistente passasse a gerar conteúdo compactado, em lugar de texto puro, foi acrescentar uma linha no código (um “#include” do arquivo de cabeçalhos da minha classe) e alterar uma outra linha (a que fazia a abertura do arquivo, de modo a usar o meu streambuf derivado, em lugar do que vem por padrão associado a arquivos). Se eu tivesse tido de fazer o mesmo em C, eu teria tido de trocar todas as operações de escrita ao longo do programa, de printf()/fprintf() para zprintf(), de putchar()/fputc() para zputc(), de puts()/fputs() para zputs(), e assim sucessivamente.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


10. Re: Dúvida de iniciante sobre um ponteiro [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 24/02/2019 - 00:23h

paulo1205 escreveu: Talvez agora eu tenha entendido de modo errado, e peço desculpas se o tiver feito, mas me pareceu que você entendeu que o nome do operador é “unário”.
Sim, mas obrigado por explicar, corrigindo o meu mau entendimento!

Não sei se pode responder, mas por acaso vc saberia porque o GDB ou o Eclipse informa um valor vazio?
Em que situação? Pode mostrar o trecho de código?

Nessa minha pergunta, eu identifiquei meu erro. Na verdade a variável tinha um valor, não era vazio. Isso é após o MyFile receber o arquivo aberto.

O que você quer testar, e o que você gostaria de observar?

Com todas essas informações que recebi, eu vou escrever ponteiros, para ler como ele recebe seus valores, e ver onde eles serão importantes para mim, quando devo usá-los em meu código, coisas assim. Mas então eu ainda teria que ter as dúvidas, que acredito que somente terei qdo aparecer os problemas!

Eu não sei se vale a pena mexer com isso, a não ser que você queira muito aprender como a biblioteca de entrada e saída funciona por dentro.

Sim, eu sei que em si é complexo, inclusive em um caso que fui procurar em uma biblioteca a existência de um comando inclusive baseado em uma resposta que vc deu a um usuário, no uso do wchar_t, então vi a existência do comando _wfopen porém não achei isso no Linux na biblioteca wchar.h logo não pude usar.

Mas de qualquer forma, Agradeço mesmo a todos pelas respostas, porque me ajudaram muito mesmo! Agora tenho que estudar mais, testar mais, tentar mais, para ter mais dúvidas se for o caso!








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts