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

news2025/1/11 11:07:40

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

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

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

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下可以更清楚的看到错误,如下图所示:
在这里插入图片描述
我们将错误代码注释,再次编译运行,可得以下结果:
在这里插入图片描述

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

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

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

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

相关文章

【c++11】 左值引用和右值引用

c11特性 右值引用左值引用和右值引用左值引用右值引用比较 右值引用的应用左值引用的短处右值引用解决问题移动构造 STL的改动move()函数结语 右值引用 c从出现就有着引用的语法&#xff0c;但是在c11后又新增了右值引用的新特性&#xff0c;以往所学的引用成了左值引用。非左…

代码随想录算法训练营第四十二天| 背包问题

标准背包问题 有n件物品和一个最多能背重量为w 的背包。 第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 举一个例子&#xff1a; 背包最大重量为4。 物品为&#xff1a; 重量价…

5.2.3目录与文件之权限意义

现在我们知道了Linux系统内文件的三种身份&#xff08;拥有者、群组与其他人&#xff09;&#xff0c;知道每种身份都有三种权限&#xff08;rwx&#xff09;&#xff0c; 已知道能够使用chown, chgrp, chmod去修改这些权限与属性&#xff0c;当然&#xff0c;利用ls -l去观察文…

《C++高级编程》读书笔记(十:揭秘继承技术)

1、参考引用 C高级编程&#xff08;第4版&#xff0c;C17标准&#xff09;马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门&#xff0c;笔记链接如下 21天学通C读书笔记&#xff08;文章链接汇总&#xff09; 1. 使用继承构建类 1.1 扩展类 当使用 C 编写类定义时&#xf…

WMS中Choreographer 配合 VSYNC 中断信号

WMS中Choreographer 配合 VSYNC 中断信号 1、了解SurfaceFlinger中VSYNC信号刷新2、Choreographer 舞蹈编导2.1 Choreographer初始化2.2 FrameHandler中处理任务2.3 FrameDisplayEventReceiver初始化3.4 简易流程图 3、ViewRootImpl中scheduleTraversals3.1 postCallback 通过n…

java——IO与NIO

文章目录 1. 传统IO模型字节流字符流 2. NIO模型 Java中的IO&#xff08;输入输出&#xff09;是用于在程序中读取和写入数据的一种机制。Java提供了两种不同的IO模型&#xff1a;传统的IO模型和NIO&#xff08;New IO&#xff09;模型。 1. 传统IO模型 在传统的IO模型中&…

WPF本地化/国际化,多语言切换

之前写过winformwinform使用本地化&#xff0c;中英文切换_winform 中英文切换_故里2130的博客-CSDN博客 基本的技术差不多&#xff0c;但是后来又发现了一个ResXManager工具&#xff0c;可以更好方便快捷的使用。 首先下载&#xff0c;网络不好的话&#xff0c;去官网下载&a…

01背包简介

01背包问题&#xff08;0/1 Knapsack problem&#xff09;是一个经典的动态规划问题&#xff0c;它描述了在给定容量限制的情况下&#xff0c;如何选择一组物品放入背包&#xff0c;以使得物品的总价值最大化。 问题描述&#xff1a; 假设有一个背包&#xff0c;其容量为C。现…

VulnHub项目:Fawkes

1、靶机地址 HarryPotter: Fawkes ~ VulnHub 该篇为哈利波特死亡圣器系列最终部&#xff0c;也是最难的一个靶机&#xff0c;难度真的是逐步提升&#xff01;&#xff01;&#xff01; 2、渗透过程 确认靶机IP&#xff0c;kali IP&#xff0c;探测靶机开放端口 详细的扫描…

ICLR 23 | 工业视觉小样本异常检测最新网络:Graphcore

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://openreview.net/pdf?idxzmqxHdZAwO 论文代码&#xff1a;尚未开源 1.背景 随着人工智能中深度视觉检测技术的快速发展&#xff0c;检测工业产品表面的异常/缺陷受到了前所未有…

scratch lenet(11): C语言实现 squashing function

文章目录 1. 目的2. Sigmoidal Function2.1 S2 用到 Sigmoidal Function2.2 Sigmoidal Function 的定义 3. Squashing Function3.1 改用 Sigmoid Suahsing function 术语3.2 具体到 hyperlolic tangent 这一 squahsing function 4. Squahsing function 的实现References 1. 目的…

设计模式之观察者模式笔记

设计模式之观察者模式笔记 说明Observer(观察者)目录观察者模式示例类图抽象主题角色类抽象观察者类具体主题角色类具体的观察者角色类测试类 说明 记录下学习设计模式-观察者模式的写法。JDK使用版本为1.8版本。 Observer(观察者) 意图:定义对象间的一种一对多的依赖关系&a…

Gradle构建系统macOS安装与使用

1.打开gradle.org并点击安装 2.先决条件 ,确认安装JDK1.8或者更高版本已安装 在终端输入brew install gradle进行安装 安装成功如下: 查看安装版本号gradle -v 使用gradle 1.创建目录demo并进入该目录 mkdir demo cd demo 2.gradle init 使用Gradle开始构建 输入2开始构建应…

DevOps系列文章之 docker插件实现多实例部署(IDEA插件)

1. Docker的安装以及开启远程访问 1.1 安装 # 检查虚拟机内核版本&#xff0c;必须是3.10及以上 uname -r # 安装docker yum install docker # 输入y确认安装 # 启动docker systemctl start docker # 查看docker版本 docker -v # 开机启动docker systemctl enable docker # 停…

Golang学习日志 ━━ gin-vue-admin换机重新配置的记录,很愚蠢,很傻瓜,很机械...自己使用

最近一直在弄AI&#xff0c;没时间搞gva&#xff0c;所以有点忘记了&#xff0c;代码升级管它呢&#xff0c;全部重来一遍~ 一、备份保存 根据经验和个人喜好&#xff0c;我特别不喜欢在框架下把一个应用分散在module、api、service等等目录下&#xff0c;这种目录分配方案将把…

图上作业法

目录 交通示意图的表示方法 图上作业法 &#xff08;1&#xff09;对流 &#xff08;2&#xff09;迂回 物资调运问题的图上作业法 交通路线不成圈 交通路线成圈 交通示意图的表示方法 交通示意图是用来表明收发点的大致位置、收发量、交通路线长度的图形。 图形表示…

java mail发送、接收邮件

java mail接收邮件 1、引入java mail依赖 <dependency><groupId>org.eclipse.angus</groupId><artifactId>angus-mail</artifactId><version>2.0.2</version> </dependency>2、编写代码 注意&#xff1a;下述代码中的服务器…

从BNO055传感器获取IMU数据-2

在前面的文章 从BNO055传感器获取IMU数据-1 中介绍了BNO055传感器&#xff0c;今天继续讲解应用示例。 传感器与Arduino接口 我从某宝购买了固定在带有支持组件的开发板上的 BNO055 传感器。从 Digi-Key 或贸泽购买 BNO055 并将其焊接到 7.54.4mm 28 引脚 LGA 至 DIP 转换器上…

Groovy基础

Groovy基础 学Groovy有什么用&#xff1f;&#xff1f;&#xff1f;一、Groovy简介二、Mac安装Groovy1、使用homebrew安装或官网下载2、配置环境变量3、重新加载环境变量 二、Groov基本语法三、更多特性和扩展四、Groovy简单使用1、Groovy中的字符串及三大语句结构2、Groovy类与…