当前位置: 首页 > news >正文

【C语言进阶:指针的进阶】你真分得清sizeof和strlen?

本章重点内容:

  • 字符指针
  • 指针数组
  • 数组指针
  • 数组传参和指针传参
  • 函数指针
  • 函数指针数组
  • 指向函数指针数组的指针
  • 回调函数
  • 指针和数组面试题的解析

这篇博客 FLASH 将带大家一起来练习一些容易让人凌乱的题目,通过这些题目来进一步加深和巩固对数组,指针,sizeof() 和 strlen() 使用的熟练度。话不多说,开始今天的内容:

简单复习一下数组和指针:

数组:能够存放一组相同类型的元素,数组的大小取决于数组的元素个数和元素类型。

指针:地址/指针变量,大小是4/8个字节。

数组是数组,指针是指针,二者是不等价的。但又存在一定的联系:

数组名是数组首元素的地址,这个地址就可以存放在指针变量中;因此我们就可以使用指针来遍历数组。

数组名:

大部分情况下数组名是数组首元素的地址,但是有两个例外:

  1. sizeof(数组名):这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名:这里的数组名表示整个数组,取出的是整个数组的地址。

⚡指针和数组笔试题解析

一维数组:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));//16//sizeof(数组名),计算的是数组总大小,单位是字节printf("%d\n", sizeof(a + 0));//4/8//+0不可以被忽略,因此 a+0 表示的是数组首元素的地址printf("%d\n", sizeof(*a));//4//a 表示的是数组首元素的地址,相当于 &a[0]//*a == *&a[0] == a[0]printf("%d\n", sizeof(a + 1));//4/8//a 是数组首元素的地址,类型是 int*//a+1 就是跳过一个 int* ,是第二个元素的地址printf("%d\n", sizeof(a[1]));//4printf("%d\n", sizeof(&a));//4/8//&a 取出的是数组的地址,数组的地址也是地址,大小是4/8个字节// int (*pa)[4] = &aprintf("%d\n", sizeof(*&a));//16//*&a == a,sizeof(a)计算的是数组总大小printf("%d\n", sizeof(&a + 1));//4/8//&a 取出的是整个数组的地址,类型是int (*)[4]//&a+1 就跳过整个数组,指向的是紧跟数组后的地址printf("%d\n", sizeof(&a[0]));//4/8//&a[0] 取出数组首元素的地址printf("%d\n", sizeof(&a[0] + 1));//4/8//&a[0]+1 取出数组第二个元素的地址return 0;
}

字符数组:

必备知识清单:

1. sizeof 计算的是占用内存空间的大小,单位是字节,不关注内存中到底存放的是什么。

2. sizeof 不是函数,是操作符。

3. strlen 是函数。

