int array[100];
int *array;
我对int array[100]
和int *array
之间的差异感到困惑。
基本上,当我执行int array[100]
(100
只是int
的一个示例]时,我只是在内存中保留了100个整数的空间,但是我可以执行int * array
,但未指定任何类型数组的大小,但是我仍然可以执行array[9999] = 30
,这仍然有意义。
那么这两者之间有什么区别?
指针是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
。
所有这些信息,以及更多信息,都应该放在任何好的书,教程或课程中。
不同之处在于,当您执行int array[100]
时,在[[stack上分配了100 * sizeof(int)
的存储块,但是当您执行int *array
时,您需要动态分配内存(使用malloc
函数用于例如)使用array
变量。动态分配的内存位于heap上,而不是stack。
int array[100]
表示变量array
,该变量将能够容纳100个int值,该内存将从堆栈中分配。变量array
将具有数组的基地址,并且将为其分配内存。但是对于int *array
,由于您将其声明为局部变量,因此指针变量array
将具有垃圾地址。因此,如果您执行array[9999]
,则可能会导致分段冲突,因为您正尝试访问程序外部的垃圾内存位置。
指针的
内容引用一个地址(可能有效或无效)。数组具有地址(该地址必须有效才能使该数组存在)。
您可以认为指针就像信封一样-您可以在其上放置任何想要的地址,但是如果要将其发送到特定的地方,则该地址必须正确。数组就像你的房子-它存在于某处,所以它
具有
一个地址。正确解决的问题会发送到那里。简而言之:指针保持
地址。一个数组有
地址。所以int *array;
创建指针(它可以指向任何地方!)。当你拥有的时候不确定值
array[9999] = 30;
您正在尝试将第9999个int
值从
这是未定义的行为。array
指向的位置设置为30。但是您不知道array
指向的位置,因为您没有给它实际的值。值。
int arr[N]
,您指定类型为int
的N
整数。要获取有关占用多少内存阵列的信息,可以使用sizeof
运算符。只需将数组中的项目数乘以类型的大小即可:N*sizeof(int)
。*arr
与arr[0]
相同,您可能还会想知道为什么a[5] == 5[a]。int arr[] = {1, 2}
,则该大小由编译器计算。int *array
您指定array
的int
除非分配了值,否则默认情况下,指针将指向某个垃圾地址。int * array
中未指定大小,array[9999] = 30
可能会导致分段错误,因为这可能会导致无法访问的内存的访问