对数组与地址概念的明确
#includ<stdio.h>
int main()
{
int arr[5] = {1,2,3,4,5}
return 0;
}
如上创建了一个简单的整型数组a,对于这行代码我们需要明确以下两个点:
· arr - 数组名 - 也是数组首元素的地址
· arr因为是首元素的地址,是一个常量,所以不可以赋值或者自增自减(error:arr+=1)
地址的大小:我们知道计算机的存储是用二级制序列的,一个地址唯一标识一块内存空间,地址本身也是一种内容,也会被存储在内存中,如果在x32的机器上,那么就有32bit用来存储一个内容,而8bit为1字节,所以地址的大小为4个字节,x64位机器上同理为8个字节。
实例讲解:
printf("%d",sizeof(arr));
解析:
首先我们需要明晰关键字 sizeof() 的作用:
sizeof() 是一个C中的关键字,用于计算所传入内容的大小,单位字节。
但是有一种情况例外:
sizeof(数组名),此时sizeof计算的是整个数组的大小
那么上边的结果就很容易得到了:arr是一个整型数组,这里计算的是整个数组的大小,一个整形的大小为4个字节,整个数组的大小则为4*5=20
答案:20
printf("%d",sizeof(arr+0));
解析:
arr是数组的首元素地址,arr+0就是将该地址向后移动0个 int* 指针单位,也就是还是首元素地址,到那时不同的是,这里的内容不再是数组名了而是一个单纯的地址,地址的大小为4(x32)或8(x64)。
答案:4或8
printf("%d",sizeof(&arr));
解析:
小补充:arr虽然是首元素地址,但是&arr就不再是取出首元素的地址了,而是取出整个数组的地址,即:&数组名 - 取出的是整个数组的地址,在值上与首元素地址相同,但是当进行加减运算时,其变化的长度是不同的,arr+1是首元素地址+1,指向第二个元素,但是&arr+1则是跳过整个数组,增加一个数组大小的长度,直接指向了数组最后一个元素后的位置。
但是 sizeof() 只会计算传入数据的大小,也就是说,即使是整个数组的地址,它还是一个地址,地址是不分高低贵贱的,只要是地址,其大小都是4或8。
答案:4或8
printf("%d",sizeof(*arr));
解析:
arr是首元素地址,首元素地址解引用拿到首元素,因为是整形数组,所以每个元素都是整形,整形的大小为4个字节
答案:4
printf("%d",sizeof(arr+1));
解析:
arr是首元素地址,首元素地址加一为第二个元素的地址,其依旧为地址,所以大小为4或8个字节
答案:4或8
printf("%d",sizeof(arr[1]));
解析:
首先明确arr[1]的含义:以arr为起始地址向后移动1个单位(4个字节,因为是int数组),然后将它的内容拿出来,(这里可以把 [] 理解为一次解引用,在后边分析二维数组的时候会容易很多),所以起始就是计算数组中下标为1的元素的大小,因为是整形数组,所以大小为4
答案:4