• 指针和字符数组笔试题及其解析(第一组)


    个人主页Lei宝啊

    愿所有美好如期而遇


    前言:

    数组名在寻常情况下表示首元素地址,但有两种情况例外:

    1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小

    2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 

    3.sizeof是操作符,不是函数,并且sizeof不计算括号里的表达式,他会在编译阶段检查括号里的表达式的类型属性,计算出大小。(任何表达式都有两种属性,值属性和类型属性,

    int a = 3; short b = 2; b = a + b;这个表达式的值属性就是5,类型属性就是short)

    前言很重要,记住哦~  

    第一组笔试题

    1. int main()
    2. {
    3. char arr[] = { 'a','b','c','d','e','f' };
    4. printf("%d\n", sizeof(arr));
    5. printf("%d\n", sizeof(arr + 0));
    6. printf("%d\n", sizeof(*arr));
    7. printf("%d\n", sizeof(arr[1]));
    8. printf("%d\n", sizeof(&arr));
    9. printf("%d\n", sizeof(&arr + 1));
    10. printf("%d\n", sizeof(&arr[0] + 1));
    11. printf("%d\n", strlen(arr));
    12. printf("%d\n", strlen(arr + 0));
    13. printf("%d\n", strlen(*arr));
    14. printf("%d\n", strlen(arr[1]));
    15. printf("%d\n", strlen(&arr));
    16. printf("%d\n", strlen(&arr + 1));
    17. printf("%d\n", strlen(&arr[0] + 1));
    18. return 0;
    19. }

    先自己做再看答案和解析哦~  

    答案

    6           随机值
    8           随机值
    1           error
    1           error
    8           随机值
    8           随机值
    8           随机值

    (博主用的是64位机器,所以地址占的空间大小为8字节)  

    解析

    1. int main()
    2. {
    3. char arr[] = { 'a','b','c','d','e','f' };
    4. printf("%d\n", sizeof(arr));
    5. //sizeof里只有数组名,所以计算的是整个数组的大小
    6. printf("%d\n", sizeof(arr + 0));
    7. //此时数组名的意义是首元素的地址,类比arr+1,所以大小为4/8
    8. printf("%d\n", sizeof(*arr));
    9. //*arr访问的是char类型的数据,大小为1个字节
    10. printf("%d\n", sizeof(arr[1]));
    11. //第一个元素,一个字节
    12. printf("%d\n", sizeof(&arr));
    13. //&arr,指针类型为char (*)[6],数组指针是指针,4/8
    14. printf("%d\n", sizeof(&arr + 1));
    15. //数组指针向后走一个指针的距离,还是指针
    16. //而且sizeof并不做计算,只做类型检查
    17. printf("%d\n", sizeof(&arr[0] + 1));
    18. //第二个元素的地址,4/8
    19. //-------------------------------------------------------------------------------
    20. //-------------------------------------------------------------------------------
    21. printf("%d\n", strlen(arr));
    22. //strlen遇到\0才会停止,而数组末尾没有\0,所以是随机值
    23. //因为我们也不知道什么时候才会碰到\0
    24. printf("%d\n", strlen(arr + 0));
    25. //仍然是随机值
    26. printf("%d\n", strlen(*arr));
    27. //*arr是第一个元素,'a',他的ASCII码值为97,也就是说,
    28. //我们传过去的97将会被当做是地址,但这个地址不是我们的
    29. //是个野指针,所以会导致非法访问,error
    30. printf("%d\n", strlen(arr[1]));
    31. //'a'一个道理,error
    32. printf("%d\n", strlen(&arr));
    33. //&arr,指针类型为数组指针,但是strlen接受的指针类型为
    34. //const char*,我们要传的数组指针将会被转换成const char*类型
    35. //同时,&arr与arr的地址是相同的,尽管他们所代表的意义和类型不同
    36. //所以是随机值
    37. printf("%d\n", strlen(&arr + 1));
    38. //同上,随机值
    39. printf("%d\n", strlen(&arr[0] + 1));
    40. //指向第二个元素,随机值
    41. return 0;
    42. }

     

  • 相关阅读:
    建站选择免费虚拟主机的六大误区
    云服务器ubuntu20.04安装dotnet6环境
    java版 支付宝和微信 h5支付
    nodeJs--各种路径
    vuex里的state,actions,mutations用法与理解
    卷积神经网络的实际应用,卷积神经网络毕业论文
    LeetCode高频题33. 搜索旋转排序数组
    JAVA Calender获取当前日期的前一天
    Onetable:统一的表格式元数据表示
    视频美颜SDK,提升企业视频通话质量与形象
  • 原文地址:https://blog.csdn.net/m0_74824254/article/details/132700893