C语言|关于数组名
前言 【C语言|关于数组名】数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。
/*经典面试题*/#if 1
#include
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
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
#include
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
#include
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/4printf("\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
#include
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/8printf("*********************************\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
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
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 醒不来的梦
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 数组常用方法一
- 关于自我为中心的一点感想