Как я могу исправить свой код на C, добавив указатели?
За исключением опечатки для вызова функции на Identity
, ваш код на самом деле не сломан, поэтому "добавление указателей"ничего не исправляет.
Я понял, как создать матрицу, но не с помощью указателей.
Вы говорите это, но на самом деле вы этого не сделалисоздал матрицу с размещенным кодом;Вы просто распечатываете шаблон, который напоминает матрицу идентичности.
.. мой учитель хочет, чтобы мы использовали методы указателя / адресации для отображения матрицы.Я не совсем понимаю указатели, и у меня возникли проблемы с добавлением его в мой код ..
Если ваш учитель хочет, чтобы вы использовали указатели для отображения матрицы, то вам придется создать ее.,Это можно сделать статически или динамически.Статически имеет смысл для новичка / студента.Вы могли бы сделать это так: int matrix[5][5]
Понимание указателей часто является одним из самых сложных аспектов C для новичков, чтобы поднять, так что это нормально.Возможно, вам уже говорили об этом раньше, но я скажу это снова: указатель указывает на область памяти.Вы можете использовать этот указатель для получения значения в ячейке памяти (он же разыменование ).
Например:
int a = 10;
int * p = &a; //p points to the memory location where a is stored
/* these print the same thing */
printf("%d\n", a);
printf("%d\n", *p); //dereferencing
Как это связано с массивами и матрицами?Когда вы объявляете массив, имя этого массива ссылается на ячейку памяти для начала массива.Каждый последующий элемент расположен с некоторым смещением от начала, то есть n-й элемент расположен по начальному адресу плюс (n - 1).Вот пример статического выделения массива и назначения отдельных областей памяти этого массива:
int a[10] = {0}; //an array of 10 signed integers that have been initialized to 0
printf("0x%x\n", a); //prints the beginning address of the array a
a[0] = 10; //assign the 0th element
printf("%d\n", a[0]); //prints 10
*a = 11; //this also assigns the 0th element
printf("%d\n", *a); //prints 11
a[1] = 12; //assign the 1st element
printf("%d\n", a[1]); //prints 12
*(a + 1) = 13; //this also assigns the 1st element
printf("%d\n", *(a + 1)); //prints 13
Матрица - это массив массивов, но все элементы находятся в памяти рядом друг с другом, поэтому вы можете обращаться к элементамлинейным образом: начальный_адрес + current_row * total_number_of_columns + current_column
Зная это, давайте изменим вашу Identity
функцию:
int Identity(int * ptr, int num) {
int row, col;
for (row = 0; row < num; row++) {
for (col = 0; col < num; col++) {
// Check if row is equal to column
if (row == col)
*(ptr + row*num + col) = 1;
else
*(ptr + row*num + col) = 0;
}
}
return 0;
}
Теперь он принимает указатель на int и размерединичной матрицы.Чтобы использовать его, мы передадим ему указатель на начало нашей матрицы вместе с размером матрицы.
Примерно так:
int main(){
/* this needs to match your matrix dimensions!! */
int size = 5;
/* statically allocate 5 x 5 matrix of signed integers */
int matrix[5][5] = {0};
/* modifies our matrix to make it an identity matrix */
Identity(&matrix[0][0], size); //first argument is the address of the element located in row 0, column 0
/* now go through and print elements of the matrix */
//I'm going to leave this part up to you
return 0;
}
Подробнее о матрицах вC, посмотрите этот учебник