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,一经查实,立即删除!

相关文章

算法笔记——LCR

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

男女相貌之秘 -高直上人

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

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…

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. 我…

《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…

QT creator与VS2019 QT加载模块方法

QT creator与VS2019加载模块方法 QT creator&#xff0c;pro文件添加 VS2019 QT

酷克数据亮相第13届PostgreSQL中国技术大会,获数据库杰出贡献奖

7 月 12 日&#xff0c;第 13 届 PostgreSQL 中国技术大会在杭州盛大开幕。本次大会以“聚焦云端创新&#xff0c;汇聚智慧共享”为主题&#xff0c;邀请了国内外 PG 领域众多行业大咖、学术精英及技术专家&#xff0c;共同探讨数据库领域的发展趋势、技术创新和实践经验。酷克…

[Vulnhub] Tr0ll3 aircrack-ng+lynx

信息收集 IP AddressOpening Ports192.168.101.147TCP:22 $ ssh start192.168.101.147 用户:Start startTr0ll3:~$ find / -type f -perm 0777 2>/tmp/1 startTr0ll3:~$ cat /var/log/.dist-manage/wytshadow.cap | nc 192.168.101.128 10035 WIFI握手包 aircrack-ng 破…

记一次 .NET某上位视觉程序 离奇崩溃分析

一&#xff1a;背景 1. 讲故事 前段时间有位朋友找到我&#xff0c;说他们有一个崩溃的dump让我帮忙看下怎么回事&#xff0c;确实有太多的人在网上找各种故障分析最后联系到了我&#xff0c;还好我一直都是免费分析&#xff0c;不收取任何费用&#xff0c;造福社区。 话不多…

[译] Rust标准库有些特殊,让我们改它

本篇是对 RustConf 2023中的The standard library is special. Let’s change that.这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. 今天我将讨论Rust的标准库,更具体地说,是关于标准库有何特殊之处,以及为什么我们应该改变这一点。首先声明一下…

大模型高效参数微调技术

文章目录 一、Fine-Tuning&#xff1a;微调二、Prompt-Tuning&#xff1a;提示调优2.1 工作原理2.2 PET (Pattern-Exploiting Training)2.3 Prompt-Tuning集成2.4 模板构建方式 三、Prefix Tuning&#xff1a;连续提示模板3.1 提出动机3.2 工作原理 四、P-Tuning V1/V24.1 P-Tu…

MQTT——Mosquitto使用(Linux订阅者+Win发布者)

前提&#xff1a;WSL&#xff08;Ubuntu22&#xff09;作为订阅者&#xff0c;本机Win10作为发布者。 1、Linux安装Mosquitto 命令行安装。 sudo apt-get install mosquitto 以上默认只安装了mosquitto的服务&#xff0c;不带测试客户端工具mosquitto_sub和mosquitto_pub。如…

楼栋管理助你打造智慧校园寝室新时代

在聚焦于智慧校园寝室管理的楼栋管理功能上&#xff0c;核心目标是实现对宿舍楼本身的高效、精细化运营。这一功能围绕楼栋信息维护、空间优化、安全监管等方面展开&#xff0c;旨在为学生创造一个安全、舒适的生活环境&#xff0c;同时提升管理效率。 楼栋管理功能首先建立在全…