"int array[int]"和 "int *array"之间的混淆

标签 c arrays pointers memory-management

int array[100];

int *array;

我对 int array[100] 之间的差异感到困惑和 int *array .

基本上,当我这样做时 int array[100] ( 100 这只是 int 的一个例子),我只是在内存中为 100 个整数保留了空间,但我可以做 int * array我没有为这个数组指定任何类型的大小,但我仍然可以做 array[9999] = 30这仍然有意义。

那么这两者有什么区别呢?

最佳答案

指针是一个指针,它指向其他地方(如数组的第一个元素)。编译器没有关于它可能指向的位置或它可能指向的数据大小的任何信息。

数组是由多个相同类型的连续元素组成的数组。编译器知道它的大小,因为它总是被指定的(尽管有时只是隐式指定了大小)。

数组可以被初始化,但不能被赋值。数组也经常衰减到指向它们的第一个元素的指针。

数组衰减示例:

int array[10];

int *pointer = array;  // Here the symbol array decays to the expression &array[0]

// Now the variable pointer is pointing to the first element of array

数组不能自然地传递给函数。当你声明一个函数参数时,如 int arr[] ,编译器会将其翻译为 int *arr .

所有这些信息以及更多信息都应该出现在任何好书、教程或类(class)中。

关于 "int array[int]"和 "int *array"之间的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54345552/

相关文章:

Java用最大值初始化大数组

javascript - 用对象初始化循环数组

在函数c中更改数组

c - 如何在 C 中包含标题目录

线程并发

c++ - 如何避免在类中显式指定静态数组的大小

C++:指针,找到它的目标地址?

c - 用指针 C 循环

c - 如何使用 c-ldap API 检索整个 LDAP (AD) 目录信息?

c - 在赋值中获取不兼容的类型