Как реализовать цикл обработки элементов матрицы с помощью указателей? Без использования i, j?
Как реализовать цикл с помощью указателей без использования i,j? Примерно таким методом(если получится)
int *p; ... for (p = &a[0][0]; p <= &a[NUM_ROWS-1][NUM_COLS-1]; p++)
int schet = 0;
for (int i = 0; i < cols - 1; i++)
{
for (int j = i + 2; j < cols; j++) {
if (matrix[i][j] != 0)
schet++;
}
}
Ответы (2 шт):
for (int ** i = matrix; i != matrix + cols - 1; i++) {
for (int * j = *i; j != *i + cols; j++) {
if (*j != 0) {
schet++;
}
}
}
i проходит по указателям на строки матрицы, а j по самим строкам.
Как раз таким методом, как вы просили:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM_ROWS 3
#define NUM_COLS 5
int main()
{
//динамически выделяем память под матрицу NUM_ROWS*NUM_COLS
int (*matrix)[NUM_COLS] = new int[NUM_ROWS][NUM_COLS];
//для примера: заполняем матрицу случайными значениями [-3..4]...
//...и выводим её
srand(time(NULL));
puts("Matrix:");
for (int i=0; i<NUM_ROWS; ++i)
{
for (int j=0; j<NUM_COLS; ++j)
printf("%2d ", matrix[i][j] = (rand()&7) - 3);
puts("");
}
puts("");
//подсчитываем количество ненулевых элементов, используя указатель
int schet = 0;
for (int* p = &matrix[0][0]; p < &matrix[NUM_ROWS][0]; ++p)
if (*p) ++schet;
//выводим результат
printf("Number of the non-zero elements is %d!\n", schet);
//освобождаем память
delete[] matrix;
return 0;
}
Поясню. Матрица с размером MxN в C/C++ представляется в памяти, как обычный одномерный массив из M*N элементов. Соответственно, выражение [i][j] преобразуется компилятором в [i*N+j], где N - число столбцов (а M, соответственно, это число строк). Следовательно, с помощью указателя мы можем пройтись по матрице, как по одномерному массиву, начиная с элемента [0][0] (который имеет эквивалентный индекс 0 в одномерном массиве) и заканчивая элементом [NUM_ROWS-1][NUM_COLS-1] (эквивалентный индекс которого (NUM_ROWS-1)*NUM_COLS+(NUM_COLS-1) = NUM_ROWS*NUM_COLS-1). Несуществующий "элемент", следующий за последним (которого мы не должны достигнуть), соответственно имеет двухмерный индекс [NUM_ROWS][0] (потому что NUM_ROWS*NUM_COLS, как известно - это количество элементов в матрице).