指针和数组的相关练习题

2023-10-26

目录

一、一维数组

 二、字符数组

三、二维数组


注意:假设本练习题所用的VS编译器是64位平台下的。

首先要明白数组名的意义:

1、sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

2、&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

3、除此之外所有的数组名都表示首元素的地址。

一、一维数组

int main()
{
	int arr[] = { 3,0,8,17,9,54 };
	printf("%d\n", sizeof(arr));
	//答案是24,这里的数组名表示整个数组,sizeof(arr)计算的是整个数组的大小,即4×6=24
	printf("%d\n", sizeof(arr + 0));
	//答案是8,这里的arr没有单独存放在sizeof内部,也没有取地址,则表示数组首元素地址,arr+0表示跳过0个int类型的变量,仍然还是首元素地址,是地址大小就为8个字节
	printf("%d\n", sizeof(*arr));
	//答案是4,arr表示首元素地址,*arr解引用之后就为首元素,大小是4个字节,*arr->*&arr[0]->arr[0]
	printf("%d\n", sizeof(arr + 1));
	//答案是8,arr+1跳过一个int类型的变量,表示第二个元素的地址,是地址大小就为8个字节
	printf("%d\n", sizeof(arr[1]));
	//答案是4,arr[1]表示第二个元素,大小是4个字节
	printf("%d\n", sizeof(&arr));
	//答案是8,&arr这里的arr表示整个数组,取出的是整个数组的大小,&arr即表示整个数组的地址,是地址大小就为8
	printf("%d\n", sizeof(*&arr));
	//答案是24,&arr表示整个数组的地址,*对其解引用找到的是整个数组,大小是4×6=24个字节,&arr是数组指针,类型是int(*)[6],数组指针解引用找到的是数组
	printf("%d\n", sizeof(&arr + 1));
	//答案是8,&arr+1表示跳过整个数组的地址,最终结果还是地址,大小是8个字节,&arr+1是从数组arr的地址向后跳过了一个(6个整型元素)数组的大小
	printf("%d\n", sizeof(&arr[0]));
	//答案是8,&arr[0]表示第一个元素的地址,是地址大小就是8个字节
	printf("%d\n", sizeof(&arr[0] + 1));
	//答案是8,&arr[0]+1表示第二个元素的地址,大小是8
	return 0;
}

运行结果:

 二、字符数组

int main()
{
	char arr[] = { 'x','y','z','p','q','r','m','n','k'};
	printf("%d\n", sizeof(arr));
	//答案是9,这里arr表示整个数组,计算的是整个数组的大小,即1×9=9
	printf("%d\n", sizeof(arr + 0));
	//答案是8,arr表示数组首元素地址,arr+0表示跳过0个char类型的变量,还是首元素地址,是地址大小就是8
	printf("%d\n", sizeof(*arr));
	//答案是1,*表示解引用,*arr就表示首元素,大小是1,*arr->*(arr+0)->arr[0]
	printf("%d\n", sizeof(arr[1]));
	//答案是1,arr[1]表示第二个元素,大小是1
	printf("%d\n", sizeof(&arr));
	//答案是8,&arr表示整个数组的地址,是地址大小就是8
	printf("%d\n", sizeof(&arr + 1));
	//答案是8,&arr+1是跳过了一个(9个字符型元素)的数组后的地址,大小是8
	printf("%d\n", sizeof(&arr[0] + 1));
	//答案是8,&arr[0]+1表示跳过一个char型变量的地址,即第二个元素的地址,大小是8
	return 0;
}

运行结果:

 补充:sizeof是操作符,只关注占用内存空间的大小,不在乎内存中放的是什么

strlen是库函数只针对字符串,strlen是求字符串长度的,关注的是字符串中的\0,计算的是\0之前出现的字符个数

 strlen函数的参数是指针类型的

 例如这样的语句就会编译错误,因为strlen的参数不是指针类型。

 

