что [0] указывает (означает) в многомерном массиве? - PullRequest
1 голос
/ 06 апреля 2019

Я только начал изучать язык Си с книгой, и меня не смущает то, что они обсуждают указатели и массивы.Если существует многомерный массив (я просто буду обсуждать этот массив как двумерный, чтобы быть конкретным) с именем a[NUM_ROW][NUM_COLS], что означает a[0]?

В части, которую я изучал, была часть, касающаяся «обработки строк многомерного массива», и в ней был пример, где

p = &a[i][0] ; 

можно записать как

p = a[i]; 

и в книге сказано, что a[i] является указателем на первый элемент в строке i.

Затем была часть о «использовании имени многомерного массива в качестве указателя», где в случае int a[NUM_ROWS][NUM_COLS], имя массива a не указатель на a[0][0], а указатель на a[0].

Имеет ли a[0] то же значение, что и a[i] в первой части?Я немного сбит с толку, потому что в части об «использовании имени многомерного массива в качестве указателя» книги говорят, что имя массива a является указателем на целочисленный массив длины NUM_COLS (и имеет тип int (*) [NUM_COLS]

Мне было интересно, указывают ли a[0] целочисленный массив длины NUM_COLS или указатель на первый элемент в строке 0. (Или это то же самое? Может быть, так как я немного новичок в этой концепции и запутался.)

PS Книга является главой 12.4 C программирования (KNK)

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Как правило, имя массива распадается на указатель на его первый элемент. Многомерный массив - это просто массив массивов, поэтому, когда у вас есть int a[NUM_ROW][NUM_COL], a[i] - это «имя» i-й строки.

Таким образом, согласно вышеприведенному правилу, a[i] распадается на указатель на первый элемент этой строки, который равен a[i][0]. Чтобы создать указатель, мы ставим & перед выражением, так что &a[i][0].

И a распадается на указатель на первый элемент 2-мерного массива. Каждый элемент основного массива является строкой, а не отдельным целым числом, поэтому a эквивалентно &a[0], а не &a[0][0].

Расположение в памяти a[0] и a[0][0] одинаковое, разница заключается в типе выражения. Тип a[0][0] равен int, но тип a[0] равен int[NUM_COL], который во многих контекстах уменьшится до int *. Это проще всего увидеть с помощью оператора typeof:

printf("size of a = %d, size of a[0] = %d, size of a[0][0] = %d\n", sizeof a, sizeof a[0], sizeof a[0][0]);

Если NUM_ROW = 5 и NUM_COL = 10, вероятно, будет напечатано:

size of a = 200, size of a[0] = 40, size of a[0][0] = 4
0 голосов
/ 06 апреля 2019

Давайте разберемся с этим: массивы и указатели - это не одно и то же. Тип массива - это другой тип. Например, если у вас есть указатель int* ptr, ++ptr является абсолютно допустимым (хотя он может не указывать на что-то допустимое), но если у вас есть массив, такой как int a[3], вы не можете увеличить его. Но есть одно ограничение для массивов: вы не можете передавать массивы в функции, а функции могут не возвращать тип массива. Но что происходит, когда вы пытаетесь? Что происходит, если ваш массив неявно преобразуется в указатель на его первый элемент. Вот откуда возникает путаница: массивы преобразуются в указатель на их первый элемент, когда вам нужен указатель, указывающий на них. Следовательно, ptr = a будет означать, что ptr теперь указывает на первый элемент a.

Теперь давайте предположим, что у нас есть это:

int arr[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};

Что это такое? Это массив массивов. arr[i] относится к одному из ответов, хотя обычно он распадается на указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...