2015-01-29 3 views
3

давайте рассмотрим следующий фрагмент кода:Запись массива референс с помощью указателя arithmatic

#include<stdio.h> 
main() 
{ 
int count[100][10]; 
*(count + (44*10)+8)=99; 
printf("%d",count[44][8]); 
} 

Что такое случилось с ним?

+0

Не ответ: использование 'int main()' было бы хорошим –

+0

'count [44] [8] = 99'. – UmNyobe

+0

Возможный дубликат [Почему int \ * \ [\] распадается на int \ * \ *, но не int \ [\] \ [\]?] (Http://stackoverflow.com/questions/14183546/why-does -int-decay-in-int-but-not-int) – ecatmur

ответ

1

*(count + (44*10)+8)=99; должен быть

*(count[0] + (44*10)+8)=99; 

Тип countp[0] может быть переосмыслено в int *, как вы хотите.

Live code here

Тип count является int [100][10] таким образом добавляя некоторое большое число, чтобы он пошел бы в 10 раз вперед, как вы хотите, и доступ к этому месту может привести к UB.

Anopter способ написать то же самое:

*(*(count + 44) + 8)=99; 
+1

Объяснение будет приятным. –

+0

@EdHeal Я случайно ударил ключом + ключ ввода, который отправил ответ до завершения. Я принимаю (+1 для напоминания), что он был неполным. –

+0

Ур ответ завершен сейчас? @Mohit Jain –

2
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]); 
+0

Будет ли U объяснять код ур ...! это правило a [i] [j] = * (a [i] + j); a [i] [j] = * (* (a + i) + j) для доступа к 2d-массиву @Gopi –

+0

int count [100] [10], * countP; \t countP = count; \t * (countP [44] +8) = 99; он не работает для этого фрагмента. –

+0

@BlackSwan - это правило. Любой массив - это просто блок адресов в памяти. Вы можете адресовать любой конкретный адрес с помощью либо стандартного обозначения массива 'count [44] [8]', либо указав 'offset' в памяти из базового адреса count (например,' * (* (count + 44) + 8) '). Базовая эквивалентность легче понять для 1D-массива: 'a [i] = * (a + i)'. Для 2D-массива у вас просто есть дополнительный слой: 'a [i] [j] = * (* (a + i) + j)' –

2

Массив-к-указатель гниение работает только на одном уровне; так int count[100][10]; распадается до int (*)[100] (Why does int*[] decay into int** but not int[][]?).

Вы можете либо бросить count в int* или использовать &count[0][0], чтобы получить int* указатель на первый элемент массива 2D.

+0

Я не знаком C++, только с C. он работал по-урному, но я до сих пор смущен, почему я должен его бросить ...! –

+0

@BlackSwan см. Ответ Оливера Чарльворта: http://stackoverflow.com/a/14183554/567292 - разложение с помощью массива на указатель работает точно так же в C и C++, просто C++ дает больше возможностей для его наблюдения. – ecatmur

Смежные вопросы