Aký je rozdiel medzi (int *)pole, (int *)&pole, a &pole ukazovateľ priradenie?

0

Otázka

Mám 3 riadky kódu, ktorý vykonáva presne rovnaké, ale majú odlišnú syntax, základný kód je:

    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 linke pa = (int *)&arr;Môžem prepnúť že riadku (int *)array, (int *)&arraya &array bez výskytu akýchkoľvek problémov, iba zažíva varovanie na posledný. Bol som zvedavý, správnu syntax je a rozdiel medzi všetky 3 z nich.

arrays c pointers
2021-11-24 05:02:40
2
0
  • Správnu syntax je pa = &arr[0]; a ak sa ocitnete v núdzi, ak chcete pridať cast, robíte niečo zle. Hrubo povedané, ak ste začiatočník, by ste nemali byť odlievanie ukazovatele kedykoľvek predtým.

  • pa = &arr nie je "len dať varovanie", je neplatný C. Toto je tzv obmedzenia, porušenie - neplatný priradenie non-kompatibilné ukazovateľ typy. Prosím štúdia , Čo kompilátor možnosti sú odporúčané pre začiatočníkov učenia C? a Čo sa musí a C kompilátor robiť, keď zistí chybu?

  • Podobne, pa = (int *)&array je neplatný ukazovateľ konverziu medzi non-kompatibilné typy. To bude zostavovať, ale má kompilátor-špecifický výsledok. Je to presne povedané nesprávny kód, ale môže pracovať pre konkrétne kompilátor a systém.

  • pa = (int *)array je zle z podobných dôvodov príliš - od array má skazená do ukazovateľ na pole typ, ktorý nie je kompatibilný s int*.

2021-11-24 10:23:55

Ak som jednoducho urobiť pa = arr; to mi dáva "[Chyba] priradenie z nezlučiteľné ukazovateľ typ". Keď som sa spýtal svojho učiteľa o tom, že je to, čo on mi ukázal. Ako môžem jednoducho opraviť, že s mojím base kód vyššie?
Minh Nguyen

@MinhNguyen Ah my bad, som si nevšimol, že bol 2D pole. Bude aktualizovať odpoveď.
Lundin

Thankies,bude na vedomie, že nabudúce mám urobiť niečo, ako že
Minh Nguyen
0

Dva kľúčové tidbits:

  1. Adresa pole je adresa jeho prvý prvok.
  2. Keď zaobchádza ako ukazovateľ, pole sa rozkladá na ukazovateľ na jeho prvý prvok

Tak,

  1. pa = arr;
    

    je ekvivalentné

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

    Môžete použiť obsadiť, ak chcete stíšiť chyby, keď robí pa = (int *)arr;.

  2. pa = &arr;
    

    je ekvivalentné

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

    Môžete použiť obsadiť, ak chcete stíšiť chyby, keď robí pa = (int *)&arr;.

Tieto typecasts nie sú bezpečné. Ak chcete pristupovať k nej ako k 1d pole int hodnoty, najlepšie vyhlásiť to, že príliš.

2021-11-24 08:04:28

V iných jazykoch

Táto stránka je v iných jazykoch

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