【进阶C语言】指针和数组的巩固练习(sizeof)和(strlen)

1、一维数组(sizeof)

 int a[] = { 1,2,3,4 };    求下列问题的答案:

printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));

    printf("%d\n", sizeof(a));  
    //解析:int类型元素大小是4,
    //因为组数名a单独sizeof里面,所以这里表示整个数组的大小,
    //所以大小是16;

    printf("%d\n", sizeof(a + 0));
    //解析:a并没有单独放在sizeof中,也没有&a,
    //所以(a+0)代表首元素的地址,
    //大小是4\8;
    printf("%d\n", sizeof(*a));
    //解析:因为*解引用a,a代表首元素地址,也就是1,
    //大小是4;
    printf("%d\n", sizeof(a + 1));
    //解析:与(a+0)一样,代表着第二个字符地址,
    //大小是4\8;
    printf("%d\n", sizeof(a[1]));
    //解析:一维数组的数组名[下标]代表第几个元素,
    //a[1]代表了第二个元素,
    //大小是4;
    printf("%d\n", sizeof(&a));
    //解析:&a表示取出整个数组的地址,
    // 数组地址也是地址,不会*元素个数,
    //大小是4\8
    printf("%d\n", sizeof(*&a));
    //解析:取数组地址后解引用,解的是整个数组,
    //大小是16;

    printf("%d\n", sizeof(&a + 1));
    //解析:取数组地址后+1,就是加上一个数组大小的地址,
    //大小是4\8;
    printf("%d\n", sizeof(&a[0]));
    //解析:取出,也就是首元素地址,也是地址,
    //大小是4\8
    printf("%d\n", sizeof(&a[0] + 1));
    //解析:取出a[0]+1的地址,就是首元素后面的地址,第二个元素地址,
    //大小是4\8

 2、字符串数组(sizeof)

 char arr[] = { 'a','b','c','d','e','f' };;    求下列问题的答案:

	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));
    printf("%d\n", sizeof(arr));
    //解析:arr单独放在sizeof中,表示整个数组的大小,
    //char类型一个元素大小是1,
    //大小是6;
    printf("%d\n", sizeof(arr + 0));
    //解析:arr没有单独存放,arr+0表示a的地址,
    //大小是4\8;
    printf("%d\n", sizeof(*arr));
    //解析:arr没有单独存放,表示解引用首元素大小,
    // 大小是1;
    printf("%d\n", sizeof(arr[1]));
    //解析:表示一维数组中下标为1的元素,也就是'b',
    //大小是1;
    printf("%d\n", sizeof(&arr));
    //解析:取出整个arr数组的地址,
    //大小是4\8;
     printf("%d\n", sizeof(&arr + 1));
    //解析:指向arr的地址的指针,向后移动一个数组大小,
    //仍是指针,
    //大小是4\8;

    printf("%d\n", sizeof(&arr[0] + 1));
    //解析:取出arr数组下标为[0]的元素地址,向后一个单位,仍是指针,
    //大小是4\8;

 3、字符串数组(strlen)

  char arr[] = { 'a','b','c','d','e','f' };;    求下列问题的答案:

	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
    printf("%d\n", strlen(arr));
    //解析:因为此arr数组内没有标明'\0',所以一直执行到'\0'结束,
    //大小是随机值;
    printf("%d\n", strlen(arr + 0));
    //解析:由于arr不是单独在内,所以arr+0是首元素地址,
    //也就是从首元素开始执行,
    //大小是随机值;
    printf("%d\n", strlen(*arr));
    //解析:由于arr不是单独在内,所以arr是首元素地址,
    //解引用首元素地址,找到'a',
    //由于比较的是ASCLL值,所以无法比较,
    //大小是 报错;
    printf("%d\n", strlen(arr[1]));
    //解析:找到下标为[1]的元素,是'b',
    //ASCLL值无法比较,
    //大小是 报错;
    printf("%d\n", strlen(&arr));
    //解析:取地址arr整个数组,
    //大小是随机值;
    printf("%d\n", strlen(&arr + 1));
    //解析:取出整个数组的地址,往后加上一个数组指针大小,
    //也就是指针到'f'的后面,比&arr更快找到'\0',
    //大小是随机值-6;
    printf("%d\n", strlen(&arr[0] + 1));
    //解析:取出首元素地址,往后一个char类型指针单位,
    //也就是指向'b',
    //大小是随机值-1;
 

 4、字符串数组arr(sizeof)

      char arr[] = "abcdef";    求下列问题的答案: 

printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

    printf("%d\n", sizeof(arr));
    //解析:在sizeof中单独存放,表示整个数组,
    //由于"abcdef"中包含了'\0',
    //所以有7个元素,
    //大小是7;

    printf("%d\n", sizeof(arr + 0));
    //解析,无单独存放,表示首元素地址,
    //大小是4\8;

    printf("%d\n", sizeof(*arr));
    //解析:无单独存放,表示首元素地址,解引用找到'a',
    //大小是1;

    printf("%d\n", sizeof(arr[1]));
    //解析:找到下标为[1]的元素,是'a',
    //大小是1;

    printf("%d\n", sizeof(&arr));
    //解析:取出整个数组的地址,仍是地址,
    //大小是4\8;

    printf("%d\n", sizeof(&arr + 1));
    //解析:取出整个数组地址,
    //加上一个指针类型是char(*)[]类型的指针,指向arr[7],
    //大小是4\8;

    printf("%d\n", sizeof(&arr[0] + 1));
    //解析:找到首元素地址,加上一个指针类型是char*的指针,指向arr[1],
    //大小是4\8;

 5、字符串数组arr(strlen)

     char arr[] = "abcdef";    求下列问题的答案: 

    printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));

    printf("%d\n", strlen(arr));
    //解析:"abcdef"中包含了'\0',
    //大小为6;

    printf("%d\n", strlen(arr + 0));
    //解析:由于没有单独存放,arr表示首元素地址,
    //从首元素开始执行,
    //大小为6;

    printf("%d\n", strlen(*arr));
    //解析:没有单独存放,解引用首元素地址,
    //ASCLL值无法比较,
    //大小为 报错;

    printf("%d\n", strlen(arr[1]));
    //解析:找到下标为[1]的元素,
    //ASCLL值无法比较,
    //大小为报错;

    printf("%d\n", strlen(&arr));
    //解析:取出整个数组的地址,
    //大小为6;

    printf("%d\n", strlen(&arr + 1));
    //解析:加一个指针类型为数组指针的指针大小,指向arr[7],
    //大小为随机值;

    printf("%d\n", strlen(&arr[0] + 1));
    //解析:加上一个指针类型为char*类型的指针大小,指向arr[1],
    //大小为5;

  6、字符串指针数组arr(sizeof)

     char* p = "abcdef";    求下列问题的答案: 

printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
    printf("%d\n", sizeof(p));
    //解析:p是字符串首元素的地址,
    //大小为4\8;
    printf("%d\n", sizeof(p + 1));
    //解析:p+1是首元素+1,就是'b'的地址,
    //大小为4\8;
    printf("%d\n", sizeof(*p));
    //解析:解引用地址p,得到数组首字母,
    //大小为1;
    printf("%d\n", sizeof(p[0]));
    //解析:字符串地址首元素,p[0]==*(p+0),
    //大小为1;
    printf("%d\n", sizeof(&p));
    //解析:取出存放指针p的地址,也是地址,
    //大小为4\8;
    printf("%d\n", sizeof(&p + 1));
    //解析:取出存放指针p的地址,加上一个&p大小的指针,也是地址,
    //大小为4\8;
    printf("%d\n", sizeof(&p[0] + 1));
    //解析:&p[0]就是第一个元素取地址,加一就第二个元素,也是地址,
    //大小为4\8;

