指针和数组笔试题 解析,对sizeof()的应用

    总结:如果在sizeof()里面放的只有数组名,那个数组名就代表整个数组
               如果在sizeof()里面放的不只有数组名,还有其他的一些东西,无论什么东西,
               此时,数组名代表的就是首元素地址

                &arr取出的是数组的地址

求该代码的运行结果:(结尾会放上在x86和x64下分别运行的结果)

#include
int main() {
	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));
	
	printf("%d\n", sizeof(a + 0));
	
	printf("%d\n", sizeof(*a));
	
	printf("%d\n", sizeof(a + 1));
	
	printf("%d\n", sizeof(a[1]));
	
	printf("%d\n", sizeof(&a));
	
	printf("%d\n", sizeof(*&a));
	
	printf("%d\n", sizeof(&a + 1));
	
	printf("%d\n", sizeof(&a[0]));
	
	printf("%d\n", sizeof(&a[0] + 1));
	
	return 0;
}

printf("%d\n", sizeof(a));

  sizeof(数组名),该数组名代表的是整个数组,计算的是整个数组的大小,单位是字节 

printf("%d\n", sizeof(a + 0));

   a不是单独放在sizeof内部,也没有取地址,所以a就是首元素地址,a+0还是首元素地址
   既然是地址,那就是4或8个字节,在x86下是4个字节,在x64下是8个字节 

printf("%d\n", sizeof(*a));

    *a中的a代表的是首元素的地址,且*对于a进行解引用的操作,
    所以*a=a[0]=1,sizeof(1)就是4个字节 

printf("%d\n", sizeof(a + 1));

    sizeof()里面也不是单纯的数组名,所以此时a代表首元素地址,
    a+1就是代表第二个元素的地址,
    sizeof(a+1)就是地址的大小
    所有地址的大小就是统一的4或8.
    在x86下是4个字节,在x64下是8个字节

printf("%d\n", sizeof(a[1]));

    计算的是a[1]第二个元素的小 

printf("%d\n", sizeof(&a));

   &a是取的是整个数组的地址,但是所有地址的大小就是4或8个字节 

printf("%d\n", sizeof(*&a));

    该代码下,对a进行取地址和解引用操作,两者相互抵消了,相当于sizrof(a),
    此时sizeof()里面只有数组名a,所以此时a代表的是整个数组
    里面有4个元素,每个元素是4个字节,所以大小是16个字节 

printf("%d\n", sizeof(&a + 1));

    &a取出的是整个数组的地址
    &a+1是从数组a的地址向后跳过了一个(该背景下 4个整型元素的)数组的大小
    但还是一个地址,就是4或8个字节 

printf("%d\n", sizeof(&a[0]));

    &a[0]就是第一个元素的地址
    计算的是第一个元素地址的大小
    地址就是4或8个字节 

printf("%d\n", sizeof(&a[0] + 1));

    &a[0]+1就是第二个元素的地址
    计算的是第二个元素的地址
    地址就是4或8个字节 

在x86下运行结果:

指针和数组笔试题 解析,对sizeof()的应用_第1张图片

在x64下运行结果:

指针和数组笔试题 解析,对sizeof()的应用_第2张图片

你可能感兴趣的:(数据结构,算法,c++,c语言)