'int'的问题

时间:2012-07-30 16:42:01

标签: c++ arrays multidimensional-array user-input

我是编程的新手,所以我想编写一个代码,让我输入一个二维数组(或我的情况下的矩阵)并在之后打印。

#include <iostream>
using namespace std;

void printArray( const int *array, int count ) 
    { 
       for ( int i = 0; i < count; i++ ) 
          cout << array[ i ] << " "; 

       cout << endl; 
    }

int main () {
int n;
cout<<"Please enter the length of your matrix : "<<endl;
cin>>n;
int * y=new int [n];
for (int w = 0; w <= n-1; w++ ) {

    y[w] = new int [n];
    cout<<"Insert the elements ";

            for (int z = 0; z <= n-1; z++)
            {
                cin >>y [w][z];
            }   
}

printArray(y, n);

}

但是我收到错误,例如&#34;无效转换来自&#39; int *&#39; to&#39; int&#39;&#34;和#34;数组下标&#34;的无效类型int [int]。您能否查看我的代码并指出我的缺陷?

由于

5 个答案:

答案 0 :(得分:6)

您将y声明为int*,它只是一维的。您需要将y声明为int**才能使其成为二维的。

您的代码无法编译的原因是因为int* y指向单个内存块(这是一个整数数组,换句话说,是一堆{{1} }峰)。 int是此数组中的y[w]之一,因此int无法编译,因为您尝试将y[w] = new int[n]分配给int*

int更改为y表示int**可以指向y的数组。由于每个int*都可以指向int*的数组,因此您将拥有一个二维数组。

带有int的10x10矩阵的示例代码:

int**

带有int** iShouldUseStdVector = new int*[10]; // allocate 10 int* <-- for (int i = 0; i < 10; i++) { iShouldUseStdVector[i] = new int[10]; // allocate 10 int <-- for (int k = 0; k < 10; k++) { iShouldUseStdVector[i][k] = k; } } 的10x10矩阵的示例代码:

std::vector

我建议使用std::vector<std::vector<int>> thisIsEasy; for (int i = 0; i < 10; i++) { thisIsEasy.push_back(std::vector<int>()); for (int k = 0; k < 10; k++) { thisIsEasy[i].push_back(k); } } ,因为它可以通过方便地增长来处理内存,因为你想要添加更多元素并在被破坏时释放内存。

答案 1 :(得分:1)

  

int * y = new int [n];

这是一个长度为n的数组。你需要的是:

int **y = new int*[n];
for (int i=0; i<n; i++)
    y[i] = new int[n];

....

//delete[] y[i] in a loop
delete[] y;

由于您使用的是C ++,为什么不呢:

#include <vector>

...
std::vector<std::vector<int> > matrix;

答案 2 :(得分:0)

int * y=new int [n];是指向动态分配的int值数组的指针;

y[w] = new int [n];尝试将指针指向数组的元素。

作为一项学习练习,搞乱原始数组是一个好主意。一旦你知道如何使用它们,你就会知道如何使用它们(非常多)并使用自动存储类型,如std::vector

答案 3 :(得分:0)

1)您希望将y声明为指向int数组的指针:

int ** y = new int* [n];

2)在printArray中,您正在处理矩阵,而不是数组。要访问矩阵的成员,请使用两个嵌套的for循环,如下所示:

for (int i = 0; i < nLines; i++) {
    for (int j = 0; i < nColumns; j++) {
        std::cout << matrix[i][j] << std::endl;
    }
}

3)您需要将指针传递给int数组,而不是指向int printArray方法的指针。

void printArray( const int **array, int count ) 

找到工作代码,上面有上述修复:http://ideone.com/2h9dR

答案 4 :(得分:0)

首先,阅读其他答案,然后重读一本好的C ++书中的指针章节。现在,除非您需要极速,否则请使用vector vector double。使用C ++ 11(较新的C ++标准),它非常好用且易读,所以我先发布它:

#include <iostream>
#include <vector>

void printArray( std::vector< std::vector<double> > & v ) {
   for ( const auto & row : v ){
      for ( const auto & value : row ){
        std::cout << value << " ";
      }
      std::cout << std::endl;
   }
}

int main () {
   int n;
   std::cout<<"Please enter the length of your matrix : "<<std::endl;
   std::cin>>n;
   std::vector<std::vector<double>> y(n,std::vector<double>(n,0));
   for ( auto & row : y ){
      std::cout<<"Insert the elements of row :";
      for ( auto & value : row ){
        std::cin >> value;
      }   
   }
   printArray(y);   
}

对于较旧的C ++,它是这样的:

void printArray( std::vector< std::vector<double> > & v ) {
   for ( std::vector<std::vector<double> >::const_iterator it = v.begin(); it != v.end();it++){
      for ( std::vector<double>::const_iterator it2 = it->begin(); it2!= it->end();it2++) {
     std::cout << (*it2) << " ";
      }
      std::cout << std::endl;
   }
}

int main () {
   int n;
   std::cout<<"Please enter the length of your matrix : "<<std::endl;
   std::cin>>n;
   std::vector<std::vector<double> > y(n,std::vector<double>(n,0));
   for ( std::vector<std::vector<double> >::iterator it = y.begin(); it!= y.end();it++){
      std::cout<<"Insert the elements of row :";
      for ( std::vector<double>::iterator it2 = it->begin(); it2!= it->end();it2++) {
     std::cin >> (*it2);
      }   
   }
   printArray(y);   
}

请注意,y(n,std::vector<double>(n,0))表示生成n个向量,每个向量都带有n个零。您也可以使用y[1][2]来获取和设置值。如果你使用y.at(1).at(2)代替你进行适当的检查,这样你就可以在读取或写出界限时得到异常。

相关问题