¿Cuál es la diferencia entre (int *)de la matriz, (int *)&matriz, y la matriz en una asignación de puntero?

0

Pregunta

Tengo 3 líneas de código que realiza exactamente la misma, pero tiene una sintaxis diferente, la 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));
    }

En la línea pa = (int *)&arr;Puedo cambiar la línea (int *)array, (int *)&arrayy &array sin mayores problemas, sólo experimentando una advertencia en la última. Me preguntaba la sintaxis correcta es la diferencia entre todos los 3 de ellos.

arrays c pointers
2021-11-24 05:02:40
2
0
  • La sintaxis correcta es pa = &arr[0]; y si usted se encuentra en necesidad de añadir un fundido, usted está haciendo algo mal. Sin rodeos, si usted es un principiante, usted no debe ser de fundición de punteros nunca.

  • pa = &arr "no sólo dar una advertencia", no es válido C. Este es un llamado de la violación de la restricción - no válido asignación de la no-compatible con los tipos de puntero. Favor de estudiar Qué opciones del compilador se recomienda para los principiantes aprender C? y ¿Qué debe hacer un compilador de C que hacer cuando se encuentra un error?

  • Del mismo modo, pa = (int *)&array es un puntero no válido conversión entre tipos compatibles. Compile pero tiene un compilador-resultado específico. Es estrictamente hablando un código incorrecto, pero puede trabajar para el compilador específico y del sistema.

  • pa = (int *)array es incorrecto, por razones similares también - desde array se ha desintegrado en un puntero a un array de tipo que no es compatible con int*.

2021-11-24 10:23:55

Si yo simplemente hacer pa = arr; me da un "[Error] asignación de incompatible tipo de puntero". Cuando le pregunté a mi maestro, que es lo que él me mostró. ¿Cómo puedo arreglar simplemente que con mi base de código anterior?
Minh Nguyen

@MinhNguyen Ah mi mal, yo no me di cuenta que era una matriz 2D. Se actualizará la respuesta.
Lundin

Thankies,tomará nota de que para la próxima vez tengo que hacer algo como eso
Minh Nguyen
0

Dos cositas:

  1. La dirección de una matriz es la dirección de su primer elemento.
  2. Cuando se trata como un puntero, una matriz se degrada en un puntero a su primer elemento

Así,

  1. pa = arr;
    

    es equivalente a

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

    Utiliza un encasillado para silenciar el error al hacer pa = (int *)arr;.

  2. pa = &arr;
    

    es equivalente a

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

    Utiliza un encasillado para silenciar el error al hacer pa = (int *)&arr;.

Estos typecasts no son seguros. Si usted quiere tratarlo como un 1d array de int los valores, la mejor manera de declarar que de esa manera también.

2021-11-24 08:04:28

En otros idiomas

Esta página está en otros idiomas

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