C语言:指针详解(5)

目录

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

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

三、指针运算笔试题解析


正文开始

一、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


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python自定义可切片的类

Python自定义可切片的类 在Python中,要创建一个自定义可切片的对象,你需要实现 __getitem__ 方法。这个方法允许对象支持索引操作,包括切片。 下面是一个简单的例子,展示了如何创建一个支持切片操作的自定义类: class MyList:def __init__(self, data):self.data = dat…

开源 Wiki 系统 InfoSphere 2024.01.1 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…

Java高风险之在用户界面(UI)中显示敏感数据(Display of sensitive data in the user interface)

风险介绍 Display of sensitive data in the user interface,在用户界面(UI)中显示敏感数据可能带来多种风险,这可能导致信息泄露和不必要的风险,因为敏感数据可能会被截屏、监控软件捕获、或者被旁观者看到。这些风险涉及数据泄露、身份盗用、经济损失和法律处罚等。 数…

算法笔记——LCR

一.LCR 152. 验证二叉搜索树的后序遍历序列 题目描述&#xff1a; 给你一个二叉搜索树的后续遍历序列&#xff0c;让你判断该序列是否合法。 解题思路&#xff1a; 根据二叉搜索树的特性&#xff0c;二叉树搜索的每一个结点&#xff0c;大于左子树&#xff0c;小于右子树。…

男女相貌之秘 -高直上人

描述 高直上人&#xff0c;一个富有才华的老师&#xff01; 对于大家的学习有不可多得的帮助。 内容 目前主要的内容以面相为主&#xff0c;对于学习面相有比较大的帮助&#xff01; 但是网络上面错综复杂&#xff0c;很多老旧的版本影响学习&#xff01; 而这里我整理了相…

软考高级第四版备考--第18天(规划风险管理)Plan Risk Management

定义&#xff1a;定义如何实施项目风险管理活动的过程 作用&#xff1a;确保风险管理的水平、方法和可见度与项目风险程度相匹配&#xff0c;与对组织和其他干系人的重要程度相匹配。 输入&#xff1a;1、项目管理计划&#xff08;在规划项目风险管理时&#xff0c;应考虑所有…

“存算分离“和“湖仓一体“

"存算分离"和"湖仓一体"是在大数据领域中常见的两种数据架构设计理念&#xff0c;用于处理和管理大数据的存储和分析需求。 1. 存算分离&#xff08;StorageCompute Separation&#xff09;&#xff1a; 定义&#xff1a;存算分离是一种架构设计思想&#…

Python3.6.6 OpenCV 将视频中人物标记或者打马赛克或加图片并保存为不同格式

1、轻松识别视频人物并做出标记 需安装face_recongnition与dlib&#xff0c;过程有点困难&#xff0c;还请网上查找方法 import face_recognition import cv2 #镜像源 -i https://pypi.mirrors.ustc.edu.cn/simple # 加载视频 video_file E:\\videos\\1.mp4 video_capture …

Qt下使用OpenCV的鼠标回调函数进行圆形/矩形/多边形的绘制

文章目录 前言一、设置imshow显示窗口二、绘制圆形三、绘制矩形四、绘制多边形五、示例完整代码总结 前言 本文主要讲述了在Qt下使用OpenCV的鼠标回调在OpenCV的namedWindow和imshow函数显示出来的界面上进行一些图形的绘制&#xff0c;并最终将绘制好的图形显示在QLabel上。示…

UE4 解决创建布料报错:三角形退化

**【问题】**创建创建布料时报错&#xff1a;三角形退化 【方法】 1.要重新绑定&#xff1a;导入到ue4为静态网格体&#xff0c;勾选“移除退化”&#xff0c;再导出fbx&#xff0c;再重新绑定 2.不用重新绑定&#xff1a;使用排除法&#xff08;费时&#xff09;&#xff0c…

全栈物联网项目:结合 C/C++、Python、Node.js 和 React 开发智能温控系统(附代码示例)

1. 项目概述 本文详细介绍了一个基于STM32微控制器和AWS IoT云平台的智能温控器项目。该项目旨在实现远程温度监控和控制,具有以下主要特点: 使用STM32F103微控制器作为主控芯片,负责数据采集、处理和控制逻辑采用DHT22数字温湿度传感器,精确采集环境温湿度数据通过ESP8266 W…

js播放mp3,并且读取srt字幕文件,展示字幕

下面是gpt生成的代码&#xff0c;能跑&#xff0c;但是性能gpt是不考虑的&#xff0c;自行斟酌 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>MP3播放器</title> </head> <body><h1>MP3播放器…

Mac和VirtualBox Ubuntu共享文件夹

1、VirtualBox中点击设置->共享文件夹 2、设置共享文件夹路径和名称&#xff08;重点来了&#xff1a;共享文件夹名称&#xff09; 3、保存设置后重启虚拟机&#xff0c;执行下面的命令 sudo mkdir /mnt/share sudo mount -t vboxsf share /mnt/share/ 注&#xff1a;shar…

Leetcode-203-移除链表元素-临时变量作用域-c++

题目详见https://leetcode.cn/problems/remove-linked-list-elements/ 题解代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullpt…

你需要知道的笔记本养护的几个小知识

笔记本充电器可以长期不拔吗&#xff1f; 可以&#xff0c;但建议偶尔使用电池激发电池活性并且修正电量计精度&#xff1b; 当充电器接入后&#xff0c;笔记本会优先使用充电器进行供电而不会使用电池供电&#xff0c;同时充电器也会为缺电的电池补充电量。 现在笔记本电脑普遍…

大数据开发中的数据驱动决策:关键问题与实践指南

目录 决策前的准备工作1. 我已经掌握了哪些信息&#xff1f;2. 我们已经做出决定了吗&#xff1f;3. 我们需要哪些额外信息以及何时需要&#xff1f; 决策过程中的关键问题1. 我们需要做这个决定吗&#xff1f;2. 错误地做出这个决定的代价是什么&#xff1f; 决策后的反思1. 我…

分布式系统—Ceph对象存储系统(RGW接口)

一、对象存储概念 对象存储&#xff08;object storage&#xff09;是非结构数据的存储方法&#xff0c;对象存储中每一条数据都作为单独的对象存储&#xff0c;拥有唯一的地址来识别数据对象&#xff0c;通常用于云计算环境中。不同于其他数据存储方法&#xff0c;基于对象的…

web黑马课总结笔记(持续更新)

web学习笔记 jsjs引入方式内部脚本&#xff1a;将js代码定义在html界面中外部脚本&#xff1a;将js代码定义在外部js文件中&#xff0c;然后引入到html页面中 js的三种输出 js js是一门跨平台&#xff0c;面向对象的脚本语言。是用来控制网页行为时代的&#xff0c;它能使网页…

《Python零基础入门》——关于PyCharm使用技巧及python基本概念

从本次文章开始&#xff0c;我们将学习一门新的编程语言——Python。作为最热门的编程语言&#xff0c;Python相对比较清晰、简单。 python主要的编译工具就是pycharm&#xff0c;关于pycharm的安装及python配置环境&#xff0c;大家可自行参考网络上的教程&#xff0c;本文不…

# Redis 入门到精通(一)数据类型(4)

Redis 入门到精通&#xff08;一&#xff09;数据类型&#xff08;4&#xff09; 一、redis 数据类型–sorted_set实现时效性任务管理 1、sorted_set 类型数据操作的注意事项 score 保存的数据存储空间是64位&#xff0c;如果是整数范围是-9007199254740992~9007199254740992…