一维数组,字符数组,字符串,二维数组在sizeof()和strlen()下的不同输出
(1)一维数组
int main()//sizeof()计算变量所占空间大小
{
int a[] = { 1, 2, 3, 4 };
printf("%d ", sizeof(a));//a单独出现在sizeof内部,表示整个数组,所以结果为16
printf("%d ", sizeof(a+0));//a不单独出现,表数组首元素地址,加0还是首元素地址4
printf("%d ", sizeof(*a));//*a表示首元素4
printf("%d ", sizeof(a+1));//与上面a+0相同,表示第二个元素地址,还是地址,4
printf("%d ", sizeof(a[1]));//第一个元素,4
printf("%d ", sizeof(&a));//&a不是单独出现,而是在sizeof内部,不表示整个数组,降为表示整个数组地址4
printf("%d ", sizeof(&a+1));//&a是整个数组,降为整个数组地址,加1就是跳过整个数组,不过还是地址4
printf("%d ", sizeof(&a[0]));//是地址就是4
printf("%d ", sizeof(&a[0]+1));//地址加1还是地址4
system("pause");
return 0;
}
(2)字符数组
int main()//sizeof()计算变量所占空间大小
{
char arr[] = { "a", "b","c", "d","e","f" };
printf("%d ", sizeof(arr));//arr单独出现在sizeof内部,表示整个数组,所以结果为6个字符
printf("%d ", sizeof(arr + 0));//arr不单独出现,表数组首元素地址,加0还是首元素地址4
printf("%d ", sizeof(*arr));//*arr表示首元素a,一个字节为1
printf("%d ", sizeof(arr[1]));//第2个元素,为1
printf("%d ", sizeof(&arr));//&arr不是单独出现,而是在sizeof内部,不表示整个数组,降为表示整个数组地址4
printf("%d ", sizeof(&arr + 1));//&arr是整个数组,降为整个数组地址,加1就是跳过整个数组,不过还是地址4
printf("%d ", sizeof(&arr[0] + 1));//地址加1还是地址4
system("pause");
return 0;
}
---------------------------------------------------------
int main()//sizeof()计算变量所占空间大小
{
char arr[] = {"abcdef" };
printf("%d ", sizeof(arr));//arr单独出现在sizeof内部,表示整个数组,所以结果为7,因为还有个
printf("%d ", sizeof(arr + 0));//arr不单独出现,表数组首元素地址,加0还是首元素地址4
printf("%d ", sizeof(*arr));//*arr表示首元素a,为1
printf("%d ", sizeof(arr[1]));//第2个元素,为1
printf("%d ", sizeof(&arr));//&arr不是单独出现,而是在sizeof内部,不表示整个数组,降为表示整个数组地址4
printf("%d ", sizeof(&arr + 1));//&arr是整个数组,降为整个数组地址,加1就是跳过整个数组,不过还是地址4
printf("%d ", sizeof(&arr[0] + 1));//地址加1还是地址4
system("pause");
return 0;
}
---------------------------------------------------------
int main()//sizeof()计算变量所占空间大小
{
char *p = "abcdef" ;
printf("%d ", sizeof(p));//p为指针变量,指a的地址,4
printf("%d ", sizeof(p + 1));//b的地址,4
printf("%d ", sizeof(*p));//1个字符,1
printf("%d ", sizeof(p[1]));//1个字符,1
printf("%d ", sizeof(&p));//2级指针,4
printf("%d ", sizeof(&p + 1));//跳到f之后,是个地址,4
printf("%d ", sizeof(&p[0] + 1));//b的地址,4
system("pause");
return 0;
}
int main()//strlen(地址)从此地址开始向后,遇到 停止;strlen(元素)就是error
{
char *p = "abcdef" ;
printf("%d ", strlen(p));//p为指针变量,指a的地址,从a开始向后数,遇到 停止,6
printf("%d ", strlen(p + 1));//b的地址,从b开始向后数,5
//printf("%d ", strlen(*p));//指元素,error
//printf("%d ", strlen(p[0]));//同上,error
printf("%d ", strlen(&p));//随机值
printf("%d ", strlen(&p + 1));//随机值
printf("%d ", strlen(&p[0] + 1));//从b开始数,5
system("pause");
return 0;
}
(3)二维数组
int main()//strlen(地址)从此地址开始向后,遇到 停止;strlen(元素)就是error
{
int a[3][4] = { 0 };
printf("%d ", sizeof(a));//整个数组,3×4×4=48
printf("%d ", sizeof(a[0][0]));//首元素,4
printf("%d ", sizeof(a[0]));//首行,16
printf("%d ", sizeof(a[0]+1));//第一行第2个元素,a[0]没单独放在sizeof中,降为首元素,4
printf("%d ", sizeof(a+1));//4
printf("%d ", sizeof(&a[0] + 1));//&a[0]为第一行地址,加1是第2行地址,4
printf("%d ", sizeof(*a));//首元素地址,是第一行地址,16?
printf("%d ", sizeof(a[3]));//越界,但承接上面行的类型属性,16
system("pause");
return 0;
}