4. strlen 针对字符串,求的是字符串的长度,本质上统计的是 \0 之前出现的字符个数。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr));//6printf("%d\n", sizeof(arr + 0));//4/8//arr+0 是数组首元素的地址printf("%d\n", sizeof(*arr));//1//arr 数组首元素的地址,*arr 表示数组首元素 printf("%d\n", sizeof(arr[1]));//1printf("%d\n", sizeof(&arr));//4/8//&arr 取出的是数组的地址printf("%d\n", sizeof(&arr + 1));//4/8//&arr+1 跳过一个数组后的地址printf("%d\n", sizeof(&arr[0] + 1));//4/8//&arr[0] 数组首元素的地址,+1 数组第二个元素的地址printf("%d\n", strlen(arr));//随机值//arr 数组首元素地址printf("%d\n", strlen(arr + 0));//随机值//arr+0 数组首元素地址printf("%d\n", strlen(*arr));//非法访问//*arr 代表首元素,但是 strlen 函数需要的是地址,因此将字符的ASCLL吗作为地址给strlen传去printf("%d\n", strlen(arr[1]));//非法访问//arr[1] 代表数组第二个元素,但是 strlen 函数需要的是地址,因此将字符的ASCLL吗作为地址给strlen传去printf("%d\n", strlen(&arr));//随机值//&arr 数组的地址,传给strlen后从起始位置开始计算printf("%d\n", strlen(&arr + 1));//随机值-6//&arr+1 整个数组后的地址printf("%d\n", strlen(&arr[0] + 1));//随机值-1//&arr[0]+1 数组第二个元素的地址return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
int main()
{char arr[] = "abcdef";// a,b,c,d,e,f,\0printf("%d\n", sizeof(arr));//7//sizeof(arr) 计算的是整个数组的大小printf("%d\n", sizeof(arr + 0));//4/8//arr+0 首元素的地址printf("%d\n", sizeof(*arr));//1//*arr 数组首元素printf("%d\n", sizeof(arr[1]));//1//arr[1] 数组第二个元素printf("%d\n", sizeof(&arr));//4/8//&arr 取出的是整个数组的地址printf("%d\n", sizeof(&arr + 1));//4/8//&arr+1 整个数组后的地址printf("%d\n", sizeof(&arr[0] + 1));//4/8//&arr[0]+1 数组第二个元素的地址printf("%d\n", strlen(arr));//6//arr 首元素的地址printf("%d\n", strlen(arr + 0));//6//arr+0 首元素的地址printf("%d\n", strlen(*arr));//非法访问//*arr 代表首元素,但是 strlen 函数需要的是地址,因此将字符的ASCLL吗作为地址给strlen传去printf("%d\n", strlen(arr[1]));//非法访问//arr[1] 代表数组第二个元素,但是 strlen 函数需要的是地址,因此将字符的ASCLL吗作为地址给strlen传去printf("%d\n", strlen(&arr));//6//&arr 表示整个数组的地址,从起始位置开始计算printf("%d\n", strlen(&arr + 1));//随机值//&arr+1 数组后的地址printf("%d\n", strlen(&arr[0] + 1));//5//&arr[0]+1 数组第二个元素的地址return 0;
}

明天继续更……


感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。

98b76a6f4a9c4ca88fd93da1188ac6f9.gif

相关文章:

【C语言进阶:指针的进阶】你真分得清sizeof和strlen?

本章重点内容&#xff1a; 字符指针指针数组数组指针数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组面试题的解析这篇博客 FLASH 将带大家一起来练习一些容易让人凌乱的题目&#xff0c;通过这些题目来进一步加深和巩固对数组&#xff0c;指…...

【前端必看】极大提高开发效率的网页 JS 调试技巧

大家好&#xff0c;我是前端西瓜哥。本文讲解如何使用浏览器提供的工具进行 JS 代码的断点调试。 debugger 在代码中需要打断点的地方&#xff0c;加上 debugger&#xff0c;表示一个断点。浏览器代码执行到该位置时&#xff0c;会停下来&#xff0c;进入调试模式。 示例代码…...

【春招面经】视源股份前端一面

前言 本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09; 文章目录前言本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09;问题总结介绍一下项目的来源以及做这个项目的初衷一直监听滚动&#xff0c;有没有对性能产生影响&a…...

插件化开发入门

一、背景顾名思义&#xff0c;插件化开发就是将某个功能代码封装为一个插件模块&#xff0c;通过插件中心的配置来下载、激活、禁用、或者卸载&#xff0c;主程序无需再次重启即可获取新的功能&#xff0c;从而实现快速集成。当然&#xff0c;实现这样的效果&#xff0c;必须遵…...

tftp、nfs 服务器环境搭建

目录 一、认识 tftp、nfs 1、什么是 tftp&#xff1f; 2、什么是 nfs&#xff1f; 3、tftp 和 nfs 的区别 二、tftp的安装 1、安装 tftp 服务端 2、配置 tftp 3、启动 tftp 服务 三、nfs 的安装 1、安装 nfs 服务端 2、配置 nfs 3、启动 nfs 服务 一、认识 tftp、…...

汇编系列03-不借助操作系统输出Hello World

每天进步一点点&#xff0c;加油&#xff01; 上一节&#xff0c;我们通过汇编指令&#xff0c;借助操作系统的系统调用实现了向标准输出打印Hello world。这一节我们打算绕过操作系统&#xff0c;直接在显示屏幕上打印Hello world。 计算机的启动过程 当我们给计算机加电启…...

TPU编程竞赛系列|算能赛道冠军SO-FAST团队获第十届CCF BDCI总决赛特等奖!

