用c ++计算数组的长度

时间:2014-04-20 09:00:08

标签: c++ arrays

我有一个用java编写的代码,我想把它转换成c ++,我找不到计算c ++中数组长度的方法

Java代码:

public void printPerm(int[][] p){
    for(int i=0;i<p.length;i++){
        for(int j=0;j<p[i].length;j++)
            System.out.print(p[i][j]);
        System.out.println();
    }
}

转换的c ++代码

void printPerm(int **p)
{
 for (int i = 0;i < sizeof(p) / sizeof(p[0]) ;i++)
 {
    for (int j = 0;j < (p[i].length);j++)
    {
        cout << p[i][j]; 
    }
    cout << endl;
 }
}

我需要在C ++中将“p [i] .length”转换为相应的一个,其中我将循环遍历数组p中的项目数,j将循环遍历数组p [i]中每个项目的长度

4 个答案:

答案 0 :(得分:6)

在C ++中没有内置的方法来查找普通数组的长度。 (sizeof仅在拥有原始数组时有效,而不是在有指针的情况下有效。)

有三种解决方案:

  • 自己跟踪长度
  • 使用标准容器,例如std::arraystd::vector
  • 使数组长一个元素,并在最后添加一个sentinel值。

答案 1 :(得分:2)

那不行。 p是一个指针,因此sizeof(p)将是指针的大小 - 可能是8. p[0]也是一个指针,因此它的大小将是相同的。

C ++原始数组不像Java数组那样存储它们的大小;你需要分别跟踪它。更好的策略可能是使用容器类(例如std :: vector)而不是原始数组。

答案 2 :(得分:1)

与Java c不同,C ++不传递数组的大小。

你必须自己做。

或者,有一个C ++的解决方案。

它被称为std :: vector,其行为方式与Java类似

答案 3 :(得分:1)

如果printPerm的参数确实是一个二维数组,则它不能隐式转换为int **类型。如果参数确实类型为int **,则需要声明另外两个参数,这两个参数将指定子数组的数量和每个子数组中的元素数。 C ++中的指针不会封装有关它们引用的元素数量的信息。

假设参数的定义方式如下

int m = 10;
int n = 20;

int **p = new int * [m];

for ( int i = 0; i < m; i++ ) p[i] = new int [n];

在这种情况下,该函数应定义为

void printPerm( const int **p, int m, int n )
{
   for ( int i = 0; i < m; i++ )
   {
      for ( int j = 0; j < n; j++ )
      {
         std::cout << p[i][j]; 
      }
      std::cout << std::endl;
   }
}

并称为

printPerm( p, m, n );

如果参数的定义方式如下

const int M = 10;
const int N = 20;
int p[M][N];

然后应该按照以下方式定义函数

void printPerm( const int ( *p )[N], int m )
{
   for ( int i = 0; i < m; i++ )
   {
      for ( int j = 0; j < N; j++ )
      {
         std::cout << p[i][j]; 
      }
      std::cout << std::endl;
   }
}

并称为

printPerm( p, M );

对于第二种情况,也有可能通过引用传递数组。函数定义将显示为

const int M = 10;
const int N = 20;

void printPerm( const int ( &p )[M][N] )
{
   for ( int i = 0; i < M; i++ )
   {
      for ( int j = 0; j < N; j++ )
      {
         std::cout << p[i][j]; 
      }
      std::cout << std::endl;
   }
}

可以称为

int p[M][N];
printPerm( p );
编辑:我更新了一些拼写错误。