2014-10-13 3 views
0

У меня есть следующий код:Почему я не могу разыменовать два массивных массива?

void main() 
{ 
    int a[3][4] = {{1,2,3,4},{11,12,13,14},{21,22,23,24}}; 
    printf("%d\n",*a); 
    system("pause"); 
} 

Выходной сигнал является адрес первого элемента массива. Зачем? Я ожидаю, что этот адрес будет разыменован.

+0

Потому что это 2D-массив. вам нужно разыграть его дважды.Разделение однажды дает вам адрес первой строки/столбца в зависимости от основного массива или большого хранилища столбцов массива. –

+0

'* a' означает' a [0] '. Это еще один массив. Наверное, вы имели в виду 'a [0] [0]'. –

+0

Подумайте, что такое 'a'? – Maroun

ответ

3

Чтобы получить контент, который вы, возможно, захотите разыменовать дважды. Первый элемент можно получить по:

**a 

или

*a[0] 
1

Многомерный массив в С является непрерывным.

int a [4] [5];

состоит из 4 встроенных модулей [5], расположенных в памяти друг друга.

Массив указателей:

INT * а [4];

неровный. Каждый указатель может указывать на (первый элемент) отдельный массив разной длины.

a [i] [j] эквивалентно ((a + i) + j). См стандарт С11, раздел 6.5.2.1:

Де определению оператора индекса [] является то, что Е1 [Е2] идентичен (* ((E1) + (E2)))

Таким образом, [i] [j] эквивалентно (* (a + i)) [j], что эквивалентно ((a + i) + j).

Эта эквивалентность существует, потому что в большинстве контекстов выражения типа массива распадаются на указатели на их первый элемент (стандарт C11, 6.3.2.1). a [i] [j] интерпретируется как:

a - массив массивов, поэтому он распадается на указатель на [0], первый подмассива. a + i - указатель на i-й подрамник a. a [i] эквивалентно * (a + i), разыменовывая указатель на i-й подрамник a. Поскольку это выражение типа массива, оно распадается на указатель на [i] [0]. a [i] [j] эквивалентен ( (a + i) + j), разыменовывая указатель на j-й элемент i-го подмассива a.

Обратите внимание, что указатели на массивы отличаются от указателей на их первый элемент. a + i - указатель на массив; это не выражение типа массива, и оно не распадается, будь то указатель на указатель или какой-либо другой тип.

и по какой-либо причине печать * a в одномерном массиве будет печатать первый элемент массива, тогда как * a в многомерном массиве будет печатать случайное число. Почему это так?

Вывод - это адрес первого элемента массива. Зачем?

printf ("% d \ n", * a);

* a будет эквивалентен [0], который печатает первый элемент массива.

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