c语言修炼之指针和数组笔试题解析(1.2)

前言:

书接上回,让我们继续开始今天的学习叭!废话不多说,还是字符数组的内容上代码!

char *p是字符指针,*表示p是个指针,char表示p指向的对象类型是char型!

char*p="abcdef";

 当我们把字符串abcdef的地址存放在p中时,p是存了整个字符串还是之存了a的地址呢?这得对代码进行调试啦

此时我们会发现p中的地址也就是字符串中a的地址!让我们继续开始学习啦

int main()
{char* p = "abcdef";printf("%d\n", sizeof(p));printf("%d\n", sizeof(p + 1));printf("%d\n", sizeof(*p));printf("%d\n", sizeof(p[0]));printf("%d\n", sizeof(&p));printf("%d\n", sizeof(&p + 1));printf("%d\n", sizeof(&p[0] + 1));printf("%d\n", strlen(p));printf("%d\n", strlen(p + 1));printf("%d\n", strlen(*p));printf("%d\n", strlen(p[0]));printf("%d\n", strlen(&p));printf("%d\n", strlen(&p + 1));printf("%d\n", strlen(&p[0] + 1));return 0;
}

开始分析叭

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

p中存放的是a的地址,sizeof(p)求的是地址的大小,地址的大小是4/8个字节大小

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

p指向字符串中a的地址,p+1则指向字符串中b的地址,sizeof(p+1)求的是地址的大小,地址大小是4/8个字节大小

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

 p指向字符串中a的地址,*p指的是a,sizeof(*p)-->sizeof(a)所以大小为1字节

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

p[0]-->*(p+0)-->*(p),p中存放的是a的地址,所以*p指向a,sizeof(p[0])计算的是sizeof(a)的大小,结果为1

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

p中存放的是字符串的地址,p的类型为char*,p本身也有地址,其类型为char**!所以sizeof(&p)计算的也是地址的大小,其结果为4/8

 接着来分析下一个代码叭

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

&p将p的地址取出在进行加1,具体的地址是啥咱也不知道,但有一点可以确定的就是sizeof(&p+1)计算的是地址的大小,地址大小是4/8个字节大小

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

&(*p+0)-->p的地址,&p[0]+1得到的是字符串中b的地址,所以此时sizeof计算的是地址的大小,地址大小是4/8字节。通过调试代码可以发现确实是b的地址

接下来我们用strlen来,上代码 !还记得strlen的特点吗?计算遇\0之前的字符个数,字符串会隐藏一个\0

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

p依旧是指向字符串中a的地址,strlen在计算时从a的地址开始一直到遇到\0,那么此时的计算结果为6个字节

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

p依旧是指向字符串中a的地址,因此p+1指向的是字符串中b的地址,此时strlen在计算时从b的地址开始计算一直到遇\0,此时计算结果为5

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

p依旧是指向字符串中a的地址,*p得到的就是a,还记得在上一篇中说的吗,strlen需要的参数是const char*类型的地址而不是字符a,因此strlen(*p)得到的结果是error

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

 p[0]-->*(p+0)-->*p-->a,解释同上,结果为error

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

 strlen(&p)虽然里面计算的也是地址,但是我们不知道会在什么时候遇到\0,因此此时的结果为随机值

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

strlen(&p+1)即使经行加1了,还是不知道啥时候会遇到\0,结果还是随机值

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

&p[0]-->&*(p+0)-->p,p中存放的是a的地址,因此&p[0]+1此时指向字符串b中的地址,strlen(&p[0]+1)的计算结果为5字节

欧克,解析完毕,一起来运行代码看看叭,当然啦结果错误的咱就不运行啦

 以上有关于一维数组的题我们就讲解完毕啦,接下来开始二维数组的题目讲解,还记得二维数组的知识吗?二维数组的行和列都是从0开始的,以int a[3][4]为例,这个二维数组的类型是int [3][4],二维数组在内存中的存储是连续的,二维数组的行可以省略不写,但是列不可以省略!二维数组可以理解为一维数组的数组!一维数组的写法是int a[3]即数组名+[ ],二维的写法是int a[3][4]可以将int a[3]看作是数组名,也可以写为数组名+[ ]!将二维的每一行看成一维的元素

接下来继续看看代码叭!

int main()
{	int a[3][4] = { 0 };printf("%d\n", sizeof(a));printf("%d\n", sizeof(a[0][0]));printf("%d\n", sizeof(a[0]));printf("%d\n", sizeof(a[0] + 1));printf("%d\n", sizeof(*(a[0] + 1)));printf("%d\n", sizeof(a + 1));printf("%d\n", sizeof(*(a + 1)));printf("%d\n", sizeof(&a[0] + 1));printf("%d\n", sizeof(*(&a[0] + 1)));printf("%d\n", sizeof(*a));printf("%d\n", sizeof(a[3]));
}

 int a[3][4]是一个三行四列的二维数组,每个元素是int型,总共有12个元素

开始分析叭!先来第一个代码! 

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

