Как реализовать цикл обработки элементов матрицы с помощью указателей? Без использования 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 шт):

Автор решения: Potatoe Channel
for (int ** i = matrix; i != matrix + cols - 1; i++) {
    for (int * j = *i; j != *i + cols; j++) {
        if (*j != 0) {
            schet++;
        }
    }
}

i проходит по указателям на строки матрицы, а j по самим строкам.

→ Ссылка
Автор решения: LShadow77

Как раз таким методом, как вы просили:

#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, как известно - это количество элементов в матрице).

→ Ссылка