服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言sizeof和strlen的指针和数组面试题详解

C语言sizeof和strlen的指针和数组面试题详解

2022-11-07 13:48scut-ALong C/C++

strlen是函数,字符串长度,不包括停止符。而sizeof则是内存块的大小,包括停止符。数组是一种数据类型,数据类型的本质就是固定大小,内存块的别名。可以用sizeof()一般都是数据类型

一、概念         

sizeof:

sizeof操作符的结果类型为size_t,(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。sizeof是运算符,可以以类型、函数、做参数 。

strlen:

strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’(通过strlen的实现得知)。

二、例题及解析

首先我们需要知道数组名的意义:

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

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

3.除此之外所有的数组名都表示首元素的地址。

2.1 一维数组

?
1
2
3
4
5
6
7
8
9
10
11
12
int a[] = { 1,2,3,4 };
    printf("%d\n", sizeof(a));         //16  a是整个数组的大小,sizeof计算出结果为16字节
    printf("%d\n", sizeof(a+0));       //4   a是首元素的地址
    printf("%d\n", sizeof(*a));        //4    首元素地址的解引用
    printf("%d\n", sizeof(a+1));       //4   2的地址
    printf("%d\n", sizeof(a[1]));      //4
    printf("%d\n", sizeof(&a));        //4   &a数组的地址,4个字节
    printf("%d\n", sizeof(*&a));       //16  *和&抵消
    printf("%d\n", sizeof(&a+1));      //4   4个字节的地址,跳过了4
    printf("%d\n", sizeof(&a[0]));     //4
    printf("%d\n", sizeof(&a[0]+1));   //4
    //总结: 只要是地址,不论什么类型,大小都为4个字节

2.2 字符数组

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char arr[] = { 'a','b','c','d','e','f' };
    printf("%d\n", sizeof(arr));        //6
    printf("%d\n", sizeof(arr+0));      //4  首元素地址为4个字节
    printf("%d\n", sizeof(*arr));       //1
    printf("%d\n", sizeof(arr[1]));     //1
    printf("%d\n", sizeof(&arr));       //4
    printf("%d\n", sizeof(&arr+1));     //4
    printf("%d\n", sizeof(&arr[0]+1));  //4
 
    printf("%d\n", strlen(arr));        //随机值 strlen要找到\0才能返回数据的长度
    printf("%d\n", strlen(arr+0));      //随机值
    printf("%d\n", strlen(*arr));       //err strlen(a)会把a的ASCII码值97当作地址往后找
    printf("%d\n", strlen(arr[1]));     //err
    printf("%d\n", strlen(&arr));       //随机值
    printf("%d\n", strlen(&arr+1));     //随机值
    printf("%d\n", strlen(&arr[0]+1));  //随机值
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char arr[] = "abcdef";
    printf("%d\n", sizeof(arr));            //7  arr是数组的地址
    printf("%d\n", sizeof(arr + 0));        //4  arr是首元素的地址
    printf("%d\n", sizeof(*arr));           //1
    printf("%d\n", sizeof(arr[1]));         //1
    printf("%d\n", sizeof(&arr));           //4  数组的地址 4个字节
    printf("%d\n", sizeof(&arr + 1));       //4
    printf("%d\n", sizeof(&arr[0] + 1));    //4
 
    printf("%d\n", strlen(arr));            //6
    printf("%d\n", strlen(arr + 0));        //6
    printf("%d\n", strlen(*arr));           //err
    printf("%d\n", strlen(arr[1]));         //err
    printf("%d\n", strlen(&arr));           //6
    printf("%d\n", strlen(&arr + 1));       //随机值
    printf("%d\n", strlen(&arr[0] + 1));    //5
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char *p = "abcdef";
    printf("%d\n", sizeof(p));          //4  p是指针变量,求指针变量的大小,为4个字节
    printf("%d\n", sizeof(p + 1));      //4  p+1为b的地址
    printf("%d\n", sizeof(*p));         //1
    printf("%d\n", sizeof(p[0]));       //1
    printf("%d\n", sizeof(&p));;        //4  指针p的地址
    printf("%d\n", sizeof(&p + 1));     //4
    printf("%d\n", sizeof(&p[0] + 1));  //4  b的地址
 
    printf("%d\n", strlen(p));          //6
    printf("%d\n", strlen(p + 1));      //5
    printf("%d\n", strlen(*p));         //err strlen需要传入地址
    printf("%d\n", strlen(p[0]));       //err
    printf("%d\n", strlen(&p));         //随机值
    printf("%d\n", strlen(&p + 1));     //随机值
    printf("%d\n", strlen(&p[0] + 1));  //5  从b开始数

2.3 二维数组

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));          
//48  二维数组中sizeof(a),a同样表示整个数组
printf("%d\n", sizeof(a[0][0]));    
//4
printf("%d\n", sizeof(a[0]));       
//16 a[0]可看作第一行的数组名,sizeof(数组名)计算第一行数组大小
printf("%d\n", sizeof(a[0] + 1));   
//4  a[0]表示第一行首元素地址,即a[0][0]地址,再+1为a[0][1]地址
printf("%d\n", sizeof(*(a[0] + 1)));
//4 
printf("%d\n", sizeof(a + 1));      
//4  a为第一行一维数组的地址,+1为第二行的地址
printf("%d\n", sizeof(*(a + 1)));   
//16 第二行地址的解引用,是数组指针的解引用,访问的是一个数组的大小
printf("%d\n", sizeof(&a[0] + 1));  
//4  第一行地址+1,得第二行地址
printf("%d\n", sizeof(*(&a[0] + 1)));
//16 第二行的大小
printf("%d\n", sizeof(*a));         
//16 第一行地址解引用是第一行的大小
printf("%d\n", sizeof(a[3]));       
//16 计算第四行的大小(即使没有第四行)

