Итак, допустим, если [I] отправляется array
на функцию print
. Я передаю адрес первого массива 1-D (array[0]
) или am [I], просто передавая адрес самой первой переменной (array[0][0]
).
Вы передаете указатель на первый элемент array
, array[0]
, который сам по себе является массивом. Этот указатель имеет то же значение, что и указатель на array[0][0]
, но другой тип. На самом деле ваш код неверен в том, что тип аргумента и тип параметра функции не согласуются, но до тех пор, пока типы int(*)[]
и int *
будут иметь одинаковое представление, переинтерпретация будет работать на практике.
И как для функции print
, в этом случае, я правильно сказать, что при печати ar[0]
, я печать array[0][0]
?
Да, когда вы вызываете print()
, как и в своем примере, при условии, что представления типов согласуются, как описано выше.
Но почему это, что в случае печати *(ar+1)
, я на самом деле печать array[0][1]
вместо array[1][0]
?
Поскольку ar
является указателем на первый элемент array
, т.е. массива 1D array[0]
. Его элементами являются array[0][0]
, array[0][1]
и т. Д. ar + 1
является поэтому указателем на второй элемент array[0]
, который является array[0][1]
.
У вас есть два варианта, чтобы ваш код был правильным, оба из которых могут помочь в выяснении затронутых проблем. Вы можете изменить аргумент, который вы передаете print()
согласиться с функцией:
print(array[0]);
В качестве альтернативы, вы можете изменить объявленный тип аргумента print()
«s, ти соответствующего изменения его использования:
void print(int (*ar)[2]) {
printf("%d\n", ar[0][0]);
printf("%d\n", *(ar+1)[0]);
}
или
void print(int ar[][2]) {
printf("%d\n", ar[0][0]);
printf("%d\n", *(ar+1)[0]);
}
Последние два изменить смысл *(ar + 1)
.
Вы пытались скомпилировать, например, для gcc, '-Wall'? –
Это дало предупреждение. Скомпилируйте и посмотрите. – ameyCU
Прошли ли вы [этот вопрос] (http://stackoverflow.com/q/7784758/2706918)? Вам следует! :) –