#include<string.h>
int main()
{
	char arr[] = { 'x','y','z','p','q','r','m','n','k' };
	printf("%d\n", strlen(arr));
	//答案是随机值,arr表示整个数组,strlen(arr)计算的是整个数组的字符串长度,但数组后面不知道什时候才能遇到\0
	printf("%d\n", strlen(arr + 0));
	//答案是随机值,arr表示首元素地址,arr+0跳过0个char类型的变量,还是首元素地址,但首元素后面不知道什么时候遇到\0
	//printf("%d\n", strlen(*arr));
	//printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	//答案是随机值,因为不知道后面什么时候遇到\0
	printf("%d\n", strlen(&arr + 1));
	//答案是上一行语句随机值的情况下-9,同样也是不知道后面什么时候遇到\0
	printf("%d\n", strlen(&arr[0] + 1));
	//答案是54行语句的随机值-1,因为后面不知道什么时候遇到\0
	return 0;
}

运行结果:

int main()
{
	char arr[] = "xyz";//这里的字符串中包含了\0,即字符串中的字符元素是x y z \0
	printf("%d\n", sizeof(arr));
	//答案是4,这里包含有\0,整个数组的大小便是4
	printf("%d\n", sizeof(arr + 0));
	//答案是8,arr+0仍然是首元素的地址,是地址大小便是8
	printf("%d\n", sizeof(*arr));
	//答案是1,*arr表示首元素
	printf("%d\n", sizeof(arr[1]));
	//答案是1
	printf("%d\n", sizeof(&arr));
	//答案是8
	printf("%d\n", sizeof(&arr + 1));
	//答案是8
	printf("%d\n", sizeof(&arr[0] + 1));
	//答案是8,&arr[0]+1表示第二个元素的地址
	return 0;
}

 运行结果:

 

#include<string.h>
int main()
{
	char arr[] = "xyz";//这里的字符串中包含了\0,即字符串中的字符元素是x y z \0
	printf("%d\n", strlen(arr));
	//答案是3,\0之前出现了3个字符
	printf("%d\n", strlen(arr + 0));
	//答案是3,arr+0仍然表示首元素地址
	//printf("%d\n", strlen(*arr));
	//printf("%d\n", strlen(arr[1]));
	//此处的*arr和arr[1]都不是指针类型
	printf("%d\n", strlen(&arr));
	//答案是3,见图解
	printf("%d\n", strlen(&arr + 1));
	//答案是随机值,见图解
	printf("%d\n", strlen(&arr[0] + 1));
	//答案是2,从第二个元素开始到\0读取2个字符串
	return 0;
}

102行、104行语句图解:

 运行截图:

 

int main()
{
	char* p = "xyz";//这里的p表示首元素的地址
	printf("%d\n", sizeof(p));
	//答案是8,p表示首元素的地址
	printf("%d\n", sizeof(p + 1));
	//答案是8,p+1表示第二个元素的地址
	printf("%d\n", sizeof(*p));
	//答案是1,*p表示第一个元素
	printf("%d\n", sizeof(p[0]));
	//答案是1
	printf("%d\n", sizeof(&p));
	//答案是8,&p是二级指针
	printf("%d\n", sizeof(&p + 1));
	//答案是8
	printf("%d\n", sizeof(&p[0] + 1));
	//答案是8,&p[0]+1表示y的地址
	return 0;
}

运行结果:

 

 

int main()
{
	char* p = "xyz";//这里的p表示首元素的地址
	printf("%d\n", strlen(p));
	//答案是3
	printf("%d\n", strlen(p + 1));
	//答案是2
	//printf("%d\n", strlen(*p));
	//printf("%d\n", strlen(p[0]));
	//编译错误
	printf("%d\n", strlen(&p));
	//答案是随机值,&p是二级指针,不确定后面什么时候遇到\0
	printf("%d\n", strlen(&p + 1));
	//答案是随机值-随机值
	printf("%d\n", strlen(&p[0] + 1));
	//答案是2
	return 0;
}

 

