Hỏi về con trỏ trong mảng hai chiều

#define N cột
// i hàng, j cột

Duyệt qua 1 hàng

p = (double *)(a + i);
for (j = 0; j < n; j++)
{
	cout<< *p;
	p++;
}

Duyệt qua 1 cột

p = (double *)a;
p = p + j;
for (i = 0; i < m; i++)
{
	cout<< *p;
	p = p + N;
}

In ra toàn bộ các phần tử trong mảng

*(p + i * N + j);

Tại sao duyệt qua 1 hàng lại không phải như lệnh dưới, mình thấy lệnh duyệt 1 hàng phía trên nó xung đột với lệnh duyệt toàn bộ các phần tử trong mảng. Mình nghĩ địa chỉ của hàng thì nó sẽ trỏ tới phần tử đầu tiên của hàng đó chứ nhỉ?

p = (double *)(a + i*N);

Vẫn không hiểu được lệnh chạy ntn?

#include <iostream>

using namespace std;

int main()
{
    int *b;
    int n[3][3]={{5,2,1},{13,9,8},{-5,7,18}};
    // *n là giá trị địa chỉ mảng đầu tiên
    b = *n;
    int hang = 3, cot = 3;
    cout<<"n[0][0]: "<<n[0][0]<<endl;
    cout<<"b: "<<b<<endl;
    cout<<"*b: "<<*b<<endl;
    cout<<"*(b+1): "<<*(b+1)<<endl;
    cout<<"*(b+3): "<<*(b+3)<<endl;
    cout<<"*(b+5): "<<*(b+5)<<endl;
    cout<<"*b+1: "<<*b+1<<endl;
    cout<<"*b+3: "<<*b+3<<endl;
    cout<<"In ra toan bo ma tran 2 chieu"<<endl;
    for(int i=0;i<cot;i++)
    {
        for(int j=0;j<hang;j++)
        {
            cout<<*(b+i*hang+j)<<" ";
        }
        cout<<'\n';
    }
    cout<<"In ra phan tu dau tien hang 2: *(b+cot): "<<*(b+cot)<<endl;
    // duyệt qua 1 hàng
    cout<<"In ra toan bo hang 2: "<<endl;
    for(int j=0;j<3;j++)
    {
        cout<<*(b+cot+j)<<" ";
    }
    cout<<'\n';
    int r = 0;
    cout<<"In ra toan bo hang "<<r+1<<endl;
    b=*(n+r);  .// <- Làm sao máy hiểu n+r là mình đang tăng hàng lên r mà không phải cột, máy sẽ tự động xác định là cot*r ????
    for(int j=0;j<3;j++)
    {
        cout<<*(b+j)<<" ";
    }
    //Báo lỗi:
    b=*(n+r*cot) // <- coi n chứa địa chỉ của giá trị đầu tiên của mảng, tăng lên r*cot để đạt vị trí đầu tiên của hàng thứ r+1.
    return 0;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?