近日&#xff0c;第十届中国计算机学会&#xff08;CCF&#xff09;大数据与计算智能大赛总决赛暨颁奖典礼在苏州顺利落幕&#xff0c;算能赛道的冠军队伍SO-FAST从2万余支队伍中脱颖而出&#xff0c;获得了所有赛道综合评比特等奖&#xff01; 本届CCF大赛吸引了来自全国的2万…...

【C++】AVL树,平衡二叉树详细解析

文章目录前言1.AVL树的概念2.AVL树节点的定义3.AVL树的插入4.AVL树的旋转左单旋右单旋左右双旋右左双旋AVL树的验证AVL树的删除AVL树的性能前言 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;在其文档介绍中发现&#xff0c;这几个容器有个共同点是&#xff1…...

C/C++开发,无可避免的多线程(篇四).线程与函数的奇妙碰撞

一、函数、函数指针及函数对象 1.1 函数 函数&#xff08;function&#xff09;是把一个语句序列&#xff08;函数体, function body&#xff09;关联到一个名字和零或更多个函数形参&#xff08;function parameter&#xff09;的列表的 C 实体&#xff0c;可以通过返回或者抛…...

elisp简单实例: taglist

从vim 转到emacs 下,一直为缺少vim 中的tablist 插件而感到失落. 从网上得到的一个emacs中的taglist, 它的功能很简陋,而且没有任何说明, 把它做为elisp的简单实例,供初学者入门倒不错,我给它加了很多注释,帮助理解, 说实话,感觉这百行代码还是挺有深度的,慢慢体会,调试才会有收…...

