C语言学习(二十六)---指针练习题(二)

在上节的内容中,我们进一步学习了有关指针的内容,并做了一些关于指针的题目,今天我们将继续练习一些指针的题目,以便大家更好的理解和掌握指针的知识,好了,话不多说,开整!!!

字符数组指针练习题(二)

在第一节的内容中,我们已经练习了字符数组的相关题目,当然了,我们当时是使用如下方式定义数组的:

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

在C语言学习(十一)讲的时候,我们不仅学习了字符数组的这种定义方式,同样还有另外一种定义方式,如下:

char arr[] = "abb";

并且两者有着一些区别,因此,有必要练习相应的题目。

sizeof题目

首先我们分析sizeof题目,代码如下所示:

#include<stdio.h>
int main()
{
    char arr[] = "abvctr";
    printf("%d\n",sizeof(arr));//
    printf("%d\n",sizeof(arr+0));
    printf("%d\n",sizeof(*arr));
    printf("%d\n",sizeof(arr+1));
    printf("%d\n",sizeof(arr[1]));
    printf("%d\n",sizeof(&arr));
    printf("%d\n",sizeof(*&arr));
    printf("%d\n",sizeof(&arr+1));
    printf("%d\n",sizeof(*&arr[0]));
    printf("%d\n",sizeof(&arr[0]+1));
    return 0;
}

在自行分析完毕后,再查看以下分析讲解:

#include<stdio.h>
int main()
{
    char arr[] = "abvctr";//此定义方式会 自动补充字符串结束标志\0
    printf("%d\n",sizeof(arr));//数组名默认为首元素地址,但两种情况除外,一个就是单独在sizeof内部,另一个就是&arr
    //特殊情况其代表了整个数组,一个字符一个字节,因此一共6+1=7个字节  \0也占一个字节
    printf("%d\n",sizeof(arr+0));//数组名默认为首元素地址,加0仍为首元素a的地址,地址则为4字节(32位)
    printf("%d\n",sizeof(*arr));//数组名默认为首元素地址,对其解引用,则为字符a,大小为1字节
    printf("%d\n",sizeof(arr+1));//首元素地址加1为数组中b的地址,地址则为4字节(32位)
    printf("%d\n",sizeof(arr[1]));//数组中第二个元素b的大小,字符类型,故1字节
    printf("%d\n",sizeof(&arr));//特殊情况2:此时数组名代表整个数组,&arr:取出整个数组的地址,地址则为4字节(32位)
    printf("%d\n",sizeof(*&arr));//整个数组解引用,故7字节
    printf("%d\n",sizeof(&arr+1));//整个数组的地址,加1仍是一个地址,地址则为4字节(32位)
    printf("%d\n",sizeof(*&arr[0]));//取出第一个元素的地址并解引用,则为字符a其大小为1字节
    printf("%d\n",sizeof(&arr[0]+1));取出第一个元素的地址,再加1为第二个元素b的地址,地址则为4字节(32位)
    return 0;
}

我们编译查看结果,结果如下:
在这里插入图片描述
由此可见,分析正确。

strlen题目

下面请分析以下代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[] = "abvctr";//此定义方式会 自动补充字符串结束标志\0
    printf("%d\n",strlen(arr));
    printf("%d\n",strlen(arr+0));
    printf("%d\n",strlen(*arr));
    printf("%d\n",strlen(arr+1));
    printf("%d\n",strlen(arr[1]));
    printf("%d\n",strlen(&arr));
    printf("%d\n",strlen(&arr+1));
    printf("%d\n",strlen(&arr[0]+1));
    return 0;
}

