Присвоение значения двумерному массиву с использованием указателей C ++ - PullRequest
0 голосов
/ 10 мая 2018

У меня есть задача, которая гласит: «Ваша задача - заполнить матрицу 10x10 значениями, которые превратят ее в таблицу умножения. Вы не должны использовать скобки. Вы не должны использовать индексацию. Следовательно, вы должны использовать указатели. "

Вывод должен быть следующим: Таблица умножения 10x10

Это решение, которое я получаю в итоге:

#include <iostream> 
using namespace std; 
int main(void) {
int matrix[10][11] = {};

    for(int i = 0; i <= 10; i++) {
        for(int j = 0; j <= 10; j++) {
            matrix[i-1][j-1]= i*j;
        }
    }

    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 10; j++) {
        cout.width(4);
        cout << matrix[i][j]; }

        cout << endl;
    } 
}

Я пыталсяподумайте, как я могу использовать указатели вместо индексации, но я мог бы найти любую информацию о том, как использовать указатели с двумерными массивами.

Я только начал изучать C ++, и было бы очень любезно, если бы ваша помощь была достаточно наглядной и понятной для меня.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Ключом к пониманию вашего назначения является понимание расположения переменных в памяти. Ссылка: Объявление массива

Объявление в форме T a[N];, объявляет a как объект массива, состоящий из N смежно распределенных объектов типа T.

Объявление: int matrix[10][11] означает, что существует 10 массивов по 11 целых.

НО, поскольку это ТАКЖЕ непрерывно, это означает, что это также можно интерпретировать как 10*11 = 110 непрерывное целое. int matrix_1D[ 110 ];

Так как добраться до этих элементов?

Обычно это делается с использованием адреса первого элемента: &matrix[0][0].

Результат:

const int n = 10;
const int m = 10;
int matrix[ n ][ m ];

int* matrix_ptr = &matrix[0][0];

for ( int i = 1; i <= n; ++i )
    for ( int j = 1; j <= m; ++j )
    {
        *matrix_ptr = i * j;
        ++matrix_ptr;
    }

С помощью оператора ++ указатель переместится на следующий элемент.

Для вывода лучше выбрать Range-based for loop

for ( const auto& row : matrix )
{
    for ( const auto& num: row )
    {
        std::cout << std::setw( 4 ) << num;
    }
    std::cout << '\n';
}
0 голосов
/ 10 мая 2018

Это окончательное решение, которое я придумал:

    int matrix[10][10];

    // *(*(matrix + 0)+1); -----> matrix[0][1]
    // int** ----> int[][]

    for(int i = 1; i < 11; ++i) {
        for(int j = 1; j < 11; ++j)
            *(*(matrix+i-1)+j-1)=i*j;
        }

    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 10; j++) {
        cout.width(4);
        cout << matrix[i][j]; }

        cout << endl;}

Спасибо всем!

0 голосов
/ 10 мая 2018

вы можете сделать

#include <iostream> 
using namespace std; 
int main(void) {
int matrix[11][11] = {};

    for(int i = 1; i <= 10; i++) {
        for(int j = 1; j <= 10; j++) {
            *(*(matrix + i - 1) + j - 1) = i * j;
        }
    }

    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 10; j++) {
        cout.width(4);
        cout << matrix[i][j]; }

        cout << endl;
    } 
}

int[][] может использоваться как int**

, поэтому матрица может рассматриваться как int** и *(matrix + i) - это то же самое, что и matrix[i]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...