Qual è la differenza tra (int *array, (int *)&array, &array in un puntatore di assegnazione?

0

Domanda

Ho 3 linee di codice che esegue esattamente la stessa, ma ha una sintassi diversa, la base di codice:

    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));
    }

Sulla linea pa = (int *)&arr;Posso passare la linea al (int *)array, (int *)&arraye &array senza incontrare problemi, solo l'esperienza di un avviso all'ultimo. Mi chiedevo la sintassi corretta è la differenza tra tutti e 3 di loro.

arrays c pointers
2021-11-24 05:02:40
2
0
  • La sintassi corretta è pa = &arr[0]; e se vi trovate nel bisogno di aggiungere un cast che si sta facendo qualcosa di sbagliato. Mettere senza mezzi termini, se sei un principiante, si dovrebbe essere casting puntatori mai.

  • pa = &arr non "solo dare un messaggio di avviso", è valido C. Questo è un cosiddetto violazione del vincolo - voci di cessione di crediti non compatibile con tipi di puntatore. Si prega di leggere attentamente Ciò che opzioni del compilatore sono raccomandati per i principianti di apprendimento C? e che Cosa è necessario un compilatore C fare quando trova un errore?

  • Allo stesso modo, pa = (int *)&array è un puntatore non valido conversione tra non compatibili. Per compilare, ma ha un compilatore specifico risultato. È, strettamente parlando, il codice non corretto, ma può funzionare per la compilazione specifiche e di sistema.

  • pa = (int *)array è sbagliato per ragioni analoghe troppo - dal array è decaduta in un puntatore ad un array del tipo che non è compatibile con int*.

2021-11-24 10:23:55

Se io faccio semplicemente pa = arr; è per me un "[Errore] incarico è incompatibile tipo di puntatore". Quando ho chiesto al mio insegnante, che è quello che mi ha mostrato. Come faccio semplicemente risolvere il mio codice di base di cui sopra?
Minh Nguyen

@MinhNguyen Ah il mio male, non ho notato che era una matrice 2D. Aggiorna la risposta.
Lundin

Thankies,farà una nota di che, per la prossima volta che faccio qualcosa di simile
Minh Nguyen
0

Due curiosità:

  1. L'indirizzo di un array è l'indirizzo del suo primo elemento.
  2. Quando viene trattata come un puntatore a un array si degrada in un puntatore al suo primo elemento

Così,

  1. pa = arr;
    

    è equivalente a

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

    Si utilizza un typecast silenzio l'errore quando si fa pa = (int *)arr;.

  2. pa = &arr;
    

    è equivalente a

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

    Si utilizza un typecast silenzio l'errore quando si fa pa = (int *)&arr;.

Questi typecasts non sono sicuro. Se si vuole trattare come una 1d array di int valori, meglio dichiarare in quel modo.

2021-11-24 08:04:28

In altre lingue

Questa pagina è in altre lingue

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