在分析结束后,再查看以下的参考分析:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[] = "abvctr";//此定义方式会 自动补充字符串结束标志\0
    //strlen:计算\0之前的字符的个数
    printf("%d\n",strlen(arr));//arr默认首元素地址,从该地址向后寻找 \0 因此,值为6
    printf("%d\n",strlen(arr+0));//arr默认首元素地址,加0还是首元素地址,从该地址向后寻找
    // \0 因此,值仍为6
    printf("%d\n",strlen(*arr));//arr默认首元素地址,对其解引用则为数组中的字符a,因此,将会以a对应的ASCII码值97
    // 作为开始,向后寻找\0,因此会报错
    printf("%d\n",strlen(arr+1));//arr默认首元素地址,加1则变为第二个元素的地址,从该地址向后寻找\0,因此结果为5
    printf("%d\n",strlen(arr[1]));//arr[1]代表字符b,因此,将会以b对应的ASCII码值98
    // 作为开始,向后寻找\0,因此会报错
    printf("%d\n",strlen(&arr));//&arr,即取到整个数组的地址,从该地址向后寻找\0,结果仍为6
    printf("%d\n",strlen(&arr+1));//从整个数组的最后一个元素指向的地址的下一个地址开始寻找\0,因此其为随机值
    printf("%d\n",strlen(&arr[0]+1));//arr[0]即首元素地址,再加1变为了第二个元素的地址,从该地址向后寻找\0,值为6-1=5
    return 0;
}

我们编译运行,结果如下:
在这里插入图片描述
可以看到程序中断了,我们在Linux下可以更清楚地看到错误,如下图:
在这里插入图片描述
我们将分析的两行错误代码进行注释,再编译运行:
在这里插入图片描述
可以看到,结果与我们分析的一致,以上便是字符数组的指针练习题。

常量字符串

在C语言学习(十九)时,我们学习了const修饰指针,大家忘了的话可以自行查看,那么如果我们使用const对字符指针变量进行修饰,并将一串字符赋值给该指针,就定义了常量字符串,内容不可更改,如下代码所示:

const char* p = "abvctr";

此时字符指针p指向的时字符数组abvctra所在位置的地址上,下面验证:
我们对p解引用并打印,可以看到其为字符a
在这里插入图片描述
在了解了常量字符串之后,我们再练习以下两题:

sizeof题目

请分析以下代码:

#include<stdio.h>
int main()
{
    const char* p = "abvctr";
    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));
    return 0;
}

在自行分析后,再查看以下内容:

#include<stdio.h>
int main()
{
    const char* p = "abvctr";
    printf("%d\n",sizeof(p));//p为指向字符数组中的a的指针,也即其地址,地址则为4字节
    printf("%d\n",sizeof(p+1));//p为指向字符数组中的a的指针,加1则指向b,仍为地址,4字节(32位)
    printf("%d\n",sizeof(*p));//对p解引用,则位字符a,1字节
    printf("%d\n",sizeof(p[0]));//p[0]代表字符a,字符占1字节
    printf("%d\n",sizeof(&p));//取出p的地址,地址则为4字节(32位)
    printf("%d\n",sizeof(&p+1));//p为首元素a的地址,&p:取出a的地址,再加1,则变为指向字符b的地址,4字节
    printf("%d\n",sizeof(&p[0]+1));//同上,4字节
    return 0;
}

编译运行结果,可以看到和我们分析的一样:
在这里插入图片描述

strlen题目

请看以下代码并分析结果:

#include<stdio.h>
#include<string.h>
int main()
{
    const char* p = "abvctr";
    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;
}

在分析完后,再查看以下分析:

#include<stdio.h>
#include<string.h>
int main()
{
    const char* p = "abvctr";
    printf("%d\n",strlen(p));//从p指向的地址开始,向下寻找\0,因此值为6
    printf("%d\n",strlen(p+1));//p+1:从p开始的下一个地址开始寻找\0,因此值为5
    printf("%d\n",strlen(*p));//对p解引用,则为字符a,以字符a对应的ASCII码值97作为地址,向下寻找\0,将会报错
    printf("%d\n",strlen(p[0]));//p[0]代表字符a,以字符a对应的ASCII码值97作为地址,向下寻找\0,将会报错
    printf("%d\n",strlen(&p));//&p代表整个常量字符串的地址,从此地址开始向下找\0,结果为随机值
    printf("%d\n",strlen(&p+1));//从常量字符串结束地址的下一个地址开始,向下寻找\0,将会是随机值
    printf("%d\n",strlen(&p[0]+1));//p[0]代表字符数组中的字符a,&p[0]代表取出该地址,再加1代表b的地址,
    //从此地址开始向下找\0,值将为5
    return 0;
}

