“ int array [int]”和“ int * array”之间的混淆

问题描述 投票:3回答:6
int array[100];

int *array;

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

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

那么这两者之间有什么区别?

c arrays pointers memory-management
6个回答
6
投票

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

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

数组可以初始化,但不能分配给它。数组也经常衰减到指向其第一个元素的指针。

数组衰减示例:

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

所有这些信息,以及更多信息,都应该放在任何好的书,教程或课程中。


2
投票

不同之处在于,当您执行int array[100]时,在[[stack上分配了100 * sizeof(int)的存储块,但是当您执行int *array时,您需要动态分配内存(使用malloc函数用于例如)使用array变量。动态分配的内存位于heap上,而不是stack


2
投票
int array[100]表示变量array,该变量将能够容纳100个int值,该内存将从堆栈中分配。变量array将具有数组的基地址,并且将为其分配内存。

但是对于int *array,由于您将其声明为局部变量,因此指针变量array将具有垃圾地址。因此,如果您执行array[9999],则可能会导致分段冲突,因为您正尝试访问程序外部的垃圾内存位置。


2
投票
非技术性解释:

指针的

内容引用一个地址(可能有效或无效)。数组具有地址(该地址必须有效才能使该数组存在)。

您可以认为指针就像信封一样-您可以在其上放置任何想要的地址,但是如果要将其发送到特定的地方,则该地址必须正确。

数组就像你的房子-它存在于某处,所以它

具有

一个地址。正确解决的问题会发送到那里。简而言之:

指针保持

地址。

一个数组

地址。所以

int *array;

创建指针

不确定值

(它可以指向任何地方!)。当你拥有的时候

array[9999] = 30;

您正在尝试将第9999个int

array指向的位置设置为30。但是您不知道array指向的位置,因为您没有给它实际的值。值。

这是未定义的行为。

1
投票
一些您可能会知道有用的要点:

    通过int arr[N],您指定类型为int
  • 数组,它可以存储N整数。要获取有关占用多少内存阵列的信息,可以使用sizeof运算符。只需将数组中的项目数乘以类型的大小即可:N*sizeof(int)
  • 数组名称指向数组中的第一个元素,例如*arrarr[0]相同,您可能还会想知道为什么a[5] == 5[a]
  • 非静态存储持续时间的未初始化数组填充有不确定的值。
  • [数组的大小在运行时可能是已知的,如果您编写int arr[] = {1, 2},则该大小由编译器计算。
  • 访问不存在的元素会导致
  • undefined behaivor
  • ,这意味着可能发生任何事情,并且在大多数情况下,您会获得垃圾值。

    通过int *array您指定
  • 指针
类型为arrayint除非分配了值,否则默认情况下,指针将指向某个垃圾地址。
  • 如果您根本不分配内存,或者不完全分配内存或访问不存在的元素,而是尝试将指针用作数组,则会得到预期的未定义行为。
  • 分配内存后(不再需要指针时),应释放内存。

  • 0
    投票
    int * array中未指定大小,array[9999] = 30可能会导致分段错误,因为这可能会导致无法访问的内存的访问
    © www.soinside.com 2019 - 2024. All rights reserved.