Me ajudem nesse exercício aqui Faça um codigo que tenha um ponteiro para um vetor de inteiros de 10 posições. Leia as 10 posições usando um ponteiro para o ponteiro;

Esse é o meu código só que está dando erro

#include <stdio.h>
#include<stdlib.h>

int main(){
	int *ptr,*vetor;
	vetor=(int*)malloc(sizeof(int)*10);
	for (int i = 1; i <= 10; i++){
		printf("Digite o valor de %d: \n",i);
		scanf("%d",ptr);
		ptr++;
	}
	ptr=vetor;
	for (int i = 1; i <= 10; i++){
		printf("O valor pelo ponteiro %d\n",*ptr);
		ptr++;
		printf("O valor pelo vetor %d\n",vetor[i]);

	}
	return 0;
}

vamos la

primeiro, se vc remover a variavel ptr isso só vai melhorar a sua vida.

ela é um ponteiro não inicializado. e isso é perigoso.

vc usa scanf para ler um inteiro e adicionar naquele endereço de memoria, e ai vc incrementa o endereço desse ponteiro.

o que acontece no final do primeiro loop é que prt esta na posição inicial de memoria + 10 “posições” depois.

vc vai ler conteudo que não faz sentido.

se vc fizer, ptr = ptr - 10; no lugar de apontar para o vetor, vc vai ver o que vc acabou de escrever.

exemplo:

#include <stdio.h>
#include<stdlib.h>
#define MAX 3
int main(){
	int *ptr,*vetor;
	vetor=(int*)malloc(sizeof(int)*MAX);

  printf("DEBUG: ptr=%p, vetor=%p\n",ptr,vetor);
	for (int i = 1; i <= MAX; i++){
		printf("Digite o valor de %d: \n",i);
		scanf("%d",ptr);
    printf("DEBUG: lido %d\n", *ptr);
		ptr++;
	}
	ptr = ptr - MAX;
	for (int i = 1; i <= MAX; i++){
		printf("O valor pelo ponteiro %d\n",*ptr);
		ptr++;
		printf("O valor pelo vetor %d\n",vetor[i]);

	}
	return 0;
}

DEBUG: ptr=0x7ffd70aaa780, vetor=0x21b3010
Digite o valor de 1:
1
DEBUG: lido 1
Digite o valor de 2:
2
DEBUG: lido 2
Digite o valor de 3:
3
DEBUG: lido 3
O valor pelo ponteiro 1
O valor pelo vetor 0
O valor pelo ponteiro 2
O valor pelo vetor 0
O valor pelo ponteiro 3
O valor pelo vetor 0

agora vamos la: primeiro remova ptr e use apenas vetor.

uma vez que o seu programa funciona, vamos entender o que foi pedido:

Faça um codigo que tenha um ponteiro para um vetor de inteiros de 10 posições. Leia as 10 posições usando um ponteiro para o ponteiro;

assim, qual a minha leitura?

primeiro: vc não precisa do malloc. vc pode simplesmente declarar int vetor[10]

o que é vetor? ora é um ponteiro! vc apenas informou ao compilador “oi eu quero 10 posições alocadas pra esse ponteiro por gentileza”.

quando vc faz vetor[i] isso nada mais é que *(vetor + i) – inclusive tem uma pegadinha que é perguntar o que significa 0[ vetor ]; que vc mata entendendo as propriedades matematicas da soma.

vamos la, se vetor é um ponteiro, então vc pode passar a referencia dele para outras variaveis.

veja esse exemplo:

#include <stdio.h>

int main(void){
  int *ptr, vetor[10];

  ptr = vetor;

  for( int i=0;i< 10; i++) { ptr[i] = 666; }
  for( int i=0;i< 10; i++) { printf("vetor[%d]=%d\n",i,vetor[i]); }
  
}

output:

vetor[0]=666
vetor[1]=666
vetor[2]=666
vetor[3]=666
vetor[4]=666
vetor[5]=666
vetor[6]=666
vetor[7]=666
vetor[8]=666
vetor[9]=666

agora imagine que no lugar de 666 vc usou o scanf para ler.

e o scanf recebe um ponteiro. vc não pode passar vetor[i] e sim &vetor[i]

creio q vc tem tudo o que vc precisa.

preste atenção com vetores.

na duvida, coloque rotinas que imprimam tudo o que esta acontecendo. ate vc aprender tecnicas de debug mais adequadas elas são uma mão na roda.

É importante ressaltar uma coisa, o identificador de um array não é um ponteiro para essa array. É o local na memória do primeiro byte do segmento, ou seja, é uma referência. Para ficar mais claro, caso ainda não tenha, não é possível incrementar o identificador de um objeto array bem como mudar o seu valor, porém todas essas coisas podem ser feitas com apontadores.

Assim sendo, todo ponteiro pode ter uma referência de valor, mas nenhum referência pode ter o valor de um ponteiro.

Perfeito.

A unica observação é que uma variavel ou parametro declarado como array precisa ter um tamanho.

Se vc não declara um tamanho, então vc vai declara como um ponteiro ( que vc pode utilizar depois em um malloc por exemplo ).

Assim, se vc tem uma função que aceita um array como parametro vc tem duas escolhas

void foo(int vetor[256])

ou

void foo(int *vetor)

porém no primeiro vc sabe o tamanho do array, no segundo vc precisa de algum artificio do contrario vc vai acabar acessando memoria onde não deve.

uma alternativa é:

void foo(int *vetor, int size)

ou vc definir que existe um valor especial que significa fim. que é o caso das strings onde o char \0 representa isso.

é sutil a diferença, mas é importante.