关于数组名

前言

数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。

程序源码

/*经典面试题*/

#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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

⁽⁽ଘ晴空万里ଓ⁾⁾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值