int iMtxA[][SZ_MATRIX] = { { 4, 8, 2, 5, 3 },
{ 7, 8, 6, 5, 0 },
{ 4, 7, 2, 7, 9 },
{ 6, 4, 7, 8, 3 },
{ 2, 0, 5, 3, 9 } };
int iMtxB[] = { 7, 3, 2, 9, 6 };
Индексация указателей
Задача: умножить строку iRank матрицы iMtxA на столбцовую матрицу iMtxB (да, это - столбец :) ). Казалось бы, очевидный код, а вызвал проблемы:
Код:
#define SZ_MATRIX 5
...
int** iMtxA = {{4, 8, 2, 5, 3},
{7, 8, 6, 5, 0},
{4, 7, 2, 7, 9},
{6, 4, 7, 8, 3},
{2, 0, 5, 3, 9}};
int* iMtxB = {7, 3, 2, 9, 6};
int iMtx = 0;
int iRank = 0;
int i = 0;
...
for(i = 0; i < (SZ_MATRIX - 1); i++)
iMtx += iMtxA[iRank][i] * iMtxB[i];
...
int** iMtxA = {{4, 8, 2, 5, 3},
{7, 8, 6, 5, 0},
{4, 7, 2, 7, 9},
{6, 4, 7, 8, 3},
{2, 0, 5, 3, 9}};
int* iMtxB = {7, 3, 2, 9, 6};
int iMtx = 0;
int iRank = 0;
int i = 0;
...
for(i = 0; i < (SZ_MATRIX - 1); i++)
iMtx += iMtxA[iRank][i] * iMtxB[i];
Спасибо за разъяснение.
Код:
Код:
#include <iostream>
using namespace std;
int main() {
int array2d[][4] = {
{10, 20, 30, 40},
{50, 60, 70, 80},
{15, 25, 35, 45}
};
int *p = (int*)array2d;
for (int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++)
cout << p[i*4+j] << "; ";
//либо:
//cout << *(p+i*4+j)<< "; ";
cout << endl;
};
return 0;
}
using namespace std;
int main() {
int array2d[][4] = {
{10, 20, 30, 40},
{50, 60, 70, 80},
{15, 25, 35, 45}
};
int *p = (int*)array2d;
for (int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++)
cout << p[i*4+j] << "; ";
//либо:
//cout << *(p+i*4+j)<< "; ";
cout << endl;
};
return 0;
}
P.S. Лучше действительно не страдать :)
Спасибо, помогло. Однако, яснее не стало. Почему мой вариант дает ошибку?
Спасибо большое! Конечно, лучше не страдать. Просто меня смутил второй аргумент int main(). Там ведь безразмерный char argv[][] или char** argv и все работает, а тут нет. )
Код:
#include <iostream>
using namespace std;
int main() {
int array2d[][4] = {
{10, 20, 30, 40},
{50, 60, 70, 80},
{15, 25, 35, 45}
};
int **pp = new int*[3];
for (int i = 0; i < 3; i++)
pp[i] = array2d[i];
for(int i = 0; i < 3; i++) {
for(int j = 0; j <4; j++)
cout << pp[i][j] << "; ";
//либо:
//cout << *(*(pp+i)+j)<< "; ";
cout << endl;
}
delete [] pp;
return 0;
}
using namespace std;
int main() {
int array2d[][4] = {
{10, 20, 30, 40},
{50, 60, 70, 80},
{15, 25, 35, 45}
};
int **pp = new int*[3];
for (int i = 0; i < 3; i++)
pp[i] = array2d[i];
for(int i = 0; i < 3; i++) {
for(int j = 0; j <4; j++)
cout << pp[i][j] << "; ";
//либо:
//cout << *(*(pp+i)+j)<< "; ";
cout << endl;
}
delete [] pp;
return 0;
}
Код:
int *m[] = {array2d[0], array2d[1], array2d[2]};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
cout << m[i][j] << "; ";
cout << endl;
}
cout << endl;
int **pp2 = m;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
cout << pp2[i][j] << "; ";
cout << endl;
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
cout << m[i][j] << "; ";
cout << endl;
}
cout << endl;
int **pp2 = m;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
cout << pp2[i][j] << "; ";
cout << endl;
}