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


    个人主页Lei宝啊

    愿所有美好如期而遇


    前言:

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

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

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

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

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

     

    第二组笔试题 

    1. char arr[] = "abcdef";
    2. printf("%d\n", sizeof(arr));
    3. printf("%d\n", sizeof(arr+0));
    4. printf("%d\n", sizeof(*arr));
    5. printf("%d\n", sizeof(arr[1]));
    6. printf("%d\n", sizeof(&arr));
    7. printf("%d\n", sizeof(&arr+1));
    8. printf("%d\n", sizeof(&arr[0]+1));
    9. printf("%d\n", strlen(arr));
    10. printf("%d\n", strlen(arr+0));
    11. printf("%d\n", strlen(*arr));
    12. printf("%d\n", strlen(arr[1]));
    13. printf("%d\n", strlen(&arr));
    14. printf("%d\n", strlen(&arr+1));
    15. printf("%d\n", strlen(&arr[0]+1));

     答案

    7 8 1 1 8 8 8

    6 6 error error 6 随机值 5

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

    解析

    1. char arr[] = "abcdef";
    2. printf("%d\n", sizeof(arr));
    3. //sizeof(数组名),计算整个数组的大小,
    4. //字符串结尾还有\0占一个字节的空间,共7个字节
    5. printf("%d\n", sizeof(arr + 0));
    6. //类比arr+1,这里的arr代表数组首元素地址,所以4/8
    7. printf("%d\n", sizeof(*arr));
    8. //*arr访问的是char类型的数据,1个字节
    9. printf("%d\n", sizeof(arr[1]));
    10. //第二个元素,数据类型为char,1个字节
    11. printf("%d\n", sizeof(&arr));
    12. //&arr,指针类型为数组指针,此时取出的是整个数组的地址,
    13. //但归根结底还是指针,占4/8个字节
    14. printf("%d\n", sizeof(&arr + 1));
    15. //数组指针向后走一个指针的距离,4/8
    16. printf("%d\n", sizeof(&arr[0] + 1));
    17. //指向第二个元素,4/8
    18. //-------------------------------------------------------------------
    19. //-------------------------------------------------------------------
    20. //strlen是计算字符串长度的哦
    21. printf("%d\n", strlen(arr));
    22. //strlen遇到\0停止,所以得6
    23. printf("%d\n", strlen(arr + 0));
    24. //相同道理,6
    25. printf("%d\n", strlen(*arr));
    26. //error, *arr是'a',ASCII值为97,当做地址传入strlen,
    27. //成为野指针非法访问
    28. printf("%d\n", strlen(arr[1]));
    29. //error, 'b'也同理
    30. printf("%d\n", strlen(&arr));
    31. //&arr与arr地址相同,尽管其意义不同,
    32. //&arr指针类型为数组指针,会被转换成strlen接受的指针类型,
    33. //所以我们最终得到的还是6
    34. printf("%d\n", strlen(&arr + 1));
    35. //随机值,&arr+1跳过的是整个数组,所以我们无法判断何时会
    36. //再遇见\0,。
    37. printf("%d\n", strlen(&arr[0] + 1));
    38. //指向第二个元素,所以得到5

  • 相关阅读:
    八、性能测试之磁盘分析
    【淘宝开店】新手入门开网店教程
    【CAPL】XMLTestModule XML文件模板
    财经资讯网站--某联社参数破解
    Linux 安装Mysql 详细教程
    知识图谱(6)基于KG构建问答系统
    Apifox:详细使用教程,带你轻松拿捏
    centos7安装mysql8.x的注意事项,与5.x版本有许多不同
    JupyterServer配置
    MapReduce Partition 分区
  • 原文地址:https://blog.csdn.net/m0_74824254/article/details/132710035