Ir ao conteúdo
  • Cadastre-se

C Ponteiro de ponteiro em expressões


Lipeco

Posts recomendados

47 minutos atrás, arfneto disse:

Isso está ficando bem fora do tópico. Mas de todo modo entenda que isso não se aplica a main(), não há qualquer desperdício de memória e se tivesse não seria com assinaturas exceto pelo tempo de compilação.

Discordo que esteja pouco fora do tópico. É  o contrário... a discussão é pertinente não somente às dúvidas com ponteiros: fragilidade, riscos e problematização de programar com linguagem de baixo nível igual à linguagem C (objeto primeiro da discussão), como também expressa importantes informações acerca de compiladores, protótipos de função, desperdício de memória, experimento de sintaxe, etc.

 

A verdade, é que tudo está relacionado.

 

 

 

47 minutos atrás, arfneto disse:

Entenda: ao chamar o programa o sistema operacional monta o bloco de parâmetros. Mesmo que o programa tenha especificado int main(void) ou int main() se o programa for executado com 12 parâmetros o sistema vai montar o bloco todo, com 12+2, e empilhar o endereço de retorno, carregar o programa na memória e iniciar a execução em main().

Ou seja, a main não difere muito de outras funções: se tem argumento são alocados, senão... obvio não se reserva nada, tal qual todas as outras funções... logo quem programou o compilador tem razão, como é de se esperar.

 

 

 

47 minutos atrás, arfneto disse:

Não entendi a evidência de que seja eu mais velho

A escolha de palavras é típica de pessoa com muito idade (pensando bem isso não é preconceito é conceito), mas se ficou ofendido, eu retiro o que disse e permaneço dizendo que, refira-se ao meu nick name do mesmo modo que faz com os outros.

 

 

47 minutos atrás, arfneto disse:

A norma estabelece que o bloco de parâmetros seja seguido por um NULL. Foi isso que eu quis dizer e mostrei até o texto da normal. Apenas não traduzi.

De fato, não há nada de especial, muito comum.

🙂 

 

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

37 minutos atrás, mauro_b disse:

Ou seja, a main não difere muito de outras funções: se tem argumento são alocados, senão... obvio não se reserva nada, tal qual todas as outras funções... logo quem programou o compilador tem razão, como é de se esperar

 

Ao contrário, difere totalmente das outras funções. É o entry point do processo. É o único caso em que o compilador não vai gerar código para empilhar os parâmetros antes de chamar a função.

 

