Jaka jest różnica między tablicą (int*), tablica (int *) i tablicą i tablicą w wyznaczeniu wskaźnika?

0

Pytanie

Mam 3 linie kodu, które wykonują dokładnie to samo, ale mają inną składnię, podstawowy kod:

    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 linii pa = (int *)&arr;Mogę przełączyć tę linię na (int *)array, (int *)&arrayi &array nie zderzając się z żadnymi problemami, tylko po otrzymaniu alertu po raz ostatni. Zastanawiałem się, jaka jest poprawna składnia i jaka jest różnica między wszystkimi 3 z nich.

arrays c pointers
2021-11-24 05:02:40
2
0
  • Poprawna składnia jest następująca pa = &arr[0]; i jeśli okaże się, że trzeba dodać obsada, robisz coś nie tak. Mówiąc prościej, jeśli jesteś nowy, nigdy nie należy rzucać wskaźniki.

  • pa = &arr nie tylko wyświetla ostrzeżenie", jest niedopuszczalne C. jest To tak zwane naruszenie ograniczeń - nieprawidłowa przypisanie niekompatybilnych rodzajów wskaźników. Proszę, zapoznaj się, jakie opcje kompilatora są zalecane dla początkujących, uczących się języka C? i co muszę zrobić kompilator C, gdy wykryje błąd?

  • Podobnie pa = (int *)&array jest niedopuszczalne transformacją wskaźnika między niezgodne typów. On będzie się kompilować, ale ma wynik w zależności od kompilatora. Ściśle mówiąc, jest to błędny kod, ale on może pracować dla konkretnego kompilatora i systemu.

  • pa = (int *)array to też źle z tych samych powodów - tak jak array rozpadł się na wskaźnik na typ z tablicy, który nie jest kompatybilny z int*.

2021-11-24 10:23:55

Jeśli ja po prostu zrobię pa = arr; to daje mi "[Błąd] spotkanie niekompatybilnego typu wskaźnika". Kiedy zapytałem o tym swojego nauczyciela, to on mi pokazał. Jak mi naprawić to za pomocą mojego kodu podstawowego powyżej?
Minh Nguyen

@MinhNguyen Ach, mój problem, nie zauważyłem, że to był 2D tablicy. Zaktualizuje odpowiedź.
Lundin

Dzięki,zapiszę to pod uwagę następnym razem, kiedy zrobię coś podobnego
Minh Nguyen
0

Dwa kluczowe ciekawostki kostki:

  1. Adres tablicy jest adresem jej pierwszego elementu.
  2. Opis: w procedurach obsługi jako indeksu tablicy zmienia się na wskaźnik na jej pierwszy element

Tak,

  1. pa = arr;
    

    równoważne

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

    Używasz типизацию, aby wyłączyć błąd podczas wykonywania pa = (int *)arr;.

  2. pa = &arr;
    

    równoważne

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

    Używasz типизацию, aby wyłączyć błąd podczas wykonywania pa = (int *)&arr;.

Te typy nie są bezpieczne. Jeśli chcesz traktować go jako tablicę 1d int wartości, najlepiej ogłosić to też tak jest.

2021-11-24 08:04:28

W innych językach

Ta strona jest w innych językach

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