7、字符串指针p(strlen)

      char* p = "abcdef";    求下列问题的答案: 

	printf("%d\n", strlen(p));
	printf("%d\n", strlen(p + 1));
	printf("%d\n", strlen(*p));
	printf("%d\n", strlen(p[0]));
	printf("%d\n", strlen(&p));
	printf("%d\n", strlen(&p + 1));
	printf("%d\n", strlen(&p[0] + 1));
    printf("%d\n", strlen(p));
    //解析:字符串包含'\0',
    //大小为6;
    printf("%d\n", strlen(p + 1));
    //解析:p为首元素地址,p+1就是第二个元素,
    //大小为5;
    printf("%d\n", strlen(*p));
    //解析:解引用首元素地址,就是'a',
    //ASCLL值无法比较,
    //大小是 报错;
    printf("%d\n", strlen(p[0]));
    //解析:p[0]就是首元素,就是'a',
    //ASCLL值,
    //大小是 报错;
    printf("%d\n", strlen(&p));
    //解析:取出p的地址,p的后面是未知数,
    //大小是随机值;
    printf("%d\n", strlen(&p + 1));
    //解析:&p+1就是加上一个p大小的指针,指向&p后面未知数,
    //大小是随机值;
    printf("%d\n", strlen(&p[0] + 1));
    //解析:p先和[]反应,&p[0]就是取出首元素地址,
    //加一就是第二个元素地址,
    //大小是5;

8、二维数组(sizeof)

    int a[3][4] = { 0 };    求下列问题的答案: 

	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a[0][0]));
	printf("%d\n", sizeof(a[0]));
	printf("%d\n", sizeof(a[0] + 1));
	printf("%d\n", sizeof(*(a[0] + 1)));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(*(a + 1)));
	printf("%d\n", sizeof(&a[0] + 1));
	printf("%d\n", sizeof(*(&a[0] + 1)));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a[3]));
    int a[3][4] = { 0 };
    printf("%d\n", sizeof(a));
    //解析:由于a单独存放在sizeof()中,所以表示整个二维数组大小,
    //一个int类型大小是4,有3行4元素,3*4*4
    //大小是48;
    printf("%d\n", sizeof(a[0][0]));
    //解析:a[0][0]表示首行首元素,就是0,
    //大小为4;
    printf("%d\n", sizeof(a[0]));
    //解析:a是二位数组,可以把a看作有3个一维数组,
    //a[0]可以理解为a第一个一维数组的数组名,访问里面0-3的元素,
    //大小为16;
    printf("%d\n", sizeof(a[0] + 1));
    //解析:a[0]没有单独放在sizeof中,也没有&,
    //所以a[0]表示首元素地址,a[0]+1就是首行第二个元素地址
    //大小为4\8;
    printf("%d\n", sizeof(*(a[0] + 1)));
    //解析:首行第二个元素解引用,
    //大小为4;
    printf("%d\n", sizeof(a + 1));
    //解析:a没有单独放在sizeof中,所以代表首元素地址,
    //也就是第一行的地址,a+1表示第二行地址;
    //大小为4\8;
    printf("%d\n", sizeof(*(a + 1)));
    //解析:解引用a[1];
    //大小为16;
    printf("%d\n", sizeof(&a[0] + 1));
    //解析:由于&a[0]取出a首行元素地址,&a[0]+1表示下一行的地址,
    //大小为4\8;
    printf("%d\n", sizeof(*(&a[0] + 1)));
    //解析:解引用第二行地址,访问4个元素,
    //大小为16;
    printf("%d\n", sizeof(*a));
    //解析:a没有单独存放,也没有&,所以表示首元素地址,也就是a[0]的地址,
    //解引用a[0],访问4个元素,
    //大小为16;
    printf("%d\n", sizeof(a[3]));
    //解析:由于sizeof函数是不会计算的,打个比方:如果知道返回的数值是int类型,
    //那就会直接返回sizeof(int),不会计算其中的内容,
    //所以就算是不存在也依旧是根据类型判断,当它是a[3][4],a[-1]也是如此。
    //大小为16;

 根据以上题目,加强巩固指针知识。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值