• C语言数组和指针笔试题(三)(一定要看)


    感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
    🐒🐒🐒个人主页
    🥸🥸🥸C语言
    🐿️🐿️🐿️C语言例题
    🐣🐓🏀python

    字符数组四

    char arr[] = "abcdef";
    1:printf("%d\n", strlen(arr));
    2:printf("%d\n", strlen(arr+0));
    3:printf("%d\n", strlen(*arr));
    4:printf("%d\n", strlen(arr[1]));
    5:printf("%d\n", strlen(&arr));
    6:printf("%d\n", strlen(&arr+1));
    7:printf("%d\n", strlen(&arr[0]+1));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例题1

    char arr[] = "abcdef";
    printf("%d\n", strlen(arr));
    
    • 1
    • 2

    这里的arr是代表的整个字符串,由于字符串中的字符分别是’a’ ‘b’ ‘c’ ‘d’ ‘e’ ‘f’ ‘\0’,而strlen计算几个是除掉\0,因此结果为6

    例题2

    char arr[] = "abcdef";
    printf("%d\n", strlen(arr+0));
    
    • 1
    • 2

    arr+0=&arr[0],&arr[0]是第一个字符a的地址,因此strlen会从第一个字符a开始寻找\0,所以结果是6,因为数组的储存地址是连续的,所以先取寻找数组中的\0在哪,如果数组中没有\0,就会越界查找,知道找到\0

    例题3

    char arr[] = "abcdef";
    printf("%d\n", strlen(*arr));
    
    • 1
    • 2

    *arr是对arr首元素地址进行解引用是字符a,并没有\0,所以会报错

    例题4

    char arr[] = "abcdef";
    printf("%d\n", strlen(arr[1]));
    
    • 1
    • 2

    这里其实和例题3是一样的,arr[1]是字符b,没有\0,所以会报错

    例题5

    char arr[] = "abcdef";
    printf("%d\n", strlen(&arr));
    
    • 1
    • 2

    &arr是取的整个数组的地址,也就是首元素地址,&arr和&arr[0]的不同在之前有讲过,这里就不说了,因此strlen会从第一个字符a查找,直到找到\0,结果是6

    例题6

    char arr[] = "abcdef";
    printf("%d\n", strlen(&arr+1));
    
    • 1
    • 2

    &arr+1虽然是跳过了整个数组,但其实质仍然是一个数组地址,不知道\0在哪所以是一个随机值

    例题7

    char arr[] = "abcdef";
    printf("%d\n", strlen(&arr[0]+1));
    
    • 1
    • 2

    &arr[0]+1=&arr[1],是从第二个字符’b’的地址开始向后找,因此结果就应该比从整个元素的地址开始向后找少一(因为b是在a之后),所以结果是5

    结果

    因为例题3和例题4无法打印,所以就打印的其他例题
    在这里插入图片描述

    字符数组五

    char *p = "abcdef";
    1:printf("%d\n", sizeof(p));
    2:printf("%d\n", sizeof(p+1));
    3:printf("%d\n", sizeof(*p));
    4:printf("%d\n", sizeof(p[0]));
    5:printf("%d\n", sizeof(&p));
    6:printf("%d\n", sizeof(&p+1));
    7:printf("%d\n", sizeof(&p[0]+1));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例题1

    char *p = "abcdef";
    printf("%d\n", sizeof(p));
    
    • 1
    • 2

    p是一个指针变量储存的是字符串的地址,所以sizeof§是求一个地址的大小,结果是4或者8

    例题2

    char *p = "abcdef";
    printf("%d\n", sizeof(p+1));
    
    • 1
    • 2

    p+1是跳过整个字符串的地址,但还是地址,所以结果仍然是4或者8

    例题3

    char *p = "abcdef";
    printf("%d\n", sizeof(*p));
    
    • 1
    • 2

    这里的 * p是对字符串中的字符’a’地址解引用,所以 *p=‘a’,由于字符是char类型,所以sizeof(*p)结果是1
    调试结果如下
    在这里插入图片描述

    例题4

    char *p = "abcdef";
    printf("%d\n", sizeof(p[0]));
    
    • 1
    • 2

    p[0]是字符串中的第一个字符a,因为是char类型,所以结果是1

    例题5

    char *p = "abcdef";
    printf("%d\n", sizeof(&p));
    
    • 1
    • 2

    &p是取出指针变量p的地址,因为是一个地址所以结果是4或者8

    例题6

    char *p = "abcdef";
    printf("%d\n", sizeof(&p+1));
    
    • 1
    • 2

    &p+1仍然是一个地址,所以结果还是4或者8

    例题7

    char *p = "abcdef";
    printf("%d\n", sizeof(&p[0]+1));
    
    • 1
    • 2

    &p[0]+1是取字符串第二个字符b的地址,所以结果为4或者8

    结果

    在这里插入图片描述

    字符数组六

    char *p = "abcdef";
    1:printf("%d\n", strlen(p));
    2:printf("%d\n", strlen(p+1));
    3:printf("%d\n", strlen(*p));
    4:printf("%d\n", strlen(p[0]));
    5:printf("%d\n", strlen(&p));
    6:printf("%d\n", strlen(&p+1));
    7:printf("%d\n", strlen(&p[0]+1));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例题1

    char *p = "abcdef";
    printf("%d\n", strlen(p));
    
    • 1
    • 2

    p是指针变量取的是字符串的地址,等于字符a的地址,strlen§就是从字符a开始寻找\0,所以结果为6

    例题2

    char *p = "abcdef";
    printf("%d\n", strlen(p+1));
    
    • 1
    • 2

    这里的p是数组首元素地址,p+1是跳过数组的一个元素所以p+1=&p[1],因此strlen是从字符’b’的地址开始寻找\0,所以结果是5

    例题3

    char *p = "abcdef";
    printf("%d\n", strlen(*p));
    
    • 1
    • 2

    *p是对字符’a’地址解引用,就是字符a,没有\0所以会报错

    例题4

    char *p = "abcdef";
    printf("%d\n", strlen(p[0]));
    
    • 1
    • 2

    p[0]是字符串中的第一个元素a,没有\0,所以会报错

    例题5

    char *p = "abcdef";
    printf("%d\n", strlen(&p));
    
    • 1
    • 2

    &p是取指针变量的地址,注意p是字符串的地址,但是&p就不是字符串的地址,所以&p中我们不知道他的地址是什么样的,结果是一个随机值
    在这里插入图片描述

    例题6

    char *p = "abcdef";
    printf("%d\n", strlen(&p+1));
    
    • 1
    • 2

    &p+1是跳过p的地址,因为地址中不知道\0在哪,所以是一个随机值

    例题7

    char *p = "abcdef";
    printf("%d\n", strlen(&p[0]+1));
    
    • 1
    • 2

    &p[0]+1=&p[1],是第二这个字符’b’的地址,因此strlen是从b开始寻找\0,所以结果是5

    结果

    在这里插入图片描述

  • 相关阅读:
    设计数据库
    机器学习预备03
    题解 P8757 [蓝桥杯 2021 省 A2] 完美序列
    S7-200SMART案例分析——运动控制编程三轴控制(二)
    初识Java 13-2 异常
    微信小程序源码获取(附工具的下载)
    5G移动性增强关键技术及应用分析
    Apache Tomcat
    Spring Data JPA @Query注解
    《排错》Python重新安装后,执行yum命令报错
  • 原文地址:https://blog.csdn.net/2301_79178723/article/details/132913443