【问题标题】:Passing 2D array to a funciton in c & c++将二维数组传递给 C 和 C++ 中的函数
【发布时间】:2020-03-19 06:33:23
【问题描述】:

我为 C 和 C++ 尝试了相同的程序,即将二维数组传递给函数。 以下程序在 C 中运行, 但不能在 C++ 中工作, 请解释为什么会这样?

在 C

#include<stdio.h> 
void pass(int n, int arr[][n])  // or void pass(int n, int (*arr)[n])
{
printf("%d",arr[0][0]);
//.....
}

int main()
{
int n;
scanf("%d",&n);  
int arr[n][n];
arr[0][0]=0;
pass(n,arr);
return 0;
}

在 C++ 中

#include <bits/stdc++.h>
using namespace std;
void pass(int n, int arr[][n])  // or void pass(int n, int (*arr)[n])
{
cout << arr[0][0];
//.....
}

int main()
{
int n; 
   cin >> n;
int arr[n][n];
arr[0][0]=0;
pass(n,arr);
return 0;
}

3:29:error: 在 ']' 标记之前使用函数体外部的参数 void pass(int n, int arr[][n]) // 或者 void pass(int n, int (*arr)[n])

6:9:error: 'arr' 未在此范围内声明 cout

【问题讨论】:

  • 这不应该太令人惊讶,c 和 c++ 是不同的语言。该代码也不会编译为 fortran
  • C++ 不是 C 的超集。C 中有些东西不是有效的 C++(例如问题中的 VLA); C 中有些东西在 C++ 中有不同的含义(例如,sizeof '$' 在 C 中表示 sizeof (int),但在 C++ 中表示 sizeof (char))。

标签: c++ c arrays syntax variable-length-array


【解决方案1】:

这些陈述

int n;
scanf("%d",&n);  
int arr[n][n];

提供一个可变长度数组的声明。可变长度数组是一个数组维度,其大小取决于运行时值。这是编译器可以有条件地支持的 C 的一个特性。

在 C++ 中没有这样的标准特性。因此 C++ 编译器发出错误。在 C++ 中,数组的维度应为编译时常量。虽然一些 C++ 编译器可以拥有自己的 C++ 语言扩展,其中可以包含可变长度数组的特性。

在 C++ 中,使用类模板 std::vector 而不是可变长度数组。

【讨论】:

  • 这个建议很好,但这里似乎问题不在于大多数编译器接受的 VLA 声明本身,而是在 C++ 中你没有简单而干净的方法来将它们作为函数的参数传递。不使用它们的另一个重要理由
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多