Quem só usou ctrl c + ctrl v ta com 'variariavel' no printf. Além de que provavelmente não aprendeu direito. Aqui to adorando o Curso Obrigado e Parabéns. estudando e praticando muito.
#include // Curso C Progressivo: www.cprogessivo.net // O melhor curso de C! Online e gratuito ! // Artigos, apostilas, tutoriais e vídeo-aulas sobre // a linguagem de programação C !
int main(void)
{ int teste[10];
printf("Imprimindo o vetor 'teste': %d\n", teste); printf("Imprimindo o endereço do primeiro elemento: %d\n", &teste[0]);
return 0;
} na apostila anterior aconteceu a mesma coisa. o programa nao é compilado pq aparece a mensagem: linha 13 aviso: formato '%d' espera argumento do tipo 'int', orem o argumento 2 possui tipo 'int *' [-wformat]....
pelo que eu entendi o compilador nao esta tratando o numero do endereço como um numero inteiro por isso nao esta aceitando '%d'... é isso mesmo???
31 de dezembro de 2014 às 18:47
Anônimo disse...
André de Souza, sim. %d realmente é para inteiros. Para ponteiros, use %p.
6 de julho de 2015 às 08:25
Anônimo disse...
Ainda nao entendi a importancia de saber os endereços das variaveis
"Blogger Roberto GMJ disse... Quem só usou ctrl c + ctrl v ta com 'variariavel' no printf. Além de que provavelmente não aprendeu direito. Aqui to adorando o Curso Obrigado e Parabéns. estudando e praticando muito." Que eu saiba aquilo era um exemplo , não uma questão....
22 de novembro de 2015 às 04:26
Victor disse...
Excelente explicação, finalmente estou começando a entender ponteiros! Muito obrigado equipe do C progressivo!
Não consegui entender claramente a necessidade de apontar para NULL. Se depois eu precisar utilizar o ponteiro novamente, vou ter que declarar ele para o endereço da variável novamente? Se alguem puder esclarecer melhor esse conceito de apontar para NULL, eu agradeço.
Há duas formas mais utilizadas de se imprimir o endereço de memória. Podemos usar o %d, que foi utilizado no post, e seria o endereço de memória na base 10. Ou também podemos utilizar o %p, que nos retorna o endereço de memória na base hexadecimal. Tenho costume de utilizar %p, mas acredito que no final das contas não faça nenhuma diferença.
Ótimo post, obrigado por manter o site em funcionamento!
Olá Cheguei aqui porque estava pesquisando o tema da inicialização de um ponteiro. Tive essa dúvida ao tentar repetir os passos de um programador da web que fez um programinha para console e usou ponteiro, mas o fez dessa forma:
const char *titulo = "MENU PARA DIVIDIR"; const char *opciones[] = {"Dividir enteros","Dividir flotantes","Regressar"}; int n = 3
opcion= menu(titulo, opciones, n);
Ou seja, ele deu valores para os ponteiros e não endereços. Considerando o texto desta parte da apostila fica a dúvida do que esse programador exatamente fez?
Neste caso os valores passados sao enderecos, pois o primeiro recebe uma sequencia de caracteres (um vetor, que automaticamente retorna um endereco inteiro) e o segundo eh um vetor que contem vetores, o que tambem retorna um endereco inteiro.
Agora que já vimos os conceitos teóricos sobre memória,
blocos de memória, endereçamento e do uso da função sizeof(), vamos de fato usar os ponteiros.
Nesse tutorial de C de nossa apostila vamos ensinar como declarar
ponteiros, fazê-los apontarem para alguma variável ou vetor, e manipulá-los.
Download de nossa apostila: Apostila de C
Clique aqui e saiba como tirar seu certificado de programação C!
Como declarar ponteiros em C
Já explicamos sobre a relação dos ponteiros com os diversos tipos de blocos de memória, de cada variável.
E a relação dos ponteiros com os vetores, que possuem diversas variáveis?
Pois bem, eles têm (ponteiros e vetores) possuem uma relação especial.
Quando declaramos um vetor, estamos declarando um conjunto de variáveis também contíguas, e cada uma dessas variáveis ocupam vários bytes (ou só 1 byte, se for char). Então, um vetor é um conjunto maior ainda de bytes, de blocos de memória.
Como você sabe, quando apontamos um ponteiro para uma variável, esse ponteiro armazena o endereço do primeiro byte, do menor endereço, da variável.
A relação com vetores é análoga: o nome do vetor é, na verdade, o endereço do primeiro elemento desse vetor.
Ou seja, se declararmos um vetor de nome vetor, não importando o número de elementos, se imprimirmos o nome vetor dentro de um printf, veremos o endereço da primeira variável daquele vetor.
Podemos ver um vetor como um ponteiro.
Isso explica o fato de que quando passamos um vetor para uma função, essa função altera de fato o valor do vetor. Isso ocorre pois não estamos passando uma cópia do vetor (como acontece com as variáveis).
Isso ocorre porque quando passamos o nome do vetor, estamos passando um ponteiro pra função.
Ou seja, estamos passando um endereço, onde a função vai atuar.
E endereço de memória é o mesmo, dentro ou fora de uma função.
Rode o seguinte exemplo para se certificar do que foi ensinado aqui.
Exemplo de código em C
Crie um programa que mostre que o nome de um vetor é, na verdade, um ponteiro para a primeira posição que o vetor ocupa na memória. Ou seja, um vetor sempre aponta para o elemento 0.
#include <stdio.h>
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C! Online e gratuito !
// Artigos, apostilas, tutoriais e vídeo-aulas sobre
// a linguagem de programação C !
int main(void)
{
int teste[10];
printf("Imprimindo o vetor 'teste': %d\n", teste);
printf("Imprimindo o endereço do primeiro elemento: %d\n", &teste[0]);
return 0;
}
Ou seja, para declararmos um ponteiro ptr para um vetor vet[ ], fazemos:
ptr = vet;
Pois o nome do vetor é um ponteiro (que não muda) para o primeiro elemento.
Então poderíamos fazer assim também:
ptr = &vet[0];
Como inicializar um ponteiro em C – A constante NULL
Já vimos como declarar um ponteiro, então é hora de fazer
com que eles cumpram sua missão.
Vamos fazer os ponteiros apontarem.
Lembra que ensinamos como checar o endereço de uma variável
ou vetor apenas usando o símbolo & antes da variável?
Agora vamos fazer isso novamente, mas é para pegar esse
endereço e armazenar em um ponteiro.
Por exemplo, se quisermos armazenar o endereço do inteiro
‘numero’ no ponteiro ‘numeroPtr’, fazemos:
int numero = 5;
int *numeroPtr = №
Pronto, agora nosso ponteiro está apontando para a
variável numero, pois o ponteiro
guardou o endereço do inteiro na sua posição de memória.
Muito cuidado! Ponteiros
armazenam endereços, e não valores. Ou seja, se fizer:
int *numeroPtr = numero;
Estará comentendo um erro!
É sempre bom inicializarmos os ponteiros, pois senão eles
podem vir com lixo e você se esquecer, posteriormente, de inicializar. Então,
quando for usar, pensará que está usando o ponteiro de modo correto, mas estará
usando o ponteiro com ele apontando para um lixo (endereço qualquer de
memória).
Uma boa prática é apontar os ponteiros para a primeira
posição de memória, que é conhecida como NULL.
Sempre que terminar de usar um ponteiro, coloque ele pra apontar para a posição
NULL. Para fazer isso, faça:
tipo *nome_do_ponteiro = NULL;
Exemplo de código:
Como usar ponteiros
Crie um programa em C que declara um inteiro e uma
variável do tipo double. Em seguida, crie dois ponteiros apontando para essas
variáveis e mostre o endereço de memória das variáveis, e mostre o endereço de
memória que cada ponteiro armazenou.
Por fim, coloque esses ponteiros para a primeira posição
(NULL), de memória.
Para saber o endereço de uma variável dentro do printf,
colocamos o %d e depois ‘&nome_variavel’.
Para saber que endereço um ponteiro armazena no printf,
também colocamos o %d entre as aspas, e fora colocamos apenas o nome do
ponteiro.
Veja como ficou nosso código sobre como fazer esse programa em C:
#include <stdio.h>
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C! Online e gratuito !
// Artigos, apostilas, tutoriais e vídeo-aulas sobre
// a linguagem de programação C !
int main(void)
{
int inteiro;
int *inteiro_ptr = &inteiro;
double double1;
double *double_ptr = &double1;
printf("Endereco da variariavel 'inteiro': %d\n", &inteiro);
printf("Endereco armazenado no ponteiro 'inteiro_ptr': %d\n\n", inteiro_ptr);
printf("Endereco da variariavel 'double1': %d\n", &double1);
printf("Endereco armazenado no ponteiro 'double_ptr': %d\n\n", double_ptr);
printf("Apos o uso dos ponteiros, vamos aponta-los para NULL\n\n");
inteiro_ptr = NULL;
double_ptr = NULL;
printf("Endereco armazenado no ponteiro 'inteiro_ptr': %d\n", inteiro_ptr);
printf("Endereco armazenado no ponteiro 'double_ptr': %d\n", double_ptr);
return 0;
}
postado por Programação Progressiva às 09:41 em 9 de mar. de 2013
14 Comentários
Fechar esta janela Ir para formulário de comentárioApostila C Progressivo; É a melhor que existe!
Em nome de todos os leitores; Meus Parabéns!
16 de agosto de 2014 às 06:58
Quem só usou ctrl c + ctrl v ta com 'variariavel' no printf. Além de que provavelmente não aprendeu direito. Aqui to adorando o Curso Obrigado e Parabéns. estudando e praticando muito.
24 de outubro de 2014 às 07:02
#include
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C! Online e gratuito !
// Artigos, apostilas, tutoriais e vídeo-aulas sobre
// a linguagem de programação C !
int main(void)
{
int teste[10];
printf("Imprimindo o vetor 'teste': %d\n", teste);
printf("Imprimindo o endereço do primeiro elemento: %d\n", &teste[0]);
return 0;
}
na apostila anterior aconteceu a mesma coisa. o programa nao é compilado pq aparece a mensagem: linha 13 aviso: formato '%d' espera argumento do tipo 'int', orem o argumento 2 possui tipo 'int *' [-wformat]....
pelo que eu entendi o compilador nao esta tratando o numero do endereço como um numero inteiro por isso nao esta aceitando '%d'...
é isso mesmo???
31 de dezembro de 2014 às 18:47
André de Souza, sim. %d realmente é para inteiros. Para ponteiros, use %p.
6 de julho de 2015 às 08:25
Ainda nao entendi a importancia de saber os endereços das variaveis
13 de outubro de 2015 às 04:06
"Blogger Roberto GMJ disse...
Quem só usou ctrl c + ctrl v ta com 'variariavel' no printf. Além de que provavelmente não aprendeu direito. Aqui to adorando o Curso Obrigado e Parabéns. estudando e praticando muito."
Que eu saiba aquilo era um exemplo , não uma questão....
22 de novembro de 2015 às 04:26
Excelente explicação, finalmente estou começando a entender ponteiros!
Muito obrigado equipe do C progressivo!
5 de junho de 2016 às 19:05
Excelente trabalho, está fácil aprender isso!
31 de outubro de 2016 às 12:54
Este comentário foi removido pelo autor.
14 de junho de 2017 às 09:22
Não consegui entender claramente a necessidade de apontar para NULL. Se depois eu precisar utilizar o ponteiro novamente, vou ter que declarar ele para o endereço da variável novamente? Se alguem puder esclarecer melhor esse conceito de apontar para NULL, eu agradeço.
16 de junho de 2017 às 06:30
Há duas formas mais utilizadas de se imprimir o endereço de memória. Podemos usar o %d, que foi utilizado no post, e seria o endereço de memória na base 10. Ou também podemos utilizar o %p, que nos retorna o endereço de memória na base hexadecimal. Tenho costume de utilizar %p, mas acredito que no final das contas não faça nenhuma diferença.
Ótimo post, obrigado por manter o site em funcionamento!
8 de outubro de 2017 às 12:37
Olá
Cheguei aqui porque estava pesquisando o tema da inicialização de um ponteiro. Tive essa dúvida ao tentar repetir os passos de um programador da web que fez um programinha para console e usou ponteiro, mas o fez dessa forma:
const char *titulo = "MENU PARA DIVIDIR";
const char *opciones[] = {"Dividir enteros","Dividir flotantes","Regressar"};
int n = 3
opcion= menu(titulo, opciones, n);
Ou seja, ele deu valores para os ponteiros e não endereços. Considerando o texto desta parte da apostila fica a dúvida do que esse programador exatamente fez?
6 de fevereiro de 2019 às 08:29
Ola joagostini.
Neste caso os valores passados sao enderecos, pois o primeiro recebe uma sequencia de caracteres (um vetor, que automaticamente retorna um endereco inteiro) e o segundo eh um vetor que contem vetores, o que tambem retorna um endereco inteiro.
31 de janeiro de 2022 às 04:01
mas que belo curso! muito bom!
24 de abril de 2022 às 19:36