Como te disse, se cria o programa com int main(void) e chamar com 12 parâmetros o sistema vai montar os 14 ponteiros. Só nesse caso, porque main(0 é o entry point.

 

Se chamar main() recursivamente, como eu mostrei aqui semanas atrás, vai ter que montar o bloco por sua conta se declarou parâmetros.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

25 minutos atrás, arfneto disse:

Ao contrário, difere totalmente das outras funções. É o entry point do processo. É o único caso em que o compilador não vai gerar código para empilhar os parâmetros antes de chamar a função.

Como te disse, se cria o programa com int main(void) e chamar com 12 parâmetros o sistema vai montar os 14 ponteiros. Só nesse caso, porque main(0 é o entry point.

Se chamar main() recursivamente, como eu mostrei aqui semanas atrás, vai ter que montar o bloco por sua conta se declarou parâmetros.

Penso que talvez esclareça melhor se falar o que significa não usar um variável|parâmetro|argumento?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

A norma é complicada ou será que precisa de hábitos de leitura para acostumar com seu conteúdo, é muito formal|normal

Caso tenha "leiteiros" iguais a mim que também não clicam em links de postagem, mas curte imagens|recortes de uma Normal (rascunho de Normal 2021), segue abaixo. Capturar_main.PNG.3d2e37e91361ef62b0c4333d4f08af7a.PNGCapturar_main_vazio.PNG.887fb2cf3f9e6fcf6c5a48ed138062e5.PNG

Cansei de encontrar exemplos com argumento vazio ou indeterminado, nenhum desses exemplos tinha por objetivo escrever chamada recursiva da int main! A impressão que tiro dos exemplos é educar para não declarar desnecessariamente parâmetros|variáveis.

 

 

Capturar1.PNG.e74ce5c4f1e38b0c1e44cfd85bf3da3f.PNG

Esse recorte é do especificar de impressão "%p"

[Tradução]:

Citação

O argumento deve ser um ponteiro para vazio. O valor do ponteiro é convertido para uma sequência de caracteres de impressão, de maneira definida pela implementação.

Logo, se ativa o alerta (avisos) o compilador deve ter uma recomendação semelhante.

 

Mas, curioso mesmo é a Norma deixar a impressão por conta da implementação, porque algumas podem corretamente escrever 0x... e outras não, daí fica o questionamento... não por quê?

image.png.c8808cf1cf0dc9d8eabd01d479573150.png

 

🙂 - ???

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

13 minutos atrás, mauro_b disse:

Cansei de encontrar exemplos com argumento vazio ou indeterminado, nenhum desses exemplos tinha por objetivo escrever chamada recursiva da int main! A impressão dos exemplos é o obvio: não declarar desnecessariamente parâmetros|variáveis.

 

Entenda @mauro_b que isso nada tem a ver com C. Não adianta procurar exemplos na norma iso C. O que tinha lá na norma nesse tema eu já reproduzi aqui: program startup, item 5.1.2.2.1. 

 

Quando você vai lá e digita

 

x 1 2 clube do hardware

 

na linha de comando para rodar o tal x entenda que x pode ser um script ou um programa em C ou COBOL ou java ou pode nem existir.

 

É o sistema operacional que monta o bloco de 7 ponteiros e tenta achar x e passar para ele um inteiro sem sinal com o valor 6 e sete ponteiros para char. O primeiro apontando para o nome completo de x no disco, os 5 seguintes apontando para strings null-terminated com os parâmetros e o último com zeros.

 

NADA  tem a ver com C.

 

21 minutos atrás, mauro_b disse:

Cansei de encontrar exemplos com argumento vazio ou indeterminado, nenhum desses exemplos tinha por objetivo escrever chamada recursiva da int main! 

 

Como te disse eu mesmo postei um exemplo aqui, completo, semanas atrás. Não precisaria procurar tanto.

 

Mas é só uma curiosidade. Não consigo imaginar uma razão séria para fazer isso a não ser uma aposta. 🙂 E eu ganhei umas assim. 😉 

 

24 minutos atrás, mauro_b disse:

A impressão dos exemplos é o obvio: não declarar desnecessariamente parâmetros|variáveis.

 

Não é só o caso de não ser necessário. Havia uma preocupação em algum momento com a possibilidade da injeção de código malicioso quando main é declarada main(). Outras linguagem como java e C++ não aceitariam, mas C aceita qualquer número de parâmetros nesse caso e por isso tem essa recomendação na norma. 

 

45 minutos atrás, mauro_b disse:

Mas, curioso mesmo é a Norma deixar a impressão por conta da implementação, porque algumas podem corretamente escrever 0x... e outras não, daí fica o questionamento... não por quê?

 

É parte da filosofia do Unix de modo geral. C foi escrita pelas mesmas pessoas que escreveram o Unix inicialmente. %p retorna o endereço, nada mais. Sempre é possível colocar um prefixo "0x" mas nem sempre se quer um prefixo. E tirar é mais chato. O destino da saída de um fprintf ou de um printf() pode não ser uma tela ou um texto.

 

A filosofia de C é de não ficar no caminho do desenvolvedor e não de facilitar a vida do aprendiz com um programa de console. Poucos programas C fora desse ambiente de aprendizado tem saída numa tela afinal. 

 

 

 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

Entenda @mauro_b que isso nada tem a ver com C. Não adianta procurar exemplos na norma iso C. O que tinha lá na norma nesse tema eu já reproduzi aqui: program startup, item 5.1.2.2.1. 

Não faz sentiddo uma norma iso C, não ter nada a ver com C.

Então, que tivesse dito com o que tem a ver, senão com C. Com Java, tudo tem a ver com JAVA mesmo 😄 

image.thumb.png.5c9103b4f9283f4be9e5756389584fe6.png

 

1 hora atrás, arfneto disse:

uando você vai lá e digita

 

x 1 2 clube do hardware

 

na linha de comando para rodar o tal x entenda que x pode ser um script ou um programa em C ou COBOL ou java ou pode nem existir.

 

É o sistema operacional que monta o bloco de 7 ponteiros e tenta achar x e passar para ele um inteiro sem sinal com o valor 6 e sete ponteiros para char. O primeiro apontando para o nome completo de x no disco, os 5 seguintes apontando para strings null-terminated com os parâmetros e o último com zeros.

OK! Mas, como isso explica o porquê declarar ou não parâmetros na função main, caso tenha sido uma tentativa de explicar refaço a pergunta.

Qual o sentido para declarar parâmetro|variável e não utilizá-la?

 

 

 

 

1 hora atrás, arfneto disse:

Como te disse eu mesmo postei um exemplo aqui, completo, semanas atrás. Não precisaria procurar tanto.

Mas é só uma curiosidade. Não consigo imaginar uma razão séria para fazer isso a não ser uma aposta. 🙂 E eu ganhei umas assim. 😉 

Ata! Também não, por isso perguntei talvez tivesse algo a mais especialista, porém não há razão fundamental.

 

 

 

 

1 hora atrás, arfneto disse:

Não é só o caso de não ser necessário. Havia uma preocupação em algum momento com a possibilidade da injeção de código malicioso quando main é declarada main(). Outras linguagem como java e C++ não aceitariam, mas C aceita qualquer número de parâmetros nesse caso e por isso tem essa recomendação na norma. 

Ainda sim, não existem parâmetros (na função), não difere tanto assim de int main (void).

 

 

 

 

1 hora atrás, arfneto disse:

É parte da filosofia do Unix de modo geral. C foi escrita pelas mesmas pessoas que escreveram o Unix inicialmente. %p retorna o endereço, nada mais. Sempre é possível colocar um prefixo "0x" mas nem sempre se quer um prefixo. E tirar é mais chato. O destino da saída de um fprintf ou de um printf() pode não ser uma tela ou um texto.

 

A filosofia de C é de não ficar no caminho do desenvolvedor e não de facilitar a vida do aprendiz com um programa de console. Poucos programas C fora desse ambiente de aprendizado tem saída numa tela afinal. 

Ok! Mas, que justificativa é essa (principalmente porque não entendi).

Então, experimentemos isso fora do prompt, e daí será que essa tal filosofia|religião tem mais adeptos (online).

 

Por exemplo, com solicitação na impressão de arquivo.

image.thumb.png.1ca3262b5010fd82eedbc47542e71641.png

 

Outro no prompt

image.thumb.png.24834c787178de7ef304817d8c226ebb.png

🙂  — Filosofia...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

28 minutos atrás, mauro_b disse:

Como é possível... norma iso C, não ter nada a ver com C!!!

Então responda tem a ver com que, senão com C? Com Java tudo tem a ver com JAVA. 😄

 

@mauro_b o que não tem a ver com C é o que já expliquei umas 3x acima: quem monta o bloco inicial de argumentos para o programa não é C e sim o sistema operacional.

 

Vou repetir:

 

Se você roda no terminal, como expliquei

 

    x 1 2 Clube do Hardware

 

o sistema não sabe o que é x, nem sabe se ele existe. NADA tem a ver com C. se por acaso for um executável e tivesse ele sido escrito em C com int main(void) os parâmetros não vão servir de nada, mas o programa vai rodar. 

 

main() é absolutamente diferente em C porque é o entry point de um programa de console: o sistema é que monta e passa para o processo o bloco de argumentos.

 

34 minutos atrás, mauro_b disse:

Qual o sentido para declarar parâmetro e variáveis em um programa e não utilizar?

 

main() pode ser um esqueleto para um sistema complexo que pode ou não usar esses argumentos, e o programa só é recompilado quando necessário. Se numa execução os argumentos são importantes algum módulo do programa vai receber e tratar isso. Se declarar como main(void)  só vai eventualmente perder a oportunidade.

 

Entenda que de qualquer maneira o sistema vai montar isso. Nada tem a ver com C.

 

37 minutos atrás, mauro_b disse:

Ok! Mas, que justificativa é essa (principalmente porque não entendi).

 

É como o princípio de única responsabilidade --- SRP --- e se imagina que %p gera uma string que é o valor do endereço, como no exemplo lá atrás: AABBCCDD os 4 bytes para um endereço em 32 bits. Nada mais. Porque o desenvolvedor não sabe para que vai ser usado esse valor. Podia entrar numa pilha de endereços e serem operados, somados, sei lá. E o prefixo vai dar *****. E se vier um prefixo que pode parecer correto num lugar ele pode ser um tremendo porre num outro. Qual a função do %p? mostrar o endereço. 8 bytes para 32 bits, 64 para 64 bits. Numa tela com um título e umas 50 linhas com endereços um designer pode não querer os tais "0x" repetidos em TODAS as linhas mas apenas no título por exemplo. Um outro cara pode querer "Hex" como prefixo. 

 

O melhor é não assumir nada e cumprir o papel do %p. SRP é um princípio importante em desenvolvimento.

 

Não é ideia minha. Só estou dizendo que é assim. 

 

49 minutos atrás, mauro_b disse:

Então, vamos experimentar algo fora do prompt, e aposta que essa tal filosofia|religião|espiritismo ainda vigore

 

Não entendi. O ponto dessa discussão, ao menos o que estou explicando, não é exatamente com o prompt, mas com a criação de processos num sistema operacional e a passagem dos parâmetros iniciais para o processo. O exemplo do prompt é só um caso particular mais simples de entender.

 

Veja no Linux man execve e talvez ajude a entender.

 

o sistema vai entregar para o processo o bloco de parâmetros. O fato de ser por acaso um programa em C  com ou sem argumentos declarados em main não muda nada. E a norma ISO C também não muda nada.

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

9 minutos atrás, arfneto disse:

o que não tem a ver com C é o que já expliquei umas 3x acima: quem monta o bloco inicial de argumentos para o programa não é C e sim o sistema operacional.

Tá! Mas, essa é uma resposta a uma pergunta que ser que fiz.

 

 

9 minutos atrás, arfneto disse:

main() pode ser um esqueleto para um sistema complexo que pode ou não usar esses argumentos, e o programa só é re

compilado quando necessário. Se numa execução os argumentos são importantes algum módulo do programa vai receber e tratar isso. Se declarar como main(void) 

Bom! O mesmo que entendi, não a razão para escrever main com parâmetros em sistemas simples ou quando não pretende utilizar.

 

🙂 — Legal!

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

59 minutos atrás, mauro_b disse:

Um compilador online com solicitação na impressão de arquivo

 

Pois é: um compilador online só acrescenta o online.

 

O padrão dessas coisas é o compiler explorer e veja um pedaço da tela abaixo

 

image.png.5cc14be30e16cbf0b45766198f42436b.png

 

Eu não uso outro, só esse --- como muita gente --- e para avaliar a geração de código entre várias versões de compilador e cpu e opções de otimização.

 

E são dezenas de compiladores diferentes. O online não muda nada. Continua sendo por exemplo o x86-84 gcc 8.2 se é esse o compilador de que você precisa no momento. E onde a norma diz que é implementation defined assim é. E onde diz que é undefined behavior assim é. E o que muda a saída é a opção pelo compilador de que você precisa.

 

Se um deles coloca um %$#%#$ de um 0x na frente do endereço e na sua tela tem um título escrito "HEX ADDR"  você pode não querer um "0x" em todas as linhas da tela que pode ter 30 colunas com outros dados. Só vai poluir as coisas e gastar espaço.

 

E se o designer disse que na tela dee sair Hex 34F565C0 e não 0x 34F565C0 você vai ter que reprocessar essa m. toda ou reescrever essa função. E é óbvio que o endereço é 34F565C0 e você vai ver que SRP tem sentido e a falta dele pode e gera problemas.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Esse é um exemplo que postei meses atrás aqui com uma função main recursiva.

 

Um desktop comum hoje em dia pode rodar uns milhares de chamadas assim.

 

#define COL 50 
#define PONTO 10
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
    if (argc != 3)
    {
        printf("Use: \"programa contador limite\"\n");
        return -1;
    }
    unsigned vez = abs(atoi(argv[1]));
    unsigned limite = abs(atoi(argv[2]));
    char*    contador = NULL;
    char*    str_limite = NULL;
    if (vez == 1) printf("\n%6d:\t", 0);

    while (1)
    {
        // chegou ao limite?
        vez += 1;
        if (vez > limite)
        {
            printf("\nCiclo completo: %d chamadas\n", limite);
            return limite;
        };
        // não terminou: prepara argumentos e chama de novo
        str_limite = malloc(8);
        sprintf(str_limite, "%d", limite);
        contador = malloc(8);
        sprintf(contador, "%d", vez);

        char* p[3] = {argv[0], contador, str_limite};
        if (vez%PONTO == 0) printf(".");
        if (vez%(PONTO*COL) == 0) printf("\n%6d:\t",vez);
        int res = main(3, p);
        free(contador);
        free(str_limite);
        return 0;
    };
};

 

 

1 minuto atrás, mauro_b disse:

Poise, eu também!

 

E sabe que o compilador online é um compilador comum escolhido no menu e escrito conforme a norma.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 minutos atrás, arfneto disse:

E sabe que o compilador online é um compilador comum escolhido no menu e escrito conforme a norma.

Está dizendo que as versões instaladas (compiladores) não são escritas conforme uma norma!

Esse comentário ficou estranho.

 

🙂 — para mim já temos o bastante de discussão sobre main, parâmetros, argumentos e variáveis não utilizadas.

FUI!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

8 horas atrás, mauro_b disse:

Está dizendo que as versões instaladas (compiladores) não são escritas conforme uma norma!

Esse comentário ficou estranho

 

Bem, "e" é uma conjunção e a sentença une duas afirmações. O que estou tentando dizer é que se você @mauro_busa o compiler explorer então sabe que o fato de usar um compilador online não muda nada do que está sendo discutido: trata-se de um compilador que poderia estar instalado em seu equipamento. Apenas vai facilitar comparar coisas. Como por exemplo o que cada um deles faz com o especificador %p no printf() que te deixou contrariado. Thanks Matt Godbolt 😉 


Não vi nas telas que mostrou referência à versão de compilador que usou no Compiler Explorer ou no ReplIt então não ficou clara a razão de ter usado um compilador online ou dois afinal

 

Espero que quem quer que tenha acompanhado isso e os exemplos tenha entendido

  • uma possível razão para %p apenas gerar o endereço e a ideia de SRP nesse contexto
  • main() pode ser chamada recursivamente, mesmo sendo provavelmente inútil e perigoso
  • o fato de ser main completamente diferente de outras funções --- ao contrário do que você tinha dito --- porque é o entry-point do programa e quem monta o bloco de parâmetros é o sistema operacional de modo que não há desperdício em termos de memória ou algo assim. No máximo talvez por alguns ms em tempo de compilação. E isso nada tem a ver com a norma ISO de C ou com qualquer linguagem exceto no caso de quem escreveu o sistema

🙂 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, arfneto disse:

Não vi nas telas que mostrou referência à versão de compilador que usou no Compiler Explorer ou no ReplIt então não ficou clara a razão de ter usado um compilador online ou dois afinal

Então diga qual a versão que gostaria de ter visto, certamente não aquele que usou no programa abaixo (de tua autoria):

int main(void)
{
    int* de  = (int[5]){1, 2, 3, 4, 5};
    int* ate = de + 3;

    exibir_numeros(de, ate);
    exibir_numeros(ate, de);  // tenta ao contrario
    return 0;
}
int exibir_numeros(int* ini, int* fim)
{
    if (ini == NULL) return -1;
    if (fim == NULL) return -1;
    printf("\nMostra valores de 0x%p a 0x%p (inclusive)\n", ini, fim);
    if (ini > fim)
    {
        printf("\nx: 0x%p e maior que u_: 0x%p\n", ini, fim);
        return -1;
    }
    int* p = ini;
    printf("Valores: [");
    for (int* p = ini; p <= fim; p += 1) printf(" %d", *p);
    printf(" ]\n");
    return 0;
}

image.png.c8808cf1cf0dc9d8eabd01d479573150.png

A saída tem "0x0x..." porque a string de formato tem um padrão fora do especificador!

Qual o compilador que gera programas sem esse padrão para justificar eles na printf?

 

 

3 horas atrás, arfneto disse:

main() pode ser chamada recursivamente, mesmo sendo provavelmente inútil e perigoso

Então (eu penso que) não pode ou nem sequer deveria tentar, já que é inútil e perigoso. Olhe! Eu sinceramente desisto, não é possível entender seus comentários.

 

 

3 horas atrás, arfneto disse:

Bem, "e" é uma conjunção e a sentença une duas afirmações.

—  Eu agradeço! Agora sei, entendi... tudo faz muito sentido.

🙂 Tks!

Obrigado!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, mauro_b disse:

A saída tem "0x0x..." porque a string de formato tem um padrão fora do especificador!

Qual o compilador que gera programas sem esse padrão para justificar eles na printf?

 

A essa altura já sabe que a saída de %p é definida pela implementação. E te expliquei também 2x sobre uma justificativa lógica para isso.

 

1 hora atrás, mauro_b disse:

Então diga qual a versão que gostaria de ter visto, certamente não aquele que usou no programa abaixo (de tua autoria)

 

Como eu disse não faz diferença, sr. Apenas diga qual foi já que quer ressaltar a diferença da saída do tal especificado no printf.

 

Eu te disse: procuro não usar mais que um computador do canto do escritório, que roda Windows e Visual Studio '22. Eventualmente posto algo a partir de SUSE ou Ubuntu Linux em gcc 11.2. Em geral não listo isso.

 

Em relação a você não usar o compilador da Microsoft entenda que aqui no forum é uma escolha pessoal. No mundo real há muito não se pode escolher o compilador, nem a linguagem. Em geral nem as regras para nomes de variáveis, número de colunas por linha, máximo de linhas em uma função, alinhamento de chaves e operadores e coisas assim. E nesse caso é bom conhecer e usar Visual Studio porque é provavelmente a ferramenta mais usada em desenvolvimento no planeta. Da Boeing ao Bradesco. Na NASA e na JPL e em toda parte. Para java ou C ou C++ ou node ou python ou obviamente C#, uma das linguagens aqui.

 

Se programa em C++ 20 já sabe que esse compilador está bem adiante de LLVM e gcc nessas coisas e é algo a considerar se seu projeto pode envolver essa linguagem

 

1 hora atrás, mauro_b disse:

Então (eu penso que) não pode ou nem sequer deveria tentar, já que é inútil e perigoso. Olhe! Eu sinceramente desisto, não é possível entender seus comentários

 

Sinto muito. Eu tento escrever de modo a usar exemplos claros e desenvolvimento justificado. Eu não "tentei". Eu escrevi para mostrar que funciona e como funciona chamar main recursivamente em C. Não sei se foi outra parte que não entendeu, mas tinha a ver com a discussão num primeiro momento e também neste.

 

Escrevo para qualquer um que esteja lendo e espero que alguém consiga entender, quem sabe a maioria, quem sabe um ao menos 😞  

 

 

Link para o comentário
Compartilhar em outros sites

Foram boas postagens com temas que não entendia porque não respondia essa pergunta:

20 horas atrás, mauro_b disse:

Penso que talvez esclareça melhor se falar o que significa não usar um variável|parâmetro|argumento?

14 horas atrás, mauro_b disse:

Qual o sentido para declarar parâmetro|variável e não utilizá-la?

13 horas atrás, arfneto disse:

main() pode ser um esqueleto para um sistema complexo que pode ou não usar esses argumentos, e o programa só é recompilado quando necessário. Se numa execução os argumentos são importantes algum módulo do programa vai receber e tratar isso. Se declarar como main(void)  só vai eventualmente perder a oportunidade.

13 horas atrás, mauro_b disse:

Bom! O mesmo que entendi, não a razão para escrever main com parâmetros em sistemas simples ou quando não pretende utilizar.

 

🙂 — Legal!

 

No final, o Sr. respondeu!

Se digo "No final" quero dizer penso que hoje de madrugada.

 

1 hora atrás, arfneto disse:

Sinto muito. Eu tento escrever de modo a usar exemplos claros e desenvolvimento justificado. Eu não "tentei". Eu escrevi para mostrar que funciona e como funciona chamar main recursivamente em C. Não sei se foi outra parte que não entendeu, mas tinha a ver com a discussão num primeiro momento e também neste.

 

Escrevo para qualquer um que esteja lendo e espero que alguém consiga entender, quem sabe a maioria, quem sabe um ao menos 😞  

 

Sinto muito, como assim?

Sente muito, por quê? Por demostrar algo inútil e perigoso? 

  • Curtir 1
  • Haha 1
Link para o comentário
Compartilhar em outros sites

15 minutos atrás, mauro_b disse:

Penso que é um exercício de imaginação imaginativo, mas dessa maneira é necessário o(s) valor(es) inicial(is)|ou esquema(s) das alíneas.

Tem isso ou estou viajando

 

No #24 está o código do autor @Lipeco e um esboço do mesmo, e no #26 está o enunciado... 

 

@mauro_b eis o que está distribuído logo acima, mas aqui junto:

 

    int i;
    int *ptr_b;
    int *ptr_a;
    int **ptr_p;
    int val = 55;

    ptr_a = (int*)malloc(4*sizeof(int));
    ptr_b = &ptr_a[1];
    ptr_p = &ptr_b;

    printf("\n\t--- VALORES INCIAIS ---\n\n");

    for(i=0; i<4;i++)
    {
        ptr_a[i] = 2*i+1;
        printf("  ptr_a [%i]:\t%d\n",i,ptr_a[i]);
    }

    val = ptr_b[1];

    printf("\n  ptr_a:\t%6X\n", ptr_a);
    printf("  ptr_b:\t%6X\n", ptr_b);
    printf("  ptr_p:\t%6X\n\n", ptr_p);

 

image.png.ab708316067f87c2a44cfadc3d15895b.pngimage.png.91a95d2a9db5e0b37f6d44c56a454d46.png

 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Precisa de ajuda?

 

Tem o esquema montadinho... agora é resolver cada ‘item’ igualmente o exemplo da atribuição da variável val;

notou que existe uma curva da val a variável pr_b[1]? Essa é a deixa para o modus operandi do exercício.

 

Exemplo:

j) *(&ptr_b[1] - 2) + 3

image.png.88b076b8a4248303396c79392749b9b0.png

 

 

Gabarito

image.png.37bd7f1f86316a72e638cfadacd2a52b.png

 

Tem dúvida pergunte

🙂 

 

 

@Lipeco

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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!