不注释错误代码的前提下编译运行,程序会崩溃,如下所示:
在这里插入图片描述
Linux下可以更清楚的看到错误,如下图所示:
在这里插入图片描述
我们将错误代码注释,再次编译运行,可得以下结果:
在这里插入图片描述

可以发现,和我们的分析结果一致

上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GreasyFork+Github

GreasyForkGithub 好长时间没用 GreasyFork 了&#xff0c;最近在刷 Spring Boot 的各种知识点&#xff0c;其中很大时间都在学习 baeldung.com 这个站点。不知道是因为最近刷的勤了还是怎么的&#xff0c;这个网站经常会弹出一个“让我关闭广告阻拦插件”的提示框&#xff0c…

MongoDB集群管理(三)

MongoDB集群管理 集群介绍 为什么使用集群 随着业务数据和并发量的增加&#xff0c;若只使用一台MongoDB服务器&#xff0c;存在着断电和数据风险的问题&#xff0c;故采用Mongodb复制集的方式&#xff0c;来提高项目的高可用、安全性等性能。 MongoDB复制是将数据同步到多个…

超简单 display:flex教学

display 弹性盒子解释 Flex是Flexible Box的缩写&#xff0c;意为"弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 它的作用&#xff1a; 它能够更加高效方便的控制元素的对齐、排列。 可以自动计算布局内元素的尺寸&#xff0c;无论这个元素的尺寸是固定的还是…

学习mysql

Mysql SQL语言的规则与规范SQL大小写规范注释数据导入指令 基本的SELECT语句SELECT.列的别名去掉重复行空值参与运算着重号(当有表名是关键字时)显示表结构where 运算符算术运算符 比较运算符号性运算符非符号形运算符空运算符非空运算符最小值运算符最大值运算符BETWEEN AND运…

Java的理论知识部分

文章目录 前言 一、Java的发展 1.1、Java的出现 1.2、Java官方网址 1.3、Java的平台 1.4、Java各版本新加的内容 1.5、java特点 1.6、Java的三种运行机制 1.7、Java的编译与运行 1.8、补充内容——华为鲲鹏jdk以及鲲鹏计算 二、面向对象程序编程 2.1、对象与类 2.2、Ja…

软考:软件工程:面向对象技术与UML,时序图,用例图,类对象,封装,继承,多态

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

Web3 将 MetaMask添加入谷歌浏览器 扩展程序中

Web3到现在理论这段是说的有点太多了 那么 我们先来看个东西 叫 MetaMask 这个在我们项目开发过程中需要使用 MetaMask是一个开源的以太坊的一个钱包 那么 钱包肯定就是用来管理数据资产的 MetaMask 是以一个浏览器插件形式存在的 它可以直接连接到以太坊的网络中来管理我们…

【软件工程】软件工程期末考试试卷

瀑布模型把软件生命周期划分为八个阶段&#xff1a;问题的定义、可行性研究、软件需求分析、系统总体设计、详细设计、编码、测试和运行、维护。八个阶段又可归纳为三个大的阶段&#xff1a;计划阶段、开发阶段和( C)。 A、详细计划 B、可行性分析 C、 运行阶段 D、 测试与排…

【运维】服务器系统安装 -- 服务器版

目录 一、环境 二、ubuntu 三、启动u盘制作 Stage 1&#xff1a;下载balena&#xff0c;制作U盘启动工具 Stage 2&#xff1a;下载Ubuntu 系统镜像&#xff08;参考上一节&#xff1a;Ubuntu 22.04.2 LTS &#xff09; Stage 3&#xff1a;将镜像写入到U盘 四、设置开启…

