以64为平台为例
a为数组, sizeof(a)计算的为整个数组的大小
&a取出的为整个数组的地址
其余情况均为首元素的地址
#include<stdio.h>
int main()
{
int a[]={1,2,3,4};
printf("%d\n",sizeof(a)); 16 整个数组大小,单位是字节
printf("%d\n",sizeof(a+0)); 8 a+0为第一个元素的地址,地址的大小为4/8,32平台为4,64平台为8
printf("%d\n",sizeof(*a)); 4 a为首元素的地址,*a为首元素,大小占4个字节
printf("%d\n",sizeof(a+1)); 8 a+1为第二个元素的地址
printf("%d\n",sizeof(a[1])); 4
printf("%d\n",sizeof(&a)); 8 数组的地址依然为地址,占4/8字节
printf("%d\n",sizeof(*&a)); 16 取出整个数组地址,解引用为整个数组 *和&可以抵消
printf("%d\n",sizeof(&a+1)); 8 是一个地址,指向数组之后的空间
printf("%d\n",sizeof(&a[0])); 8 首元素的地址
printf("%d\n",sizeof(&a[0]+1)); 8 第二个元素的地址
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr)); 6 每个字符占一个字节
printf("%d\n",sizeof(arr+0)); 8 代表首元素的地址
printf("%d\n",sizeof(*arr)); 1
printf("%d\n",sizeof(arr[1])); 1
printf("%d\n",sizeof(&arr)); 8 整个元素的地址
printf("%d\n",sizeof(&arr+1)); 8 地址
printf("%d\n\n",sizeof(&arr[0]+1)); 8 第二个元素的地址
printf("%d\n",strlen(arr)); 随机值,arr数组中没有\0,会一直向后找
printf("%d\n",strlen(arr+0)); 同上
printf("%d\n",strlen(&arr)); 随机值
printf("%d\n",strlen(&arr+1)); 随机值
printf("%d\n",strlen(&arr[0]+1)); 随机值
return 0;
}