指针、数组、sizeof、strlen相关知识与练习题目

目录

前提回顾🔍:

关于一维数组🤮:

关于二维数组😀:

 sizeof与strlen🐕:

sizeof🏀:

 strlen🐓:

相关练习📚: 

 一维数组与sizeof😔:

字符数组与sizeof🐱:

 字符数组与strlen🐟:

指针与sizeof😍:

 二维数组与sizeof🎈:

 ……………等待后续更新!!!!!!!​


前提回顾🔍:

关于一维数组🤮:

  • 数组名:数组名在通常的情况下是表示数组首个元素的地址
  • 数组名+1:表达的是首个元素后的一个地址,也就是第二个元素的地址
  • &数组名:表示的是整个数组的地址
  • &数组名+1:表示的是从数组首个元素出发,越过1个数组的大小(数组内所有元素的字节数之和)抵达的位置,表达的最后还是地址。
  • &数组名[ ] :数组中某个元素的地址
  • 数组名[ ] :数组中的第(某个+1) 元素
  • *数组名:表达的是首个元素的地址指向的元素,其实就是指首个元素!
  • sizeof(数组名):整个数组的大小,也就是整个数组中所有元素的字节数之和!

关于二维数组😀:

举例:a[3][4]

  • 数组名:在通常情况下表示的是首个元素的地址,在二维数组中,表示的就是第一行的地址,可以写为a表示第一行的地址,或者写出a[0]表示第一行的地址
  • 数组名+1:数组名表示第一行的地址,而+1则表示为二维数组第二行的地址,也可以写为a[1]
  • &数组名:表示的是整个数组的地址
  • &数组名[ ] :表示的是二维数组中,某一行的地址
  • 数组名[ ] :根据二维数组的性质,这其实是二维数组的某一行的数组名
  • sizeof(数组名):表示整个二维数组的所有元素的字节之和
  • sizeof(数组名[ ]):表示二维数组中的某一行的所有元素字节数之和。
  • 数组名[0][0]:表示的是第一行第一个元素
  • 数组名[ ] +1 :数组名[ ] 表示的是二维数组某一行的数组名,同时也表示了在这一行中的首个元素地址,而+1则是表示维这一行中的第二个元素的地址

 sizeof与strlen🐕:

sizeof🏀:

  • sizeof ,sizeof 计算变量所占内存内存空间大小的,单位是字节。
  • sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据。
  • 在sizeof中,地址的大小是只根据环境而改变的,x86的环境下,地址的大小是4,x64的环境下,地址的大小是8 单位都是字节
  • 在sizeof中,数据、元素的大小是根据数据类型而改变的,列如:int类型四个字节,char类型一个字节。
  • 放在sizeof()的括号中的表达式并不会参与运算的!
  • sizeof是看类型来进行判断字节大小
  •   int a = 0;
  • printf("%zd\n"sizeof(a));   
  • printf("%zd\n"sizeof a);
  • printf("%zd\n"sizeof(int));  以上都是允许的,但是不允许printf("%zd\n"sizeof  int); 

 strlen🐓:

  • size_t strlen ( const char * str );
  • 使用时需要加上头文件,string.h
  • strlen是求字符串的长度,且遇见\0会自动停下,所求的长度也是在\0前的字符个数。
  • strlen在没有遇到\0的情况下,会一直前进直到找到\0为止。
  • 在使用strlen的过程中,要确保被strlen使用的内容中有\0否则会随机返回一个数值。
  • strlen()的原理是,括号内给予某个地址,从这个地址开始往后进行查找,查找到\0,结束查找

相关练习📚: 

 一维数组与sizeof😔:

int a [ ] = {1,2,3,4,5};


printf("%zd\n",sizeof(a));  16

  • a是数组名,sizeof(数组名)是表示整个数组大小,也就是表示整个数组的元素字节之和!