三、二维数组

 

int main()
{
	int arr[5][6] = { 0 };
	printf("%d\n", sizeof(arr));
	//答案是120,5×6×4=120
	printf("%d\n", sizeof(arr[0][0]));
	//答案是4
	printf("%d\n", sizeof(arr[0]));
	//答案是24,arr[0]是第一行这个一维数组的数组名,单独放在sizeof内部,arr[0]表示第一个整个这个一维数组
	printf("%d\n", sizeof(arr[0] + 1));
	//答案是8,arr[0]并没有单独放在sizeof内部,也没取地址,arr[0]就表示首元素地址,就是第一行这个一维数组的第一个元素的地址,arr[0]+1就是第一行第二个元素的地址
	printf("%d\n", sizeof(*(arr[0] + 1)));
	//答案是4
	printf("%d\n", sizeof(arr + 1));
	//答案是8,arr+1表示第二行的地址
	printf("%d\n", sizeof(*(arr + 1)));
	//答案是24
	printf("%d\n", sizeof(&arr[0] + 1));
	//答案是8,&arr[0]+1表示第二行的地址
	printf("%d\n", sizeof(*(&arr[0] + 1)));
	//答案是24
	printf("%d\n", sizeof(*arr));
	//答案是24
	printf("%d\n", sizeof(arr[3]));
	//答案是24
	return 0;
}

运行结果:

二维数组确实有点打脑壳,你们觉得呢? 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指针和数组的相关练习题 的相关文章

  • JS面试中常见的算法题

    1 验证一个数是否是素数 1 如果这个数是 2 或 3 一定是素数 2 如果是偶数 一定不是素数 3 如果这个数不能被3至它的平方根中的任一数整除 num必定是素数 而且除数可以每次递增 排除偶数 function isPrime num
  • 优秀logo设计解析_优秀Logo设计!具象表现手法!

    文 王新华 具象标志以客观物象的自然形态为造型基础 经过提炼 概括 抓住客观对象的精神内涵 强化其主要特征 忽略与舍弃次要因素 达到直观 感性的视觉效果 人物形 人是万物之灵 是社会的主宰 以人物为题材是标志设计的重要表现内容 人体的各种动

