Прежде всего, я прошел по этим ссылкам, чтобы лучше понять многомерные массивы и как передать их в функции
https://stackoverflow.com/a/17569578/10452758
http://c -faq.com / aryptr / pass2dary.html
https://jameshfisher.com/2016/12/08/c-array-decaying/
У меня все еще есть некоторая неясность, связанная с этими вещами, о которой я хотел бы спросить
Предположим, у нас есть двумерный массив, подобный
int mat[][COLS] = {{...}}
i) Мы знаем, что мы можем передать mat
в функцию, если ее размер фиксирован, т.е. известен во время компиляции как int (*mat)[COLS]
функции.
Здесь mat
упоминается как один указатель на целочисленный массив, т.е. он указывает на целый целочисленный массив, тогда mat
в основной функции, как определено выше, будет упоминаться как тот же, то есть один указатель на целочисленный массив или это вообще не указатель ??? Но печать mat
в консоли выдает адрес, так что в основном это указатель.
Как и в случае int arr[] = {}
, мы говорим, что arr
- это адрес первого элемента, что можно сказать о mat
.
Я понимаю разницу между ч / б mat
и mat[0]
, но почему указатель, указывающий на весь массив, и указатель, указывающий на первый элемент массива, имеют одинаковое значение. Как в случае разыменования указатель, кто-то знает, что это указатель на первый элемент или весь массив ???
Я знаю, что вопрос звучит немного расплывчато, но просто хочу знать, почему mat
и mat[0]
указывают на один и тот же адрес памяти, потому что, если они означают разные вещи, они не будут иметь разные значения ???
Если кто-то может поделиться тем, что он знает о том, что mat
называет указателем, это будет очень полезно.
Я прочитал другие ТАК вопросы по этим темам , но эти вещи до сих пор со мной не щелкнули.
ii) Мы знаем, что массивы в C в основном не являются указателями, но когда мы получаем доступ к значению массива, он уменьшается до значения типа указателя. В общем, я хотел бы спросить: не является ли указатель в int arr[] = {...}
, arr
указателем, и я хочу поддержать его с помощью sizeof(arr)!=size_occupied_by_pointer
, в том случае, когда мы определяем mat
и когда мы печатаем их в консоли, Упущенные значения указателя упоминаются. Это ответ на первый вопрос ???
iii) Другое сомнение, которое у меня есть, - передача матрицы в качестве указателя на указатель.
Это код, которому я стремлюсь следовать, но это приводит к ошибке сегментации. Если кто-то может указать на ошибку -
void process_pointer_to_pointer(int **arr, size_t rows, size_t cols){
for (size_t i = 0; i < rows; ++i){
std::cout << i << ": ";
for (size_t j = 0; j < cols; ++j)
std::cout << arr[i][j] << '\t';
std::cout << std::endl;
}
}
int main(int argc, char const *argv[]){
const int m=4, n=4;
int mat[][n]= {
{1, 3, 1, 5},
{2, 2, 4, 1},
{5, 0, 2, 3},
{0, 6, 1, 2}
};
int *ip = &mat[0][0];
process_pointer_to_pointer(&ip, m, n);
Я знаю более простой способ сделать то же самое, используя массив указателей и заполнив их mat[i]
, но я следовал ограничению в следовании этому методу и попробовал этот подход отсюда
http://c -faq.com / aryptr / pass2dary.html
но не получил желаемого результата ...
PS: Вопрос может быть совершенно повсеместным, поэтому, если вы не в состоянии понять что-то конкретное, пожалуйста, спросите меня. Я более чем счастлив идти в режиме дебатов. Кроме того, я новичок в кодировании, поэтому, пожалуйста, немного ослабьте меня. : Р