printf("%d\n",sizeof(a+0));4/8

  • a+0在sizeof里面,并不是单纯的数组名,所以a只能是表示首元素地址,首元素地址+0还是首元素地址!4或8个字节是看环境

printf("%d\n",sizeof(*a));

  • *a在sizeof里面并不是单纯的数组名,所以a表示的是首元素地址,*是解引用,*a就是表示第一个元素!是元素!int类型的元素是4个字节!

printf("%d\n",sizeof(a+1));

  • a+1在sizeof中并不是单纯的数组名,所以a表示的是首元素地址,a+1就表示首元素地址+1,那就是第二个元素地址。所以是4或8个字节

printf("%d\n",sizeof(a[1]));

  • 就是第二个元素!求第二个元素的字节大小!

printf("%d\n",sizeof(&a));

  • &a取出的是整个数组的地址,数组的地址也是地址,地址的大小就是4或8,其次&a是为了&a其实是表现在&a+1时类型的不同,而体现的+1效果不同,整型的a那就是加上了4个字节,而char的a那就是加上1个字节

printf("%d\n",sizeof(*&a));

  • &a是取了整个数组的地址,并把整个地址存放到p,*又是解引用
  • *p则是访问p里面的地址所指向的元素
  • p是数组的地址,相当于访问了数组里面的所有元素。
  • 所以sizeof(*&a)相当于访问了数组里面所以的元素大小,那就等于取了数组中所有元素的大小,那就是16

printf("%d\n",sizeof(&a+1));

  • &a是表示整个数组的地址,&a+1就是在整个数组地址上在往后四个字节的地址(看a的类型,如果a是char那就是在整个数组的地址上往后一个字节),也是地址,所有就是4或8个字节

printf("%d\n",sizeof(&a[0]));

  • a[0] 表示的是首元素,而&a[0]则表示的是首元素的地址 ,因为是地址所有4/8

printf("%d\n",sizeof(&a[0]+1));

  • a[0] 表示的是首元素,而&a[0]则表示的是首元素的地址 ,&a[0]+1表示首元素的地址+1那么就是第二个元素的地址,因为是地址所有是4/8

字符数组与sizeof🐱:

char arr[] = {'a','b','c','d','e'};


printf("%d\n", sizeof(arr));

  • arr是数组名,sizeof(数组名)是表示整个数组大小,也就是表示整个数组的元素字节之和!

printf("%d\n", sizeof(arr+0));

  • arr是数组首元素的地址,arr+0 还是首元素的地址 是地址大小就是4/8个字节

printf("%d\n", sizeof(*arr));

  • arr是数组首元素的地址,*arr就是首元素,就占一个字符大小就是1个字节

printf("%d\n", sizeof(arr[1]));

  • arr[1]就是数组的第二个元素,大小是1个字节

printf("%d\n", sizeof(&arr));

  • &arr 是数组的地址,数组的地址也是地址,大小就是4/8

printf("%d\n", sizeof(&arr+1));

  • &arr+1 是跳过整个数组,指向e的后面

printf("%d\n", sizeof(&arr[0]+1));

  • &arr[o]是首元素的地址,&arr[o]+1就是第二个元素的地址

 字符数组与strlen🐟:

char arr[ ] = {'a','b','c','d','e'};


 printf("%d\n", strlen(arr));

printf("%d\n", strlen(arr+0));

  • 这两个都一样,因为不是sizeof所以arr表示的是首元素地址
  • arr+0和arr都是表示首元素地址

printf("%d\n", strlen(*arr));

printf("%d\n", strlen(arr[1]));

  • arr是首元素地址,*表示地址指向的元素,*arr就是首元素 ’a‘   而’a‘的ASCII值是97
  • 但是97作为地址传给strlen会造成非法访问!
  • arr[1] 也是如此,表示的是元素‘b’ 

printf("%d\n", strlen(&arr));

  • 虽然&arr是整个数组的地址,但也是从首元素地址开始的,抵达\0处,但是上面没有\0所以随机值

