давайте рассмотрим следующий фрагмент кода:Запись массива референс с помощью указателя arithmatic
#include<stdio.h>
main()
{
int count[100][10];
*(count + (44*10)+8)=99;
printf("%d",count[44][8]);
}
Что такое случилось с ним?
давайте рассмотрим следующий фрагмент кода:Запись массива референс с помощью указателя arithmatic
#include<stdio.h>
main()
{
int count[100][10];
*(count + (44*10)+8)=99;
printf("%d",count[44][8]);
}
Что такое случилось с ним?
*(count + (44*10)+8)=99;
должен быть
*(count[0] + (44*10)+8)=99;
Тип countp[0]
может быть переосмыслено в int *
, как вы хотите.
Тип count
является int [100][10]
таким образом добавляя некоторое большое число, чтобы он пошел бы в 10 раз вперед, как вы хотите, и доступ к этому месту может привести к UB.
Anopter способ написать то же самое:
*(*(count + 44) + 8)=99;
Объяснение будет приятным. –
@EdHeal Я случайно ударил ключом + ключ ввода, который отправил ответ до завершения. Я принимаю (+1 для напоминания), что он был неполным. –
Ур ответ завершен сейчас? @Mohit Jain –
count[44][8]
не инициализирован, и вы пытаетесь напечатать значение его, которое UB.
a[i][j] = *(a[i] + j);
a[i][j] = *(*(a+i) + j);
Так что, если вы хотите, чтобы инициализировать count[44][8]
затем сделать
*(count[44] + 8) = 10; /* or *(*(count + 44) + 8) = 10 */
printf("%d",count[44][8]);
Будет ли U объяснять код ур ...! это правило a [i] [j] = * (a [i] + j); a [i] [j] = * (* (a + i) + j) для доступа к 2d-массиву @Gopi –
int count [100] [10], * countP; \t countP = count; \t * (countP [44] +8) = 99; он не работает для этого фрагмента. –
@BlackSwan - это правило. Любой массив - это просто блок адресов в памяти. Вы можете адресовать любой конкретный адрес с помощью либо стандартного обозначения массива 'count [44] [8]', либо указав 'offset' в памяти из базового адреса count (например,' * (* (count + 44) + 8) '). Базовая эквивалентность легче понять для 1D-массива: 'a [i] = * (a + i)'. Для 2D-массива у вас просто есть дополнительный слой: 'a [i] [j] = * (* (a + i) + j)' –
Массив-к-указатель гниение работает только на одном уровне; так int count[100][10];
распадается до int (*)[100]
(Why does int*[] decay into int** but not int[][]?).
Вы можете либо бросить count
в int*
или использовать &count[0][0]
, чтобы получить int*
указатель на первый элемент массива 2D.
Я не знаком C++, только с C. он работал по-урному, но я до сих пор смущен, почему я должен его бросить ...! –
@BlackSwan см. Ответ Оливера Чарльворта: http://stackoverflow.com/a/14183554/567292 - разложение с помощью массива на указатель работает точно так же в C и C++, просто C++ дает больше возможностей для его наблюдения. – ecatmur
Не ответ: использование 'int main()' было бы хорошим –
'count [44] [8] = 99'. – UmNyobe
Возможный дубликат [Почему int \ * \ [\] распадается на int \ * \ *, но не int \ [\] \ [\]?] (Http://stackoverflow.com/questions/14183546/why-does -int-decay-in-int-but-not-int) – ecatmur