前言
数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。
程序源码
/*经典面试题*/
#if 1
#include <stdio.h>
int main()
{
//一维数组
int a[]={1,2,3,4};
printf("%d\n",sizeof(a)); //4*4 = 16
printf("%d\n",sizeof(a+0));//4/8,a在这里是首元素地址,a+0还是首元素地址
printf("%d\n",sizeof(*a)); //4,a[0]
printf("%d\n",sizeof(a+1)); //4/8,&a[1]
printf("%d\n",sizeof(a[1])); //4
printf("%d\n",sizeof(&a)); //4/8,&a取出的是数组的地址,数组的地址也是地址
printf("%d\n",sizeof(*&a)); //16,sizeof(a);
printf("%d\n",sizeof(&a+1));//4/8,&a是数组的地址,&a+1虽然跳过整个数组,但是地址
printf("%d\n",sizeof(&a[0]));//4/8第一个元素的地址
printf("%d\n",sizeof(&a[0]+1));//4/8第二个元素的地址
return 0;
}
#endif
#if 0
#include <stdio.h>
int main()
{
//字符数组
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr)); //6
printf("%d\n",sizeof(arr+0)); //8/4,arr+0是首元素地址
printf("%d\n",sizeof(*arr)); //1,a[0]
printf("%d\n",sizeof(arr[1])); //1
printf("%d\n",sizeof(&arr)); //8/4,数组的地址
printf("%d\n",sizeof(&arr+1)); //8/4,&arr+1跳过整个数组后的地址
printf("%d\n",sizeof(&arr[0]+1));//8/4,&arr[1]->地址
return 0;
}
#endif
#if 0
#include <stdio.h>
#include <string.h>
int main()
{
//字符数组
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",strlen(arr)); //随机值6,无法确定'\0'在哪
printf("%d\n",strlen(arr+0)); //随机值
// printf("%d\n",strlen(*arr)); //err,访问地址97
// printf("%d\n",strlen(arr[1])); //errr,'b'
printf("%d\n",strlen(&arr)); //随机值
printf("%d\n",strlen(&arr +1));//随机值-6
printf("%d\n",strlen(&arr[0]+1));//随机值-1
return 0;
}
#endif
#if 0
#include <stdio.h>
#include <string.h>
int main()
{
char arr[]="abcdef";
printf("%d\n",sizeof(arr)); //7
printf("%d\n",sizeof(arr+0)); //8/4
printf("%d\n",sizeof(*arr)); //1
printf("%d\n",sizeof(arr[1])); //1
printf("%d\n",sizeof(&arr)); //8/4
printf("%d\n",sizeof(&arr+1)); //8/4
printf("%d\n",sizeof(&arr[0]+1));//8/4
printf("\n");
printf("%d\n",strlen(arr)); //6
printf("%d\n",strlen(arr+0)); //6,首元素地址
//printf("%d\n",strlen(*arr)); //err,arr[0]不是地址
//printf("%d\n",strlen(arr[1]));//err
printf("%d\n",strlen(&arr)); //6,w类型不匹配
printf("%d\n",strlen(&arr +1));//随机值,w
printf("%d\n",strlen(&arr[0]+1));//5,从&a[1]开始算
return 0;
}
#endif
#if 0
#include <stdio.h>
#include <string.h>
int main()
{
char *p="abcdef"; //p存放的是a的地址
printf("%lu\n",sizeof(p)); //8/4,计算指针变量的大小
printf("%lu\n",sizeof(p+1)); //8/4,'b'的地址
printf("%lu\n",sizeof(*p)); //1,'a'的大小
printf("%lu\n",sizeof(p[0]));//1,'a'的大小
printf("%lu\n",sizeof(&p)); //4/8,指针变量的地址的大小
printf("%lu\n",sizeof(&p+1));//4/8,
printf("%lu\n",sizeof(&p[0]+1));//4/8
printf("*********************************\n");
printf("%u\n",strlen(p)); //6
printf("%u\n",strlen(p+1)); //5
// printf("%u\n",strlen(*p)); //err
// printf("%u\n",strlen(p[0]));//err
printf("%u\n",strlen(&p)); //随机值
printf("%u\n",strlen(&p+1)); //随机值
printf("%u\n",strlen(&p[0]+1));//5,&p[1]为起点
return 0;
}
#endif
#if 0
#include <stdio.h>
int main()
{
//二维数组
//48 4 16 8 4 8 16 8 16 16 16
int a[3][4]={0};
printf("&a[0][0]=%p\n",&a[0][0]);
printf("a[0]+1=%p\n",a[0]+1);
printf("%lu\n",sizeof(a));//4*3*4=48,这个数组的大小
printf("%lu\n",sizeof(a[0][0]));//4,第一个元素的大小
printf("%lu\n",sizeof(a[0]));//4*4=16,a[0]=*a,a[0]表示第一行的首地址,可以看成一个维数组,数组名为a[0],第一行的大小
printf("%lu\n",sizeof(a[0]+1));//8/4,a[0]是第一行的数组名,此时的数组名是首元素的地址,a[0]+1是第一行第二个元素的地址
printf("%lu\n",sizeof(*(a[0]+1)));//4,第一行第2个元素的大小
printf("%lu\n",sizeof(a+1));//8/4,a是二维数组的数组名,a+1是第二行的首地址,
printf("%lu\n",sizeof(*(a+1)));//4*4=16,sizeof(a[1])计算第二行的大小
printf("%lu\n",sizeof(&a[0]+1));//8/4,第二行的地址,
printf("%lu\n",sizeof(*(&a[0]+1)));//4*4=16
printf("%lu\n",sizeof(*a));//4*4=16,第一行首元素的地址a[0],即第一行的数组的大小
printf("%lu\n",sizeof(a[3]));//16,第四行的首地址,即第四行的数组的大小
return 0;
}
#endif