printf("%d\n", strlen(&arr+1));

  • 因为是&arr+1,所以是在数组后面的一个地址开始寻找\0,但因为没有表明\0所以是随机值,且和&arr差6

printf("%d\n", strlen(&arr[0]+1));

  • 表示的是第二个元素的地址,也是从第二个地址开始找\0但是找不到,所以随机值

指针与sizeof😍:

char *p = "abcdef";


printf("%d\n", sizeof(p));

  • p是一个指针变量,根据指针变量的根本特性,所有的指针变量的大小都是四或八个字节

printf("%d\n", sizeof(p+1));

  • p存储的是a的地址,也是首字符地址,+1后就是第二个字符地址

printf("%d\n", sizeof(*p));

  • p是首字符地址,*是表示地址指向的元素,*p就是首字符

printf("%d\n", sizeof(p[0]));

  • 其实就是字符串的首个字符,相当于数组arr的arr[0]

printf("%d\n", sizeof(&p));

  • &p是指针p的地址,既然是地址那么大小就是四或八个字节

printf("%d\n", sizeof(&p+1));

  • &p是地址,而&p+1则是跳过一个p大小的地址,本质上还是地址,&p+1只是为了直到跳过几个p大小,以及跳过的字节数是多少。

printf("%d\n", sizeof(&p[0]+1)); 

  • p[0]是表示字符串的首字符,&p[0]则是取首字符地址,随后的加一变成了第二个字符的地址,既然是地址,那么就是四个或八个字节

 二维数组与sizeof🎈:

int a[3][4] = {0};


printf("%d\n",sizeof(a));

  • 计算的是整个二维数组的大小,单位是字节-48

printf("%d\n",sizeof(a[0][0]));

  • a[0][0]是第一行第一个元素,大小是4个字节

printf("%d\n",sizeof(a[0]));

  • a[0]其实就是第一行的数组名,这里第一行的数组名单独放在sizeof内部了,计算的是第一行的大小 —16