随机推荐

  • C++中memset函数详解

    memset函数定义于
  • Django中分页功能的实现及封装与调用(超详细)

    在django开发过程中 实现前端页面的分页是一个基本且常用的功能 下面就同小编一起完成分页功能的实现及封装与调用 一 在pycharm中创建django项目 小编默认看客朋友们都会创建 故不在赘述 若不熟悉 猛戳这里 二 在mysql中创
  • React事件处理、事件的特点、事件语法、React事件处理函数里的this、事件对象、阻止浏览器的默认行为

    React事件的特点 1 React 事件绑定属性的命名采用驼峰式写法 而不是小写 如 onClick 2 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数 而不是一个字符串 DOM 元素的写法 函数不写小圆括号 3 在 Reac
  • CSAPP malloclab实验

    书本配套实验地址 构造一个分配器是一件富有挑战的任务 设计空间很大 有多种块格式 空闲链表格式 以及放置 分割和合并策略可供选择 另一个挑战就是我们经常被迫在类型系统的安全和熟悉的限定之外编程 依赖于容易出错的指针强制类型转换和指针运算 这
  • FreeRTOS记录(五、FreeRTOS任务通知)

    在前面几篇文章我们已经对FreeRTOS任务API和任务调度原理进行了相对深入的分析 这篇文章主要针对任务与任务之间的交互 信息传递相关的API组件进行分析 目录 一 任务通知基本介绍 1 FreeRTOS 任务通知函数 2 CMSIS封装
  • Android调用打印机

    打印机其实和Android没有什么大的关系 和linux内核关联才是比较强的 最终的结果是要在Android实现驱动打印机 但是一般调试一个新的驱动的流程是这样的 1 先在linux PC上进行测试 2 在标准嵌入式linux上进行调试 3
  • MFC原理与方法(二)

    MFC原理与方法 二 一 前言 二 类向导的使用 三 MFC消息管理 1 MFC消息映射机制 2 消息处理 四 结语 一 前言 时间过得好快啊 又是一个星期过去了 我又回来啦 每个星期保持写博客的习惯 及时消化上课的知识 不仅仅对我有帮助和
  • MySQL进阶篇之存储过程(procedure)

    04 视图 存储过程 触发器 4 1 视图 view 4 2 存储过程 procedure 4 2 1 介绍 1 介绍 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合 调用存储过程可以简化应用开发人员的很多工作 减少数据在数据
  • 异常处理的返回

    异常处理的返回 异常可以分为四类 中断 interrupt 陷阱 trap 故障 fault 和终止 abort 这几种异常处理之后又有不同的返回方式 总的来讲 类别 原因 异步 同步 返回行为 中断 来自I O设备的信号 异步 总是返回到
  • 面试3个月拿下多家大厂的P7技术专家Offer,来看我面试复盘!

    一 概述 之前写过两篇文章 工作10年我面试过上百个程序员 真想对他们说 在公司里写代码天天摸鱼偷懒 出去面试又该怎么写简历 通过这两篇文章 我们给大家聊了聊国内中大型互联网公司 在Java面试时一些高频的技术问题 本文我们通过一篇真实的一
  • 【状态估计】用于非标量系统估计的最优卡尔曼滤波(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 考虑了最优卡尔曼滤波的例子 假设一些非标量
  • vscode运行命令是报错:标记“&&”不是此版本中的有效语句分隔符。

    问题截图 问题原因 这个问题的原因和你运行的什么脚本语言没关系 即与 py c cpp无关 和你在那个终端运行的有关 解决方法 第一步 点击向下箭头 并选择 选择默认配置文件 第二步 选择 Windows PowerShell 第三步 关闭
  • 数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • 2021羊城杯CTF wp

    2021羊城杯 部分 wp Web web1 only 4 web2 EasyCurl web3 Checkin Go web4 Cross The Side Re Pwn BabyRop Crypto Miss bigrsa Misc M
  • FISCO-BCOS如何把WEBASE部署通过的合约方法由api在前端调用

    参考文章 fisco bcos官方文档第五章部分 通过POST请求 数据格式要为json 调用hello合约中的get方法 按要求填写需要的信息
  • 决策树的学习

    决策树 从名字上看 就知道其模型的结构为树结构 决策树既可以用于分类 也可以用于回归之中 在分类问题中 我们可以认为其是if then规则的集合 也可以认为是定义在特征空间与类空间上的条件概率分布 在学习过程中 利用训练数据和损失函数最小化
  • 因果推理的do算子

    在因果推理中 我们一般都需要首先构建一个因果图 这是后续进行因果分析的基础 但是在现阶段笔者的知识看来 因果图的构建其实是一个比较主观的过程 但偏偏又是后续分析的基础 所以略感头疼 在构建因果图前 我们有必要明白 什么是因果关系 通俗来说
  • 【JUC并发编程】

    本笔记内容为狂神说JUC并发编程部分 目录 一 什么是JUC 二 线程和进程 1 概述 2 并发 并行 3 线程有几个状态 4 wait sleep 区别 三 Lock锁 重点 四 生产者和消费者问题 五 八锁现象 六 集合类不安全 七 C
  • 统计字符串中,中文字符、英文字符和数字字符的数量

    package com suanfa public class ZYSTotal 统计字符串中 中文字符 英文字符和数字字符的数量 public static void main String args int englishCount 0
  • 指针和数组的相关练习题

    目录 一 一维数组 二 字符数组 三 二维数组 注意 假设本练习题所用的VS编译器是64位平台下的 首先要明白数组名的意义 1 sizeof 数组名 这里的数组名表示整个数组 计算的是整个数组的大小 2 数组名 这里的数组名表示整个数组 取