Quelle est la différence entre (int *)array (int *)&matrice, et &tableau de pointeur de la cession?

0

La question

J'ai 3 lignes de code qui effectue exactement les mêmes, mais ont une syntaxe différente, le code de base étant:

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

Sur la ligne pa = (int *)&arr;, Je peux passer la ligne d' (int *)array, (int *)&arrayet &array sans rencontrer de problèmes, seulement l'expérience d'un avertissement lors de la dernière. Je me demandais la syntaxe correcte est la différence entre toutes les 3 d'entre eux.

arrays c pointers
2021-11-24 05:02:40
2
0
  • La syntaxe correcte est pa = &arr[0]; et si vous vous trouvez dans le besoin d'ajouter un plâtre, vous faites quelque chose de mal. En d'autres termes, si vous êtes un débutant, vous ne devriez pas être en jetant des pointeurs jamais.

  • pa = &arr n'est pas "que de donner un avertissement", il est invalide C. C'est un soi-disant violation de contrainte - valide la cession de la non-compatibles de type pointeur. Veuillez étudier Ce que les options du compilateur sont recommandés pour les débutants d'apprendre le C? et Que doit faire un compilateur C quand il trouve une erreur?

  • De même, pa = (int *)&array est un pointeur non valide conversion entre les types compatibles. Elle compile mais a un compilateur spécifique de résultat. C'est à proprement parler un code incorrect, mais peuvent travailler pour le compilateur spécifique et du système.

  • pa = (int *)array est mauvais pour des raisons similaires, puisqu' array s'est décomposée en un pointeur de type tableau qui n'est pas compatible avec int*.

2021-11-24 10:23:55

Si je n'ai tout simplement pa = arr; il me donne un "[Erreur] la cession de incompatible pointer type". Quand j'ai demandé à mon professeur, qu'est ce qu'il m'a montré. Comment puis-je simplement le corriger avec mon code de base ci-dessus?
Minh Nguyen

@MinhNguyen Ah my bad, je n'avais pas remarqué que c'était un tableau 2D. Mettra à jour la réponse.
Lundin

Thankies,faire une note pour la prochaine fois que je fais quelque chose comme ça
Minh Nguyen
0

Deux clés de tidbits:

  1. L'adresse d'un tableau est l'adresse de son premier élément.
  2. Lorsqu'ils sont traités comme un pointeur, un tableau se dégrade en un pointeur sur son premier élément

Donc,

  1. pa = arr;
    

    est équivalent à

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

    Vous utilisez un transtypage de silence de l'erreur lors de faire pa = (int *)arr;.

  2. pa = &arr;
    

    est équivalent à

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

    Vous utilisez un transtypage de silence de l'erreur lors de faire pa = (int *)&arr;.

Ces typecasts ne sont pas sûrs. Si vous voulez le traiter comme un tableau 1d de int les valeurs, il est préférable de déclarer que trop.

2021-11-24 08:04:28

Dans d'autres langues

Cette page est dans d'autres langues

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