printf("%d\n",sizeof(a[0]+1));

  • a[0]是第一行这个数组的数组名,但是数组名并非单独放在sizeof内部,所以数组名表示数组首元素的地址,也就是a[0[0]的地址。
  • a[0]+1是第一行第二个元素 (a[0][1]) 的地址,地址的大小是4/8个字节

printf("%d\n",sizeof(*(a[0]+1)));

  • a[ 0 ] + 1是第一行第二个元素 (a[ 0 ][1]) 的地址,*(a[0] + 1)就是第一行第二个元素,大小是4个字节

printf("%d\n",sizeof(a+1));

  • a 没有单独放在sizeof内部,没有&,数组名a就是数组首元素的地址,也就是第一行的地址,a+1就是第二行的地址

printf("%d\n",sizeof(*(a+1)));

  • (a+1)在siezeof中并不是单独的数组名,所以a代表首元素地址,而二维数组的首元素地址表示的是第一行地址,所以第一行地址加一就是第二行地址。
  • 而*就是解引用,指向地址指向的元素,所以*(a+1)就是指向第二行中的所有元素。
  • 所以就是求第二行的所有元素的字节大小之和,也就是16。
  • 其次*(a+1)可以表示为a[1]相当于第二行的数组名,表示第二行数组地址

printf("%d\n",sizeof(&a[0]+1));

  • a[0]是第一行的数组名,&a[0]取出的是第一行的地址,&a[0]+1得到的就是第二行的地址

printf("%d\n",sizeof(*(&a[0]+1)));

  • (&a[0]+1)表示的是第二行地址,那么解引用就表示第二行地址指向的元素,也就是第二行的所有元素的字节大小之和

printf("%d\n",sizeof(*a));

  • 二维数组的数组名就是a,而sizeof里面并不单单是数组名,所有这里的a表示二维数组的首地址,二维数组的首地址是第一行的地址。
  • 而*解引用就是指向地址指向的元素,因此指向第一行的所有元素,所以这里最后求的就是第一行中所有元素的字节数之和

printf("%d\n",sizeof(a[3]));

  • 表示的是数组第四行的地址,但是数组并没有四行,可是sizeof的特性就是看只看空间不看数据,所以他不会在一数据是否存在,只会看数据的类型来判断空间大小.
  • 而a[3]相当于一个数组名,所有根据先前的设定(a[3][4]),我们可以直到a[3]的大小相当于a[0]的大小,也就相当于第一行所有字节数之和的大小,也就是16

 ……………等待后续更新!!!!!!!

 

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

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

相关文章

numpy基础知识

文章目录 安装numpynumpy的ndarray对象ndarray 和 list 效率比较创建一/二维数组ndarray的常用属性调整数组形状ndarray转list numpy的数据类型数组的运算数组和数的计算数组和数组的计算 数组的轴数组的索引和切片数组的与或非和三目运算符numpy的插入、删除、去重插入删除去重…

高并发内存池(threadcache)[1]

高并发内存池 分层处理 thread cache 定义一个公共的FreeList管理切分的小空间 static void*& NextObj(void* obj) {return *(void**)obj; }//管理切分好的小对象的自由链表 class FreeList { public:void Push(void* obj){assert(obj);//头插//*(void**)obj _freeLis…

Linux工具【2】(调试器gdb、项目自动化构建工具make/Makefile)

gdb、make/Makefile 引言调试器gdb介绍常用指令 自动化构建工具make/Makefile介绍使用依赖关系与依赖方法编辑Makefile伪目标 总结 引言 在上一篇文章中介绍了Linux中的编辑器vim与编译器gcc与g: 戳我看vim与gcc详解哦 在本篇文章中将继续来介绍Linux中的工具&…

js ajax 国内快速 映像

ajax 快速 映像 https://www.bootcdn.cn/ axios入门和axios基本请求方式 https://blog.csdn.net/m0_68997646/article/details/127438174 使用 jsDelivr CDN: <script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>因为我们国…

【Linux命令详解 | ssh命令】 ssh命令用于远程登录到其他计算机,实现安全的远程管理

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 连接远程服务器2. 使用SSH密钥登录2.1 生成密钥对2.2 将公钥复制到远程服务器 3. 端口转发3.1 本地端口转发3.2 远程端口转发 4. X11转发5. 文件传输与远程命令执行5.1 文件传输5.1.1 从本地向远程传输文件5.1.2 …

vue使用jsplumb 流程图

安装jsPlumb库&#xff1a;在Vue项目中使用npm或yarn安装jsPlumb库。 npm install jsplumb 创建一个Vue组件&#xff1a;创建一个Vue组件来容纳jsPlumb的功能和呈现。 <template><div style"margin: 20px"><div style"margin: 20px">&l…

图数据库_Neo4j和SpringBoot整合使用_创建节点_删除节点_创建关系_使用CQL操作图谱---Neo4j图数据库工作笔记0009

首先需要引入依赖 springboot提供了一个spring data neo4j来操作 neo4j 可以看到它的架构 这个是下载下来的jar包来看看 有很多cypher对吧 可以看到就是通过封装的驱动来操作graph database 然后开始弄一下 首先添加依赖

Python爬虫性能优化:多进程协程提速实践指南

各位大佬们我又回来了&#xff0c;今天我们来聊聊如何通过多进程和协程来优化Python爬虫的性能&#xff0c;让我们的爬虫程序6到飞起&#xff01;我将会提供一些实用的解决方案&#xff0c;让你的爬虫速度提升到新的高度&#xff01; 1、多进程提速 首先&#xff0c;让我们来看…

视频汇聚集中存储EasyCVR平台调用iframe地址视频无法播放,该如何解决?

安防监控视频汇聚平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝…

Java算法_ 检查对称树(LeetCode_Hot100)

题目描述&#xff1a;给你一个二叉树的根节点 &#xff0c; 检查它是否轴对称。root 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码 /*** 2 * Author: LJJ* 3 * Date: 2023/8/17 8:47* 4*/ public class SymmetricTree {static class…

C语言入门_Day 6布尔数与比较运算

目录 前言 1.布尔数 2.比较运算 3.易错点 4.思维导图 前言 除了算术计算以外&#xff0c;编程语言中还会大量使用比较运算&#xff0c;并会根据比较运算的结果是“真”还是“假”&#xff0c;来执行不同的代码。 当你想买一杯奶茶&#xff0c;准备支付的时候&#xff0c;支…

VisualStudio打包项目文件为.exe安装包

前言&#xff1a; 使用扩展&#xff1a;install Projects 注意事项&#xff1a;打包项目前&#xff0c;确保项目能正常运行&#xff0c;不然打包毫无意义。 一、安装扩展 打开vs软件->扩展->管理扩展->搜索install Projects->安装->重启软件 二、制作安装包&a…

【uni-app报错】获取用户收货地址uni.chooseAddress()报错问题

chooseAddress:fail the api need to be declared in …e requiredPrivateInf 原因&#xff1a; 小程序配置 / 全局配置 (qq.com) 解决&#xff1a; 登录小程序后台申请接口 按照流程申请即可 在项目根目录中找到 manifest.json 文件&#xff0c;在左侧导航栏选择源码视图&a…

postgresql 分组

postgresql 数据汇总 分组汇总聚合函数注意 总结 分组统计总结 高级分组总结 分组汇总 聚合函数 聚合函数&#xff08;aggregate function&#xff09;针对一组数据行进行运算&#xff0c;并且返回单个结果。PostgreSQL 支持以下常见的聚合函数&#xff1a; • AVG - 计算一…

小程序swiper一个轮播显示一个半内容且实现无缝滚动

效果图&#xff1a; wxml&#xff08;无缝滚动&#xff1a;circular"true"&#xff09;&#xff1a; <!--components/tool_version/tool_version.wxml--> <view class"tool-version"><swiper class"tool-version-swiper" circul…

树莓派+WordPress:打造专属博客,内网穿透轻松发布到公网!

概述 在本次教程里&#xff0c;我们将在树莓派上搭建一个Wordpress博客站点&#xff0c;开始博客时代&#xff0c;记录生活点滴。同时做内网穿透将博客发布上线&#xff0c;让互联网用户都可以访问到&#xff0c;无需公网ip&#xff0c;也无需购买云服务器&#xff0c;简单快速…

【系统架构设计专业技能 · 软件工程之系统分析与设计(二)【系统架构设计师】

系列文章目录 系统架构设计专业技能 软件工程&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;…

【【STM32----I2C通信协议】】

STM32----I2C通信协议 我们会发现I2C有两根通信线&#xff1a; SCL和SDA 同步 半双工 带数据应答 支持总线挂载多设备&#xff08;一主多从&#xff0c;多主多从&#xff09; 硬件电路 所有I2C设备的SCL连在一起&#xff0c;SDA连在一起 设备的SCL和SDA均要配置成开漏输出模式 …

msvcr120.dll丢失怎么修复,介绍几种最简单的修复方法

当您在运行某个程序时遇到msvcr120.dll丢失的错误提示时&#xff0c;可能无法正常启动或执行该程序。msvcr120.dll是Microsoft Visual C Redistributable中的一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它是一种运行时库&#xff08;Runtime Library&#xff0…

VMWARE15.5.7安装RedHat 7.9黑屏

在win7上面最高版本为vmware15.5.7 我安装后&#xff0c;安装成功了redhat5.5 但是因为操作系统有点老。安装其他软件时遇到问题。想改为7.0以上linux。 但是遇到了问题。安装时&#xff0c;一直黑屏。包括再安装5.5也是同样效果。 找了很多方案都无济于事。后面搜到一个方案…