C语言:指针详解(5)

目录

一、sizeof()函数和strlen()函数的对比

1.sizeof()函数

2.strlen()函数

 3.sizeof()函数和strlen()函数的对比

二、数组和指针笔试试题解析

1.一维数组

2.字符数组

(1)代码1

(2)代码2

(3)代码3

(4)代码4

(5)代码5

(6)代码6

3.二维数组​编辑

三、指针运算笔试题解析

1.代码1

2.代码2

3.代码3

4.代码4

5.代码5

6.代码6

7.代码7


正文开始

一、sizeof()函数和strlen()函数的对比

1.sizeof()函数

在学习操作符的时候,我们了解了sizeof()函数。sizeof()函数是用来计算变量所占内存空间大小的,单位是字节(byte)。如果我们利用sizeof来计算数据类型的大小时,计算的则是使用该数据类型创建的变量所占内存空间的大小。sizeof只关注占用内存空间的⼤小而不在乎内存中存放什么数据。具体信息可以浏览以下博客:C语言数据类型和变量_求模运算符只能用于整形操作数-CSDN博客。这里就不再对sizeof()函数作过多赘述

2.strlen()函数

strlen()函数是C语言的库函数,要使用strlen()函数,我们需要在写代码之前先包含string.h头文件,它的功能是用来计算字符串长度的,原型如下:

size_t strlen ( const char * str );

它的计算方法是统计从传入strlen()函数的参数str这个地址开始向后数,直到‘\0’之前字符串中字符的个数。也就是说,strlen()函数会从字符串的第一个字符的地址也就是首元素地址开始一直向后查找字符'\0',直到找到为止,这个过程中可能会存在越界访问。来看下面代码:

#include <stdio.h>

int main()
{
    char arr1[3] = {'a', 'b', 'c'};
    char arr2[] = "abc";
    printf("%d\n", strlen(arr1));
    printf("%d\n", strlen(arr2));
    return 0;
}

 当我们尝试运行这个代码的时候,我们会发现编译器会为我们报出一个警告:

我们也许会这么想: arr1和arr2在内容上应该是一样的,如果要将arr1和arr2打印出来也应该是相同的,但是为什么在计算长度的时候会出现问题呢?如果按我们这样的想法去想的话,arr1和arr2的长度都应该是3才对。当我们运行代码时,得出的结果却大相径庭:

当我们再运行一次时,就会发觉计算arr1的长度时arr1的长度居然是一个随机数

当我们再次回顾strlen()函数的特性时,也许就会发现问题所在。strlen()函数是从第一个字符开始一直统计字符个数,直到遇到字符'\0'为止。strlen()函数为什么能计算字符串的个数?那肯定是因为字符串的字符个数肯定不止我们在写代码时看到的这几个,实际上在字符串的结尾,还存在着一个隐藏的字符,那就是字符'\0',这也就是为什么我们能够通过strlen()函数来直接计算字符串长度的原因。

而当我们观察arr1时,我们就可以明白,它实际上是一个字符数组。它的元素个数有且仅有三个——'a' 'b' 'c',而没有字符串中自带的字符'\0'。而当我们试图用strlen()函数来计算字符数组的长度时,我们发现这是行不通的,因为字符数组中没有自带字符'\0',但是strlen()函数还是会从第一个字符开始往后数,由于没有结束的标志,所以strlen()函数会一直往后找,这时就会出现越界访问的问题,strlen()函数也不知道何时才能找到字符'\0',所以它在内存的海洋当中漫无目的地寻找,直到找到一个位置恰好为字符'\0'后才会收手,然后返回一个随机值。

