创建一个数组int arr[5] = {1, 2, 3, 4, 5};,我们可以利用arr[0]、arr[1]、arr[2]、arr[3]、arr[4]依次访问各个数组,那为什么可以使用“数组名[数字]”的形式访问数组的元素呢?
具体原理可分为以下三个步骤:
第一:数组在内存中以连续块形式存储
假设数组类型为int,int大小为4个字节,假设起始地址为0x1000。则[0x1000]对应arr[0]、[0x1004]对应arr[1]、[0x1008]对应arr[2]......
第二:数组名即指针
sizeof(数组名)和&数组名,这里的数组名表示整个数组。除此之外,任何地方使用数组名,数组名都作为首元素的指针被使用,表示首元素的地址。
第三:指针+1与解引用操作
指针指向的数据类型是什么,“指针+1”就跳过一个相应类型的数据,让指针指向跳过这个数据后的存储位置。arr[1]的的本质是*(arr + 1),因为arr是指向首元素的指针,地址为0x1000,指向数组的第1个元素;则指针(arr + 1),地址为0x1004,指向数组的第2个元素。
对指针解引用,得到的其实是指针所指向的数据。指针(arr + 1)指向数组的第2个元素,对其解引用*(arr + 1),即得到数组的第2个元素。
综上所述,arr[i]的本质是*(arr + i)。通过计算得到(arr + i)的结果后,再对其解引用*(arr + i),就可以得到arr[i]的值。