我有一个任务说明:"你的任务是用10x10矩阵填充将其变成乘法表的值。你不能使用括号。你不能使用索引。你必须使用指针。"
输出应该如下: 10x10 multiplication table
这就是我最终的解决方案:
#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 ++,如果你的帮助足以让我理解并以最简单的形式,那将是非常友好的。
谢谢!
答案 0 :(得分:0)
理解你的任务是什么的关键是理解内存中变量的布局。链接:Array declaration
T a[N];
形式的声明,将a
声明为一个数组对象,由N
个连续分配的T
对象组成。
声明:int matrix[10][11]
表示有10个数组,每个数组包含11个int。
但因为这也是连续的,这意味着这也可以解释为10*11 = 110
连续的int。 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';
}
答案 1 :(得分:0)
这是我提出的最终解决方案:
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;}
谢谢大家!