sizeof(数组名)计算的是整个数组的大小,一共有12个元素一个元素的大小为4字节,所以整个数组的大小是48字节

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

a[0]是二维数组的一行,a[0][0]是第一行的第一个元素,sizeof(a[0][0])-->sizeof(int),其计算结果为4

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

a[0]是二维数组的第一行,sizeof(a[0])计算的是整个第一行数组的大小,一行有4个元素,所以整个第一行的大小为16字节大小

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

sizeof(a[0]+1),由于不是单独放在sizeof内部,因此a[0]表示的是数组首元素的地址。a[0]+1表示的是二维数组第一行的第二个元素的地址,sizeof(a[0]+1)计算的是地址的大小,地址大小是4/8个字节大小

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

上面我们分析出a[0]+1表示的是二维数组第一行的第二个元素的地址,所以*(a[0]+1)表示的是一个二维数组第一行第二个元素,sizeof计算的是元素大小,其结果为4字节

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

由于数组名不是单独放在sizeof内部,因此此时数组名表示的是数组首元素的地址,a+1表示数组第二个元素的地址,即二维数组第二行的地址,sizeof计算地址的大小,其结果为4/8

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

 由上面可得a+1表示数组第二个元素的地址,即二维数组第二行的地址,对其进行解引用得到第二行整个数组大小,其结果为16

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

a[0]表示二维数组的第一行数组,&a[0]取出二维数组第一行数组的整个地址,&a[0]+1得到二维数组第二行的地址。sizeof此时计算的还是地址的大小,结果为4/8

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

&a[0]取出二维数组第一行数组的整个地址,&a[0]+1得到二维数组第二行的整个地址,对其经行解引用再计算其大小,结果为16字节

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

a不是单独放在sizeof内部,因此此时a表示数组首元素的地址,二维数组首元素地址a[0],对其经行解引用得到整个第一行数组的大小,sizeof对其进行计算,得到结果为16字节

 最后一道题啦

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

 哦豁,a[3]?这个二维数组也才3行,计算a[3]的大小会不会越界访问呐?不会哒,这里酱酱们可以放心去计算呐!一般来说代码要进行编译+运行才会形成可执行文件,sizeof在编译阶段就计算好结果,因此不会造成越界访问的情况!sizeof(a[3])就计算的是整个数组的大小,其结果为16字节大小

运行一下代码看看结果叭

 3.指针部分

 上代码!

int main()
{int a[5] = { 1, 2, 3, 4, 5 };int* ptr = (int*)(&a + 1);printf("%d,%d", *(a + 1), *(ptr - 1));return 0;
}
//程序的结果是什么?

 数组a是一个一维数组里面存放了五个元素,&a取出的是整个数组的地址此时应该用数组指针来接收,但这里将其强制类型转化为int*类型。

 a表示数组首元素的地址,a+1表示数组第二个元素 的地址,*(a+1)表示数组第二个元素2,int*ptr=(int*)(&a+1),ptr的指向和&a+1的指向一致,ptr-1此时指向a[4]的地址,对其进行解引用得a[4]-->5,所以这道题的答案为2 ,5。运行一下代码看

 


今天的学习就到这啦,明天继续噢!

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

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

相关文章

使用Plist编辑器——简单入门指南

本指南将介绍如何使用Plist编辑器。您将学习如何打开、编辑和保存plist文件,并了解plist文件的基本结构和用途。跟随这个简单的入门指南,您将掌握如何使用Plist编辑器轻松管理您的plist文件。 plist文件是一种常见的配置文件格式,用于存储应…

7.6Java EE——Bean的生命周期

Bean在不同作用域内的生命周期 Bean的生命周期是指Bean实例被创建、初始化和销毁的过程。在Bean的两种作用域singleton和prototype中,Spring容器对Bean的生命周期的管理是不同的。在singleton作用域中,Spring容器可以管理Bean的生命周期,控制…

vue父组件和子组件数据传递

vue --父组件向子组件传递数据 父组件&#xff1a; <template><div class"parent"><p>父组件&#xff1a;{{ msg }}</p><Child message"Hello, I am parent!"></Child></div> </template><script>…

【Linux】udp客户端windows版以及Tcp服务器的实现

windows版客户端更适合大多数人~ 文章目录 一. udp客户端windows版二.Tcp服务器的实现总结 一、udp客户端windows版 首先我们将上一篇文章中实现的udp大型聊天室的代码进行修改&#xff0c;注意我们只修改服务端代码将代码修改的很简单就好&#xff0c;因为我们只是做一个如何…

【Flume 01】Flume简介、部署、组件

1 Flume简介 Flume是一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统 主要特性&#xff1a; 它有一个简单、灵活的基于流的数据流结构&#xff08;使用Event封装&#xff09;具有负载均衡机制和故障转移机制一个简单可扩展的数据模型(Source、Channel、Sink) Sou…

Zookeeper的基本概念以及安装

