Java和C中数组的区别

Java和C中数组的区别,java,c,arrays,Java,C,Arrays,在我的书中,有一个例子解释了Java和C中数组之间的差异 在Java中,我们可以通过以下方式创建数组: int[] a = new int[5]; 这只是在堆栈上为五个整数分配存储空间,我们可以完全像在Java中那样访问它们 int a[5] = {0}; int i; for (i = 0, i < 5; i++){ printf("%2d: %7d\n", i, a[i]); } 定义常量大小5的优点是什么?使用命名常量通常被认为是良好的做法,因为如果在

在我的书中,有一个例子解释了Java和C中数组之间的差异

在Java中,我们可以通过以下方式创建数组:

int[] a = new int[5];
这只是在堆栈上为五个整数分配存储空间,我们可以完全像在Java中那样访问它们

int a[5] = {0};
int i;
for (i = 0, i < 5; i++){
    printf("%2d: %7d\n", i, a[i]);
}

定义常量大小5的优点是什么?

使用命名常量通常被认为是良好的做法,因为如果在多个位置使用它,您只需更改定义即可更改值,而不必更改每次出现的值,这很容易出错

例如,正如斯塔克在评论中提到的,您可能希望在数组上循环。如果数组的大小由名为
size
的命名常量定义,则可以在循环边界中使用该常量。更改数组的大小只需要更改
size
的定义

还有一个问题是
#define
是否真的是正确的解决方案。 借用Jonathan Leffer的另一条评论:有关命名常量的不同方法的讨论,请参阅。虽然现代C确实允许使用变量作为数组大小说明符,但从技术上讲,这会导致可变长度数组,这可能会产生较小的开销

#define SIZE 5
这看起来像是在恐龙时代流行的一种过时的C代码中声明常量的方式。我想有些喜欢这种风格的人还活着

现在,在C语言中声明常量的首选方法是:

const int kSize = 5;

您应该使用常量,因为在代码中嵌入幻数会使其更难读取和维护。例如,如果您在某些代码中看到
52
,您不知道它是什么。但是,如果您编写
#定义DECKSIZE 52
,那么无论何时看到
DECKSIZE
,您都清楚它的含义。此外,如果您想更改数据组大小,例如durak为36,您可以只更改一行,而不是更改整个代码库中的每个实例

好吧,假设您创建了一个5整数的静态数组,就像您创建的
int my_arr[5],您可以用它编写整个程序,但是。。突然你意识到也许你需要更多的空间。假设您编写了一个6-700行的代码,您必须用您选择的固定数量替换数组中出现的每一行。每个for循环,以及与此数组大小相关的所有内容。您可以使用预处理器命令
#define
来避免所有这些,它将用您想要的内容替换出现的每一个“关键字”,这就像是某个事物的同义词。例如:
#define SIZE 5
将在您的代码中用值5替换出现的每个单词SIZE。

我发现这里的注释非常有用。只要您只使用一次常量(
5
,本例中为),它在哪里并不重要。此外,将其放置到位可以提高可读性。当然,您不需要在多个位置使用常量-毕竟,您应该通过
sizeof
操作符推断数组的大小。
sizeof
方法的好处是它可以与VLAs无缝协作


全局
#define
(或任何其他全局名称)的缺点是它污染了全局名称空间。你应该明白全局名称是一种保守使用的资源。

使用缩进(在“>”之后至少5个空格)来格式化代码(我已经为你这么做了)。我认为它们的意思是“使用命名常量”,即避免使用幻数。买一本新书
new
从堆而不是堆栈创建存储。@stark我想“this”指的是下面的代码段,正如这句话的其余部分所建议的。在某个地方,你将有一个for循环遍历数组,因此你可以使用
SIZE
。是的,我理解这一点。我的错是没有把它打出来。。。从你的回答我猜,没有其他的优势吗?你为什么要用#定义。。。而不仅仅是一个局部变量int size=5;?这是因为您可能想在另一个函数中使用SIZE吗?当然,
SIZE
几乎是对这样一个常量可能使用的最糟糕的名称,因为它完全不告诉您数组的用途,或者为什么它是给定的大小。像 UART1YRXBuffryStime之类的常数是首选。@ OLBA12C++和旧版本的C不允许使用非常量来声明数组大小,因此使用诸如“代码> int大小=5 < /代码>的本地变量可能会给您编译错误。哦,不知道。谢谢你耐心地对待一个新手。:)在C99及更高版本中,可以使用局部变量
int size=5;int a[大小]如果你愿意。然而,它是一个可变长度的VLA数组。使用VLAS可能会有一些开销,但大多数时间都不足以担心。一个很大的优点是,这是C++类型的。在C语言中,它不一定是理想的。例如,在
case kSize:
等上下文中,您不能使用
kSize
,因为它不是一个足够的整数常量,因为它是一个常量整数。这不是真的,它们差别很大。其中一个主要的区别是大小没有一个与之相关的物理地址,因为它不是一个变量。事实上,它们都是做同一件事的方式,但它们在许多方面有所不同。当你有
sizeof()
操作符时,为什么要使用固定大小的代码?@SergeyA这只是检索数组大小的另一种方法,但是当你知道它有固定大小并且确实知道它是5时,为什么要使用sizeof(),或者使用#define SIZE?因为这将适用于可变大小的数组。@SergeyA当然是的,但是,嘿,你什么时候编程你必须知道你想要实现什么,因此,如果你计划使用固定大小的静态数组,你应该使用define,并只使用关键字use来检索大小
const int kSize = 5;