В чем разница между массивом (int*), массивом (int *) и массивом и массивом в назначении указателя?

0

Вопрос

У меня есть 3 строки кода, которые выполняют точно то же самое, но имеют другой синтаксис, базовый код:

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

На линии pa = (int *)&arr;, Я могу переключить эту линию на (int *)array, (int *)&array, и &array не сталкиваясь ни с какими проблемами, только получив предупреждение в последний раз. Мне было интересно, каков правильный синтаксис и в чем разница между всеми 3 из них.

arrays c pointers
2021-11-24 05:02:40
2
0
  • Правильный синтаксис таков pa = &arr[0]; и если вы обнаружите, что вам нужно добавить актерский состав, вы делаете что-то не так. Проще говоря, если вы новичок, вам никогда не следует бросать указатели.

  • pa = &arr не "только выдает предупреждение", оно недопустимо C. Это так называемое нарушение ограничений- недопустимое присвоение несовместимых типов указателей. Пожалуйста, изучите, какие параметры компилятора рекомендуются для начинающих, изучающих C? и что должен делать компилятор C, когда он обнаруживает ошибку?

  • Аналогично, pa = (int *)&array является недопустимым преобразованием указателя между несовместимыми типами. Он будет компилироваться, но имеет результат, зависящий от компилятора. Строго говоря, это неверный код, но он может работать для конкретного компилятора и системы.

  • pa = (int *)array это тоже неправильно по аналогичным причинам - так как array распался на указатель на тип массива, который не совместим с int*.

2021-11-24 10:23:55

Если я просто сделаю pa = arr; это даст мне "[Ошибка] назначение несовместимого типа указателя". Когда я спросил об этом своего учителя, именно это он мне и показал. Как мне просто исправить это с помощью моего базового кода выше?
Minh Nguyen

@MinhNguyen Ах, моя беда, я не заметил, что это был 2D массив. Обновит ответ.
Lundin

Спасибо,запишу это на заметку в следующий раз, когда я сделаю что-нибудь подобное
Minh Nguyen
0

Два ключевых лакомых кусочка:

  1. Адрес массива-это адрес его первого элемента.
  2. При обработке в качестве указателя массив превращается в указатель на его первый элемент

Так,

  1. pa = arr;
    

    эквивалентно

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

    Вы используете типизацию, чтобы отключить ошибку при выполнении pa = (int *)arr;.

  2. pa = &arr;
    

    эквивалентно

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

    Вы используете типизацию, чтобы отключить ошибку при выполнении pa = (int *)&arr;.

Эти типы не являются безопасными. Если вы хотите рассматривать его как 1d массив int ценности, лучше всего объявить это тоже так.

2021-11-24 08:04:28

На других языках

Эта страница на других языках

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