Zookeeper简介 Zookeeper是一个分布式的(多台机器同时干一件事情),开源的分布式应用程序协调服务,是Google公司Chubby产品,是Hadoop和Base重要的组件,.它是一个分布式应用程序提供一致性的服务的软件,提供的功能包括:配置服务,域名服务,分布式同步,组服务等 Zookeeper目…

多肽试剂1801415-23-5,Satoreotide,UNII-S58172SSTS,应用在多肽标记及修饰上

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ Satoreotide&#xff0c;UNII-S58172SSTS Product structure Product specifications 1.CAS No&#xff1a;1801415-23-5 2.Molecular formula&#xff1a;C58H72ClN15O14S2 3.Molecular weight&#xff1a;1302.9 4.Packa…

手机word文档怎么转换成pdf?分享两种方法

手机word文档怎么转换成pdf&#xff1f;在如今信息化的时代&#xff0c;电子文档已经成为人们日常办公不可或缺的一部分。随着科技的不断进步&#xff0c;电子文档的格式也在不断发展。PDF作为电子文档的一种重要格式&#xff0c;被广泛使用。那么&#xff0c;如何将手机上的Wo…

一)Stable Diffusion使用教程:安装

目前AI绘画最火的当属Midjorney和Stable Diffusion&#xff0c;但是由于Midjourney没有开源&#xff0c;因此我们主要分享下Stable Diffusion&#xff0c;后面有望补上Midjourney教程。 本节主要讲解Stable Diffusion&#xff08;以下简述SD&#xff09;的下载和安装。 1&…

MyBatis学习笔记——2

MyBatis学习笔记——2 一、MyBatis核心配置文件详解1.1、environment&#xff08;环境&#xff09;1.2、transactionManager&#xff08;事务管理器&#xff09;1.3、dataSource&#xff08;数据源&#xff09;1.4、properties1.5、mapper 二、在WEB中应用MyBatis&#xff08;使…

轮播图添加删除

轮播图页面和对话框搭建 页面简单布局 <template><div id"banner"><el-space direction"vertical" :size"20" style"width: 100%"><h1>轮播图管理</h1><div style"text-align: right"&g…

商城-学习整理-基础-分布式组件(三)

目录 一、前言二、Spring Cloud&Spring Cloud Alibaba1、Spring Cloud 与Spring Cloud Alibaba简介2、为什么使用Spring Cloud Alibaba3、版本选择4、项目中的依赖 三、Spring Cloud Alibaba-Nacos作为注册中心1、Nacos1&#xff09;、下载 nacos-server2&#xff09;、启动…

42. 接雨水

42.接雨水 这是一个简单的动态规划问题&#xff0c;虽然leetcode将它归结为困难。 但是我感觉它难度应该达不到&#xff0c;可能归结为中等比较合适0x1 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨…

python flask 返回中文乱码

使用flask返回数据中带有中文的时候会显示成乱码(ascii)&#xff0c; 中文报文&#xff1a; ABAP中的三大财务报表是&#xff1a;* **资产负债表** * **收入证明** * **现金流量表**这些报表全面概述了公司的财务状况和业绩。* **资产负债表**显示公司在特定时间点的资产、负…

【Python数据分析】Python基础知识篇

&#x1f389;欢迎来到Python专栏~Python基础知识篇 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大…

LeetCode[1508]子数组和排序后的区间和

难度&#xff1a;Medium 题目&#xff1a; 给你一个数组 nums &#xff0c;它包含 n 个正整数。你需要计算所有非空连续子数组的和&#xff0c;并将它们按升序排序&#xff0c;得到一个新的包含 n * (n 1) / 2 个数字的数组。 请你返回在新数组中下标为 left 到 right &#…

将请求参数数据推送至RabbitMQ队列中并且捕捉消息没有到达交换机的异常

1&#xff1a;自定义mq信息类&#xff08;我的交换这些信息都从nacos上直接取的&#xff0c;怎么从nacos取配置信息看上篇文章&#xff09;&#xff1a; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;impo…

GB2312编码

说明 GB2312代码表用两个字节表示一个图形字符&#xff0c;两个字节中前面的字节为第一字节&#xff0c;后面的字节为第二字节。 区位码&#xff1a; GB2312代码表分成94个区&#xff0c;范围为1-94&#xff0c;区的编号由第一字节表示&#xff1b;每个区有94位&#xff0c;范…

AE 3D粒子插件trapcode particular 新版本

Trapcode Particular for Mac是目前AE系列的插件中最火爆最流行的一款三维粒子插件&#xff0c;是属于Red Giant Trapcode Suite&#xff08;红巨人粒子特效套装插件&#xff09;中的一款粒子插件。该软件提供了多达一百余种粒子效果供用户使用&#xff0c;可以产生各种各样的自…

【mac系统】mac系统调整妙控鼠标速度

当下环境&#xff1a; mac系统版本&#xff0c;其他系统应该也可以&#xff0c;大家可以自行试下&#xff1a; 鼠标 mac妙控鼠标&#xff0c;型号A1657 问题描述&#xff1a; 通过mac系统自带的鼠标速度调节按钮&#xff0c;调到最大后还是感觉移动速度哦过慢 问题解决&…