Azure AI基础到实战(C#2022)-认知服务(3)

目录 OpenFileDialog 类上一节代码的API剖析ComputerVisionClientExtensions.ReadAsync MethodReadHeaders ClassReadHeaders.OperationLocation Property探索ReadHeaders加上调试代码可用于 Azure 认知服务的身份验证标头使用单服务订阅密钥进行身份验证使用多服务订阅密钥进行…...

aws apigateway 使用restapi集成lambda

参考资料 代理集成&#xff0c;https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html非代理集成&#xff0c;https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/getting-started-…...

HTML基础

HTML 基础 文章目录HTML 基础列表标签无序列表有序列表自定义列表表格标签表格基本标签表格基本结构表格完整结构&#xff1a;合并行和合并列表单标签input 系列标签属性标签text 标签radio 标签 单选框file 标签 文件选择button 标签 按钮input系列标签总结button按钮标签sele…...

ThreadPoolExecutor参数 keepAliveTime allowCoreThreadTimeOut

/*** Timeout in nanoseconds for idle threads waiting for work.* Threads use this timeout when there are more than corePoolSize* present or if allowCoreThreadTimeOut. Otherwise they wait* forever for new work.*/ private volatile long keepAliveTime;等待工作的…...

什么是Hibernate框架?

简单介绍&#xff1a;Hibernate框架是当今主流的java持久层框架之一&#xff0c;是一个开放源码的ORM&#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;框架&#xff0c;它对JDBC进行了轻量级的封装&#xff0c;使得JAVA开发人员可以使用面向对象的编…...

指针面试笔试题练习

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨星光…...

docker(三)仓库的搭建、官方私有仓库的加密和认证

文章目录一、docker仓库二、仓库Registry工作原理三、搭建本地私有仓库四、配置镜像加速器五、私有仓库的加密认证1.非加密下上传拉取2.insecure registry3.仓库加密4.仓库认证一、docker仓库 什么是仓库 Docker 仓库是用来包含镜像的位置&#xff0c;Docker提供一个注册服务器…...

FPGA实现SDI视频编解码 SDI接收发送,提供2套工程源码和技术支持

目录1、前言2、设计思路和框架SDI接收SDI缓存写方式处理SDI缓存读方式处理SDI缓存的目的SDI发送3、工程1详解4、工程2详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案&#xff1a; 一是使用专用编解码芯片&#xff0…...

Android 基础知识4-3.5 RadioButton(单选按钮)Checkbox(复选框)详解

一、RadioButton&#xff08;单选按钮&#xff09; 1.1、简介 RadioButton表示单选按钮&#xff0c;是button的子类&#xff0c;每一个按钮都有选择和未选中两种状态&#xff0c;经常与RadioGroup一起使用&#xff0c;否则不能实现其单选功能。RadioGroup继承自LinearLayout&a…...

用代码实现解析解的方式求解_梯度下降法思路_导函数有什么用_接23节---人工智能工作笔记0026

这里24节,25节,介绍了一下人工智能高等数学要学习的一些内容,初步了解了一下,微积分中用到的知识~微分~以及导数这里... 然后接着23节,我们还是继续,走人工智能的主线,先把整体的人工智能的内容学习一遍,然后再去回去看数学知识更有目的性. 然后首先来回顾一下,这里机器学习,其…...

开源工具WinDiskWriter:突破限制的Windows启动盘制作高效解决方案

开源工具WinDiskWriter&#xff1a;突破限制的Windows启动盘制作高效解决方案 【免费下载链接】windiskwriter &#x1f5a5; Windows Bootable USB creator for macOS. &#x1f6e0; Patches Windows 11 to bypass TPM and Secure Boot requirements. &#x1f47e; UEFI &am…...

9个非技术岗也能胜任的AI岗位,小白程序员看过来,建议收藏![特殊字符]

9个非技术岗也能胜任的AI岗位&#xff0c;小白程序员看过来&#xff0c;建议收藏&#xff01;&#x1f525; 本文介绍了9个适合非技术背景人士的AI相关岗位&#xff0c;包括AI产品运营、大模型产品助理、AI客服训练师等&#xff0c;涵盖了岗位职责、薪资水平、招聘方及入门建议…...

用快马平台十分钟复刻lostlife:快速构建你的首个交互式游戏原型

最近想尝试做个简单的交互式游戏原型&#xff0c;正好看到InsCode(快马)平台可以快速生成项目代码&#xff0c;就试了试复刻类似lostlife的玩法。整个过程比想象中顺利&#xff0c;分享下我的实现思路&#xff1a; 确定核心交互逻辑 游戏的核心是点击角色触发反馈&#xff0c;所…...

GigE Vision 多相机同步终极检查清单(可直接用于项目部署)

GigE Vision 多相机同步终极检查清单&#xff08;可直接用于项目部署&#xff09;&#x1f4cb; GigE Vision 多相机同步终极检查清单一、网络基础设施二、PTP 配置三、硬件触发四、相机参数一致性五、软件数据处理六、验证手段&#x1f4cb; GigE Vision 多相机同步终极检查清…...

终极网盘直链解析解决方案:一站式解锁八大平台高速下载通道

终极网盘直链解析解决方案&#xff1a;一站式解锁八大平台高速下载通道 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…...

解决多显示器显示错乱难题:SetDPI带来的视觉一致性变革

解决多显示器显示错乱难题&#xff1a;SetDPI带来的视觉一致性变革 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 问题诊断&#xff1a;当多显示器成为工作障碍 为什么专业人士的多屏工作站反而降低效率&#xff1f;摄影师小林的修图软…...

Windows 11安装终极指南:5分钟绕过所有硬件限制

Windows 11安装终极指南&#xff1a;5分钟绕过所有硬件限制 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat 还在为Wind…...

跳棋游戏中的多重捕获实现

跳棋(Checkers)是许多棋类爱好者喜爱的一款游戏,它的规则简单,但策略深度却非常丰富。今天我们来讨论跳棋游戏中的一个复杂而有趣的功能——多重捕获的实现。在本文中,我们将深入探讨如何在JavaScript中编写一个可以检测并执行多重捕获的函数。 基本概念 在跳棋游戏中,…...

Qwen3-14B企业应用部署:从镜像拉取到API接入的完整流程

Qwen3-14B企业应用部署&#xff1a;从镜像拉取到API接入的完整流程 1. 镜像概述与核心优势 Qwen3-14B私有部署镜像是专为企业级AI应用场景打造的优化版本&#xff0c;基于通义千问大语言模型深度定制。这个镜像最显著的特点是开箱即用——所有运行环境和模型依赖都已预装完毕…...

图像去雾新思路:当无监督学习遇上注意力机制(CycleGAN+SK Fusion深度解析)

图像去雾新思路&#xff1a;当无监督学习遇上注意力机制&#xff08;CycleGANSK Fusion深度解析&#xff09; 清晨的山间薄雾给风景增添了几分朦胧美&#xff0c;但对于计算机视觉系统而言&#xff0c;这种大气散射效应却是清晰感知世界的障碍。从自动驾驶车辆的环境感知到卫星…...