1.一维数组
int main()
{
int a[] = { 1, 2, 3, 4 };
printf("%d\n", sizeof(a)); //16 a在这里是代表整个数组
printf("%d\n", sizeof(a+0)); //4 a在这里代表首元素地址
printf("%d\n", sizeof(*a)); //4 a在这里代表首元素地址,对地址解引用为首元素本身
printf("%d\n", sizeof(a+1)); //4 首元素地址向右移一位
printf("%d\n", sizeof(a[1]));//4 a【1】是第二个元素
printf("%d\n", sizeof(&a)); //4 a代表整个数组
printf("%d\n", sizeof(*&a)); //16 a代表整个数组,对整个数组取地址后解引用,为数组本身
printf("%d\n", sizeof(&a+1));//4 跳过a后产生的地址,地址为四个字节
printf("%d\n", sizeof(&a[0]));//4
printf("%d\n", sizeof(&a[0]+1));//4
system("pause");
return 0;
}
运算结果:
2.字符数组
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr)); //6
printf("%d\n", sizeof(arr+0));//4 arr代表首元素地址,地址为4个字节
printf("%d\n", sizeof(*arr)); //1 arr代表首元素地址,解引用后为首元素本身
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr)); //4
printf("%d\n", sizeof(&arr+1));//4
printf("%d\n", sizeof(&arr[0]+1));//4
printf("%d\n", strlen(arr)); //x 随机值,因为strlen查找到\0结束
printf("%d\n", strlen(arr+0)); //x
printf("%d\n", strlen(*arr)); //error 对arr解引用为arr第一个元素‘a’,产生错误
printf("%d\n", strlen(arr[1]));//error
printf("%d\n", strlen(&arr)); //x
printf("%d\n", strlen(&arr+1));//x
printf("%d\n", strlen(&arr[0]+1));//x
运算结果:
char *p = "abcdef";
printf("%d\n", sizeof(p)); //4 p为指针变量,4个字节
printf("%d\n", sizeof(p+0));//4 p代表首元素地址,地址为4个字节
printf("%d\n", sizeof(*p)); //1 p代表首元素地址,解引用后为首元素本身
printf("%d\n", sizeof(p[1]));//1
printf("%d\n", sizeof(&p)); //4
printf("%d\n", sizeof(&p+1));//4
printf("%d\n", sizeof(&p[0]+1));//4
printf("%d\n", strlen(p)); //6
printf("%d\n", strlen(p+0)); //6 从首元素开始查找
//printf("%d\n", strlen(*p)); //error
//printf("%d\n", strlen(p[1]));//error
printf("%d\n", strlen(&p)); //x
printf("%d\n", strlen(&p+1));//x
printf("%d\n", strlen(&p[0]+1));//5 首元素向右移一个元素,从第二个元素开始查找
运算结果:
int a[3][4] = { 0 };
printf("%d\n", sizeof(a)); //48 整个数组的大小
printf("%d\n", sizeof(a[0][0])); //4 首元素地址
printf("%d\n", sizeof(a[0])); //16 第一行,a[0]表示数组名,a[0]整个数组的大小
printf("%d\n", sizeof(a[0]+1)); //4
printf("%d\n", sizeof(a+1)); //4 地址
printf("%d\n", sizeof(&a+1)); //4 地址
printf("%d\n", sizeof(&a[0]+1)); //4
printf("%d\n", sizeof(*a)); //16 第一行地址解引用
printf("%d\n", sizeof(a[3])); //16 第四行,不参与运算
printf("%d\n", sizeof(*&a)); //48
运算结果:
数组名作为整个数组只有两种情况:1.sizeof(数组名)
2.&数组名