【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 战斗背景&#xff1a;做了个串口接收界面&#xff0c;用来接收传输过来的信号。但是光用数字显示太单调&#xff0c;需要用图线显示出来。 战略目标&#x…

腾讯云服务器镜像市场快速搭建WordPress博客网站教程

通过腾讯云服务器的镜像市场搭建WordPress网站非常简单&#xff0c;不需要手动配置WP所需的Web环境&#xff0c;一键即可安装WordPress博客&#xff0c;腾讯云百科使用腾讯云服务器通过镜像市场的WordPress镜像搭建WP网站教程&#xff1a; 目录 腾讯云服务器通过市场镜像安装…

计算机网络和Linux网络

计算机网络和Linux网络 计算机网络概论 什么是计算机网络 计算机网络&#xff08;结构上&#xff09; 由节点&#xff08;主机、网络交换设备设备&#xff09;、边&#xff08;通信设备&#xff09;、协议构成协议&#xff1a;对等层的实体在通讯过程中应该遵守的规则的集合&…

上位机与两台PLC之间无线以太网通信

本文以组态王和2台三菱FX5u PLC为例&#xff0c;介绍组态王与多台 PLC的无线以太网通信实现过程。在本方案中采用了三菱PLC无线通讯终端DTD419MB&#xff0c;作为实现无线通讯的硬件设备。 在这一无线以太网通讯系统的搭建中&#xff0c;用户无需更改网络参数和原有程序&#…

Docker-compose的使用

目录 Docker-compose 简介 docker-compose的安装 docker-compose.yaml文件说明 compose的常用命令 总结 Docker-compose 简介 Docker-compose 是用于定义和运行多容器的 Docker 应用程序的工具。可以使用YAML文件来配置应用程序的服务。&#xff08;通俗讲是可以通过yml文…

【算法与数据结构】18、LeetCode四数之和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题的解法借助了【算法与数据结构】15、LeetCode三数之和的算法思想。首先我们进行排序&#xff0c;然…

数仓工具Hive 概述

Hive Hive简介Hive架构HiveSQL语法不同之处建表语句查询语句 Hive查看执行计划Hive文件格式 Hive简介 Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 通过Hive可以将mapred…

JVM的内容

0、Java基础考点 1、谈谈你对Java的理解 平台无关性(一次编译&#xff0c;到处运行)GC(垃圾清理)语言特性(泛型、反射)面向对象(封装、继承、多态)类库异常处理 2、Java是如何实现平台无关性的(一处编译&#xff0c;到处运行) 编译时&#xff08;语法和语义进行检测&#xf…

c#网编实验五--WCF和TCP消息通信实验

分别编写服务端和客户端程序&#xff0c;利用基于WCF的TCP技术&#xff0c;实现在线聊天功能&#xff0c;完成在线用户列表管理&#xff0c;消息发送、接收的功能。 在同一个解决方案中&#xff0c;分别编写服务端程序和客户端程序&#xff0c;利用TCP实现简单的群聊功能。 具…

校园wifi网页认证登录入口

很多校园wifi网页认证登录入口是1.1.1.1 连上校园网在浏览器写上http://1.1.1.1就进入了校园网 使 用 说 明 一、帐户余额 < 0.00元时&#xff0c;帐号被禁用&#xff0c;需追加网费。 二、在计算中心机房上机的用户&#xff0c;登录时请选择新建帐号时给您指定的NT域&…

TOGAF10®标准中文版--(阶段C —数据架构阶段B )方法

6.5 方法 6.5.1 数据结构 数据架构应该能够处理&#xff1a; 静态数据——存储中的数据动态数据——事务或服务/API 中的数据使用中的数据——应用边界的数据&#xff08;例如&#xff0c;GUI&#xff09;开放数据——组织提供给公众使用并且自愿或合法要求提供的数据 将添…