Я учу себя немного C и наткнулся на упражнение, которое я хочу убедиться, что я полностью понимаю.В упражнении меня просят передать указатель на многомерный массив целых чисел и выполнить итерацию по массиву.Итак, я начал с функции печати, а затем перешел к одному из них, чтобы ввести массив для заполнения массива.Я перепробовал все виды вещей, но после нахождения небольшого количества кода на приведение типов и итерацию указателей у меня есть приведенная ниже программа, которая, кажется, работает, но я не совсем понимаю, что происходит.В моих комментариях у меня есть вопросы с пометкой 1-3, относящиеся к вопросам ниже кода.Я надеялся, что кто-то умнее меня сможет просветить меня.
//passing multi-Array to a simple print function
#include <stdio.h>
//simple print function prototype
void printMyArr(int (*pt)[4]);
int main()
{
//declare and initialize a multi-array. I picked 4x4 and some arbitrary
//numbers for simplicity's sake
int myArr[4][4] = { {12, 16, 19, 20},
{5, 99, 102, 200},
{12, 20, 25, 600},
{65, 66, 999, 1000} };
//declare a pointer to an array of integers and an int for a loop counter
int (*pt)[4], counter;
//initialize the pointer
pt = myArr;
//for loop calling printMyArr function to iterate through arrays -- or this is what I understand it to mean
for(counter=0; counter<4; counter++)
printMyArr(pt++); //<-------------Question 1
return 0;
}
//function called to print array elements to the console
void printMyArr(int(*pt)[4])
{
//declare a counter....and apparently another pointer
int counter, *p;
//initialize new pointer to old pointer and type cast array as int
p = (int *)pt; //<-------------Question 2
//for loop to iterate through elements of array -- or this is what I understand it to mean
for(counter=0; counter<4; counter++)
printf("\n\n\n%d", *p++); //<------Question 3
}
Вопрос 1: Здесь я передал указатель на функцию и продолжаю думать: «Что за цикл повторяется?».Правильно ли я считаю, что я увеличиваю указатель на каждый из первых элементов в каждом массиве (myArr[0][0]
, myArr[1][0]
, myArr[2][0]
, myArr[3][0]
)?Кроме того, я прав, предполагая, что синтаксис этой строки в сущности говорит: «Выполните функцию, передающую текущий указатель, и ТО, когда это будет сделано, увеличьте указатель.»?
Вопрос 2: Вот чтоменя больше всего смущает.После долгого копания я обнаружил, что этот бит работает правильно, и я понимаю, что так оно и есть, но почему?
Вопрос 3: Правильно ли я думаю, что я увеличиваю каждый элемент здесь?
Итак
1: передать указатель как назначено -> myArr[0][0]
, затем вывести значения в myArr[0][0]
, myArr[0][1]
, myArr[0][2]
и myArr[0][3]
, затем увеличить указатель myArr[1][0]
2: передать указатель как назначено -> myArr[1][0]
, затем вывести значения в myArr[1][0]
, myArr[1][1]
, myArr[1][2]
и myArr[1][3]
с указателем приращения до myArr[2][0]
3: передать указатель в соответствии с назначением -> myArr[2][0]
, затем вывести значения в myArr[2][0]
, myArr[2][1]
, myArr[2][2]
и myArr[2][3]
, увеличить указатель на myArr[3][0]
4: передать указатель в соответствии с назначением-> myArr[3][0]
затем выведите значения в myArr[3][0]
, myArr[3][1]
, myArr[3][2]
и myArr[3][3]
, увеличивая указатель до myArr[4][0]
, и если это так, на что указывает указатель, поскольку не должно бытьmyArr[4][0]
?