Jaký je rozdíl mezi (int *)pole, (int *)&pole, &pole na ukazatel úkol?

0

Otázka

Mám 3 řádky kódu, které provádí přesně stejné, ale mají jinou syntaxi, základní kód:

    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 lince pa = (int *)&arr;Můžu přepínač, který řádek (int *)array, (int *)&arraya &array aniž by museli překonávat nějaké problémy, jen zažívá upozornění na poslední jeden. Zajímalo by mě, jaká syntaxe je a rozdíl mezi 3 z nich.

arrays c pointers
2021-11-24 05:02:40
2
0
  • Správná syntaxe je pa = &arr[0]; a pokud se ocitnete v potřebují přidat obsazení, děláte něco špatně. Bez obalu řečeno, pokud jste začátečník, neměli byste být odlévání ukazatele vůbec.

  • pa = &arr není "jen dát varování", je neplatná. C. Toto je tzv. porušení omezení - neplatnost postoupení non-kompatibilní typ ukazatel. Prosím, studovat , Jaké možnosti kompilátoru jsou vhodné pro začátečníky učení C? a Co třeba C kompilátor dělat, když to najde chybu?

  • Podobně pa = (int *)&array je neplatný ukazatel konverze mezi non-kompatibilní typy. To bude sestavovat, ale má kompilátor-konkrétní výsledek. To je přísně vzato nesprávný kód, ale může pracovat pro konkrétní kompilátor a systému.

  • pa = (int *)array je špatně z podobných důvodů příliš - od array se rozkládal na ukazatel na typ pole, který není kompatibilní s int*.

2021-11-24 10:23:55

Pokud jsem jednoduše udělat pa = arr; to mi dává "[Chyba] úkol od nekompatibilní ukazatel typu". Když jsem se zeptal, můj učitel o tom, že je to, co mi ukázal. Jak mohu jednoduše opravit, že s mou základnu kódu výše?
Minh Nguyen

@MinhNguyen Ah moje chyba, nevšiml jsem si, že to byla 2D pole. Bude aktualizovat odpověď.
Lundin

Thankies,bude mít na vědomí, že pro příště chci něco udělat jako, že
Minh Nguyen
0

Dva klíčové kousky:

  1. Adresa pole je adresa jeho první prvek.
  2. Když zacházeno jako ukazatel, pole degraduje na ukazatel na jeho první prvek

Takže,

  1. pa = arr;
    

    je ekvivalentní k

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

    Použití zaškatulkovat do ticha chyba, když děláte pa = (int *)arr;.

  2. pa = &arr;
    

    je ekvivalentní k

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

    Použití zaškatulkovat do ticha chyba, když děláte pa = (int *)&arr;.

Tyto typecasts nejsou bezpečné. Pokud chcete, aby ji léčit jako 1d pole int hodnoty, nejlepší deklarovat to, že příliš.

2021-11-24 08:04:28

V jiných jazycích

Tato stránka je v jiných jazycích

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