2016-10-30 3 views
-2

Вот код и интересно, можете ли вы помочь мне разобраться.Понимание двухмерных массивов

/* Two dimensional array */ 

#include <stdio.h> 

void main() { 
    int i, j, sum[2], mean[2]; 
    int mark[3][2] = { { 34, 56}, { 48, 65}, { 53, 59} }; 

    for (j = 0; j < 2; j++) 
     sum[j] = 0; 
    for (i = 0; i < 3; i++) { 
     for (j = 0; j < 2; j++) { 
      sum[j] = sum[j] + mark[i][j]; 
     } 
    } 
    for (j = 0; j < 2; j++) 
     mean[j] = sum[j]/3; 
    printf("Average mark in Mathematics is %d\n", mean[0]); 
    printf("Average mark in Chemistry is %d\n", mean[1]); 
} 

Мое понимание этого до сих пор ....

Определение типов данных I, J, сумма [2], средний [2] в виде целых чисел.

Инициализация массива .... mark - это тип данных int, массив должен иметь 3 строки и 2 столбца.

Первый для цикла, j, инициализированный в 0, условие: j должно быть меньше 2, обновить: добавить один на значение j. Сумма j = 0.

Также для 2-го цикла, i инициализируется в 0, условие: i должно быть меньше 3, обновить: добавить один на значение i.

Аналогично для следующей строки, которая использует цикл for и значение j.

Я немного смущен синтаксисом: sum [j] = sum [j] + mark [i] [j]; это означает, выведите сумму j и добавьте ее в метки, содержащиеся в массиве, отображаемом как [i] и [j].

После того, как это будет завершено, аналогичная j-петля, хотя и не уверена, как это взаимодействует с предыдущими циклами.

Среднее значение и значения, напечатанные на экране.

Когда я посмотрел на рабочем примере ... сумма [0] = 0 и сумма [1] = 0, я не понимаю, почему сумма [1] также 0.

Во-первых, я = 0 и у = 0,

сумма [0] = сумма [0] + знак [0,0]

, то J = 1

сумма [1] = сумма [1 ] + отметка [0,1]

затем

= 1, J = 0 сумма [0] = сумма [0] + знак [1,0]

затем

сумма [1] = сумма [1] + знак [1 , 1]

тогда я = 2, J = 0

сумма [0] = сумма [0] + знак [2,0]

затем

сумма [1] = сумма [1] + отметить [2,1]

Что меня немного сбивает, так это то, как петли взаимодействуют друг с другом и значения i и j повсюду.

Я знаю, что массив 2d будет в таблице (что я не могу отформатировать здесь).

Был бы признателен, если бы кто-нибудь мог пролить свет на это.

+0

«Что меня немного сбивает, так это то, как петли взаимодействуют друг с другом и значения i и j повсюду». Используйте отладчик для выполнения кода. Или даже ручку и бумагу. – kaylum

+0

Хорошим отладчиком будет 'gdb'. –

+0

Это очень базовое знание программирования ... – norbertoonline

ответ

2

sum[j] = sum[j] + mark[i][j]; можно упростить как sum[j] += mark[i][j];. Он добавляет содержимое ячейки в строке i, столбец j из 2D-матрицы mark в j-й элемент массива sum.

Доступ к элементу двумерного массива написан mark[i][j] в C, а не mark[i, j].

Обратите внимание, что mark[i, j] не ошибка синтаксиса: выражение i, j является выражением запятой, оценка i, а затем отбрасывая его и оценки j. Таким образом, это то же самое, что и mark[j], который не является ячейкой матрицы, а ссылкой на -я строка 2D-матрицы.

-4

Нет, массив на самом деле является указателем (он же адресом). Когда вы определяете int sum[2], сумма представляет собой адрес первого элемента вашего массива из двух целых чисел.

Таким образом, сумма составляет int* или int[] (такие же).

Mark - это 2-й массив. Марк на самом деле является массивом массива. Таким образом, Mark содержит адреса, а адреса thoses - это начало некоторых массивов.

(На самом деле он может быть другим в памяти, но компилятор выполняет работу).

Mark является int** или адресом адреса.

Когда вы делаете:

for (i = 0; i < 3; i++) { 
    for (j = 0; j < 2; j++) { 
     sum[j] = sum[j] + mark[i][j]; 
    } 
} 

Это как если бы вы говорили

for each line i in the array, I want to do: 
    for each value j in the line, I want to do: 
     ...; 

Подобно этому, вы работаете на каждой «линии» (или столбце, представьте, как вы хотите), и для каждой «линии» вы работаете над каждым значением.

+2

Это очень запутывает: * массив на самом деле является указателем (он же адресом) *. Массив ** не ** указатель. массив - это объект, который содержит ряд значений, а указатель - это переменная, которая может содержать адрес такого объекта. 2D-массив - это просто массив массивов. * Таким образом, Mark содержит адреса, и эти адреса являются началом некоторых массивов. * Это полностью неверно. 'mark' ** не **' int ** ', это объект, содержащий 3 группы из двух значений' int'. Никаких указателей. Я редко даю ответы, но этот бесполезен. – chqrlie

+0

Нет, это правда. Массив - это указатель. Попробуйте сделать printf («% p \ n», sum); вы сами увидите это, это адрес. Массив в памяти - это только смежная область, но ваша переменная - это адрес первого элемента. Когда вы делаете сумму [3], это как * (сумма + 3), и это указатель. Вы также можете создать массив с malloc. Или вы можете назначить «int * ptr = sum», он будет работать без проблем. – Ludonope

+1

Нет, массив не является указателем. Выражение массива в некоторых, но не во всех контекстах * преобразуется * в выражение указателя. Попробуйте применить 'sizeof' к объекту массива. Пожалуйста, прочитайте раздел 6 [comp.lang.c.FAQ] (http://www.c-faq.com), прежде чем продолжать распространять дезинформацию. –

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