/*大家在感情方面千万不要像strlen()函数一样啊,该放手就放手,祝各位都能遇到你爱、爱你的女孩*\

如果我们想要计算字符数组的长度,我们可以像计算数组长度那样来计算,或者是在字符数组的最后一个位置加上一个字符'\0',这样就可以计算字符数组的长度了。

但是要利用strlen()函数计算字符数组的长度时,一定要为字符'\0'留有足够的空间!

 3.sizeof()函数和strlen()函数的对比

二、数组和指针笔试试题解析

在学习了sizeof()函数、strlen()函数、数组和指针后,下面有一些企业曾经出过的笔试题,大家可以课下尝试一下,这里就不再过多阐释了

1.一维数组

    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));

2.字符数组

(1)代码1

(2)代码2

(3)代码3

(4)代码4

(5)代码5

(6)代码6

3.二维数组

三、指针运算笔试题解析

1.代码1

2.代码2

3.代码3

4.代码4

5.代码5

6.代码6

7.代码7


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch训练的时候 shm共享内存不足,导致训练停止

1.查看shm情况 df -h /dev/shm内存已经满了&#xff0c;因为之前训练多次训练意外停止到shm中的缓存不能及时被清理 2、手动清理shm 依然没被释放 3、查看关联的进程&#xff0c;一个一个kill lsof |grep deletedkill -9 46619 44618 44617 。。。。。4、搞定

vue中父子传递属性值

1、父传子属性值 自定义图库组件 在add.vue中应用tuku组件并给默认值 效果 2、 子传父&#xff0c;逆向赋值 add.vue和第一问中一样 修改tuku组件&#xff0c;传值给add.vue 3、多个传递 效果&#xff1a; 点击两个修改按钮后 4、使用defineModel简化父子传值 其他代码跟…

python作业三

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用io流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import json import shutilimport requests #使用requests模块获…

OceanBase:引领下一代分布式数据库技术的前沿

OceanBase的基本概念 定义和特点 OceanBase是一款由蚂蚁金服开发的分布式关系数据库系统&#xff0c;旨在提供高性能、高可用性和强一致性的数据库服务。它结合了关系数据库和分布式系统的优势&#xff0c;适用于大规模数据处理和高并发业务场景。其核心特点包括&#xff1a; …

【C/C++积累技巧】实现 连续播放文件图片+逐帧文本显示, 同时 可以按任意键退出(基于easyx小游戏编程)

技巧一、使用 IMAGE数组循环&#xff1a;实现【连续播放图片】 &#xff08;1&#xff09;一张图片如何放映在 图形化窗口上&#xff1a;借用两个函数 #include<graphics.h> // 函数的头文件IMAGE imgMy; // 图形变量 loadimage(&imgMy, "写入你想显示的图片路…

软件开发面试题(C#语言,.NET框架)

1. 解释什么是委托&#xff08;Delegate&#xff09;&#xff0c;并举例说明它在C#中的用法。 委托是一种引用类型&#xff0c;它可以用于封装一个或多个方法。委托对象可以像方法一样调用&#xff0c;甚至可以用于创建事件处理程序。委托是C#中实现事件和回调函数的重要机制。…

Hive表【汇总】

提前必备 1、内部表和外部表的区别 概念讲解&#xff1a; 外部表&#xff1a;1、存放他人给予自己的数据2、当我们删除表操作时&#xff0c;会将表的元数据删除&#xff0c;保留数据文件 内部表&#xff1a;1、存放已有的数据2、当我们删除表操作时&#xff0c;会将表的元数据…

Unity 优化合集

1️⃣ 贴图优化 1. Read/Write Enable 这个属性勾选后允许你在运行时读取和写入纹理数据&#xff0c;这对于需要实时生成内容或者需要动态修改纹理的场合非常有用但在大部分情况下这是不必要的。如果打开这个属性&#xff0c;会使运行时贴图大小翻倍&#xff0c;内存中会额外…

缓存与分布式锁

一、缓存 1、缓存使用 为了系统性能的提升&#xff0c;我们一般都会将部分数据放入缓存中&#xff0c;加速访问。 适合放入缓存的数据有&#xff1a; 即时性、数据一致性要求不高的&#xff1b;访问量大且更新频率不高的数据。 在开发中&#xff0c;凡是放入缓存中的数据我们都…

Git 命令行快速入门

前言 &#xff08;1&#xff09;新手个人建议使用TortoiseGit这类图形化界面来上手学习。 &#xff08;2&#xff09;如果一定需要用命令行进行操作&#xff0c;可以按照B站&#xff1a;程式与网页开发者必备技能&#xff01;Git 和 GitHub 零基础快速上手&#xff0c;轻松掌握…

构造与操作链栈

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝心态决定高度,细节决定成败! 链栈是数据结构中栈的一种实现方式,它利用链表(通常是单链表)来存储栈中的元…

【触摸屏】【红十字会学习系统】功能模块:视频 + AI拍照合成

项目背景 提升公众急救能力&#xff1a;确保每个人都能在紧急情况下采取正确的急救措施&#xff0c;减少伤害&#xff0c;挽救生命。培养人道主义价值观&#xff1a;通过教育和培训&#xff0c;传播红十字精神&#xff0c;促进社会对弱势群体的关注与支持。建立社区响应网络&a…

1. InternLM - 入门岛

第1关 Linux 基础知识 1. 完成SSH连接与端口映射并运行hello_world.py SSH连接配置 # wsl2中生成密钥对&#xff08;~/.ssh/id_rsa, ~/.ssh/id_rsa.pub&#xff09; ssh-keygen -t rsa# 将id_rsa.pub在internStudio作为公钥导入SSH登录 $ ssh -p 38871 rootssh.intern-ai.o…

5.SpringBoot核心源码-启动类源码分析

目录 概述技巧spring boot 如何启动应用程序run方法里面核心逻辑 SpringApplicaiton.run(xxx.class,args)结束 概述 SpringBoot核心源码-启动类源码分析 技巧 如何给外部源码加注释&#xff0c;想要在源码中添加自己的注释&#xff0c;会弹出 file is read only&#xff0c;代…

Java核心技术【二十二】Java的I/O流处理:深入文件读写操作、缓冲流、序列化与NIO

Java的I/O流处理&#xff1a;深入文件读写操作、缓冲流、序列化 在Java编程中&#xff0c;I/O流是处理输入输出操作的基础&#xff0c;特别是在文件读写、网络通信等领域。本文将在前文的基础上&#xff0c;进一步探讨缓冲流、序列化以及NIO&#xff08;New I/O&#xff09;在…

从0开始的STM32HAL库学习2

外部中断(HAL库GPIO讲解) 今天我们会详细地学习STM32CubeMX配置外部中断&#xff0c;并且讲解HAL库的GPIO的各种函数。 准备工作&#xff1a; 1、STM32开发板&#xff08;我的是STM32F103C8T6&#xff09; 2、STM32CubeMx软件、 IDE&#xff1a; Keil软件 3、STM32F1xx/ST…

01- 收入数据集【Pytorch入门实战】

目录 一、机器学习基础 二、实战例子 1.数据集分析 2.实战训练 3.总结 三、参考资料 一、机器学习基础 为了解决这个问题&#xff0c;人们想到数据驱动方法&#xff0c;也就是让计算机从现有的大量的带标签图片电学习规律&#xff0c;一旦计算机学习到了其中的规律&…

sip协议栈简介

SIP协议栈简介 SIP协议栈流程 数据链路层&#xff1a;当SIP消息从网络中传输到达TCP/IP协议栈时&#xff0c;首先被接收到的是数据链路层的数据帧。数据链路层会对数据帧进行解封装&#xff0c;得到网络层的IP数据报。 网络层&#xff1a;网络层会对IP数据报进行解析&#xf…

1.27、基于径向基神经网络的曲线拟合(matlab)

1、基于径向基神经网络的曲线拟合简介及原理 1)原理简介 基于径向基神经网络(Radial Basis Function Neural Network, RBFNN)的曲线拟合是一种常用的非线性拟合方法,通过在输入空间中使用径向基函数对数据进行处理,实现对非线性关系的拟合。 RBFNN的基本原理是将输入空…

Java基础(十九):集合框架

目录 一、Java集合框架体系二、Collection接口及方法1、添加2、判断3、删除4、其它 三、Iterator(迭代器)接口1、Iterator接口2、迭代器的执行原理3、foreach循环 四、Collection子接口1&#xff1a;List1、List接口特点2、List接口方法3、List接口主要实现类&#xff1a;Array…