三、总结

这些都是来自往年的笔试题,非常重要!!!学废了吗?!

建议收藏反复阅读思考,加深对指针、数组和内存的理解!!!

到此这篇关于C语言sizeof和strlen的指针和数组面试题详解的文章就介绍到这了,更多相关C语言 指针和数组内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_43460230/article/details/123908433

延伸 · 阅读

精彩推荐
  • C/C++C++实现走迷宫小游戏

    C++实现走迷宫小游戏

    这篇文章主要为大家详细介绍了C++实现走迷宫小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    hh_cnyali8282021-08-29
  • C/C++浅谈C++中的mutable和volatile关键字

    浅谈C++中的mutable和volatile关键字

    下面小编就为大家带来一篇浅谈C++中的mutable和volatile关键字。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网6312021-04-05
  • C/C++VC使用编译时间作为版本号标识的方法

    VC使用编译时间作为版本号标识的方法

    这篇文章主要介绍了VC使用编译时间作为版本号标识的方法,需要的朋友可以参考下...

    C语言教程网9522021-05-04
  • C/C++bloom filter概念讲解以及代码分析

    bloom filter概念讲解以及代码分析

    Bloom filter 优点就是它的插入和查询时间都是常数,另外它查询元素却不保存元素本身,具有良好的安全性...

    C语言教程网8812020-12-30
  • C/C++C++ 类访问控制的条件总结

    C++ 类访问控制的条件总结

    这篇文章主要介绍了C++ 类访问控制的条件总结的相关资料,需要的朋友可以参考下...

    shuzfan11812021-05-08
  • C/C++C++ Qt实现音视频播放功能

    C++ Qt实现音视频播放功能

    Qt版本 5.9 基于C++11 Qt核心组件与附加组件安装时请打钩 否则可能出现项目中缺少视频播放模块的问题,由于最近着手的Qt项目需要视频播放自己做的时候踩...

    Test_2338002022-03-03
  • C/C++c++关键字mutable深入解析

    c++关键字mutable深入解析

    先说用法,mutable关键字只能修饰非静态以及非常量成员变量,使用mutable修饰的成员变量在const函数中的值是可以修改的...

    C++教程网9422021-01-01
  • C/C++C++编程中队内联函数的理解和使用

    C++编程中队内联函数的理解和使用

    这篇文章主要介绍了C++编程中队内联函数的理解和使用,简单举例讲解了inline关键字引出的内联函数的相关知识,需要的朋友可以参考下...

    coder_xia6112021-03-22