Qual é a diferença entre (int *)matriz, (int *)&matriz, e &matriz em uma atribuição de ponteiro?

0

Pergunta

Eu tenho 3 linhas de código que executa exatamente o mesmo, mas tem uma sintaxe diferente, a base de código:

    int a, b;
    printf("Enter the size of your array [a][b]: ");
    scanf("%d %d", &a, &b);
    int arr[a][b];

    int *pa;

    pa = (int *)&arr;
     
    for (i = 0; i < a*b; i++)
    {
        printf("[%d] [%d] = ", i/b, i%b);
        scanf("%d", (pa + i));
    }

Na linha pa = (int *)&arr;, Eu posso mudar essa linha para (int *)array, (int *)&arraye &array sem encontrar quaisquer problemas, só experimentando um aviso no último. Eu estava perguntando a sintaxe correta é e a diferença entre os 3 deles.

arrays c pointers
2021-11-24 05:02:40
2
0
  • A sintaxe correta é pa = &arr[0]; e se você encontrar-se na necessidade de adicionar um elenco, você está fazendo algo errado. Sem rodeios colocar, se você é um novato, você não deve ser a carcaça ponteiros nunca.

  • pa = &arr não "só dar um aviso", é inválido C. Este é um chamado de violação de restrição - atribuição inválida de não compatível com os tipos de ponteiro. Por favor estudo Que opções de compilador são recomendados para iniciantes aprendendo C? e o Que tem um compilador de C fazer quando encontra um erro?

  • Da mesma forma, pa = (int *)&array é um ponteiro inválido conversão entre não-compatíveis. Ele irá compilar, mas tem um compilador específico do resultado. É estritamente falando de código incorreto, mas pode funcionar para o compilador específico e sistema.

  • pa = (int *)array é errado por razões semelhantes, também - desde que array se tiver dissipado em um ponteiro para o tipo de matriz que não é compatível com int*.

2021-11-24 10:23:55

Se eu simplesmente não pa = arr; dá-me uma "[Erro] atribuição incompatível tipo de ponteiro". Quando eu perguntei ao meu professor sobre isso, que é o que ele me mostrou. Como posso simplesmente corrigir isso com a minha base de código acima?
Minh Nguyen

@MinhNguyen Ah meu mal, eu não percebi que era um array 2D. Irá atualizar a resposta.
Lundin

Thankies,vai fazer uma observação de que para a próxima vez que eu faço algo como o que
Minh Nguyen
0

Duas dicas:

  1. O endereço de uma matriz é o endereço de seu primeiro elemento.
  2. Quando tratada como um ponteiro, uma matriz degrada em um ponteiro para o primeiro elemento

Assim,

  1. pa = arr;
    

    é equivalente a

    pa = &(arr[0]);   // Type mismatch: RHS is int (*)[b]
    

    Você usar um typecast para silenciar o erro ao fazer pa = (int *)arr;.

  2. pa = &arr;
    

    é equivalente a

    pa = &(arr[0]);   // Type mismatch: RHS is int (*)[b]
    

    Você usar um typecast para silenciar o erro ao fazer pa = (int *)&arr;.

Estes typecasts não são seguros. Se você quiser tratá-lo como um array 1d de int valores, melhor para declará-lo dessa maneira.

2021-11-24 08:04:28

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................