【C语言】数组和指针刷题练习

指针和数组我们已经学习的差不多了,今天就为大家分享一些指针和数组的常见练习题,还包含许多经典面试题哦!


一、求数组长度和大小

普通一维数组

int main()
{//一维数组int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));//整个数组大小16printf("%d\n", sizeof(a + 0));//首元素地址8printf("%d\n", sizeof(*a));//首元素4printf("%d\n", sizeof(a + 1));//第二个元素地址8printf("%d\n", sizeof(a[1]));//第二个元素4printf("%d\n", sizeof(&a));//整个数组地址 8printf("%d\n", sizeof(*&a));//先拿到这个数组地址,再解引用拿到整个数组(即:数组名)-》16printf("%d\n", sizeof(&a + 1));//地址8printf("%d\n", sizeof(&a[0]));//第一个元素地址8printf("%d\n", sizeof(&a[0] + 1));//第二个元素地址8return 0;
}

字符数组

int main()
{//字符数组char arr[] = { 'a','b','c','d','e','f' };printf("%d\n", sizeof(arr));//整个数组 6printf("%d\n", sizeof(arr + 0));//数组首元素地址8printf("%d\n", sizeof(*arr));//第一个元素1printf("%d\n", sizeof(arr[1]));//第一个元素1printf("%d\n", sizeof(&arr));//整个数组地址8printf("%d\n", sizeof(&arr + 1));//地址8printf("%d\n", sizeof(&arr[0] + 1));//第二个元素地址8printf("%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((const char*) & arr));printf("%d\n", strlen((const char*)(&arr + 1)));printf("%d\n", strlen(&arr[0] + 1));//随机值return 0;
}

字符串数组

int main()
{char arr[] = "abcdef";printf("%d\n", sizeof(arr));//这个数组7printf("%d\n", sizeof(arr + 0));//第一个元素地址8printf("%d\n", sizeof(*arr));//第一个元素1printf("%d\n", sizeof(arr[1]));//第一个元素1printf("%d\n", sizeof(&arr));//这个数组地址8printf("%d\n", sizeof(&arr + 1));//地址8printf("%d\n", sizeof(&arr[0] + 1));//第二个元素地址8printf("%d\n", strlen(arr));//数组长度6printf("%d\n", strlen(arr + 0));//6/*printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr + 1));*/printf("%d\n", strlen(&arr[0] + 1));//5return 0;
}

指向字符串的字符指针

int main()
{const char* p = "abcdef";printf("%d\n", sizeof(p));//指针,大小8printf("%d\n", sizeof(p + 1));//指针,大小8printf("%d\n", sizeof(*p));//第一个字符a,大小1printf("%d\n", sizeof(p[0]));//第一个字符a,大小1printf("%d\n", sizeof(&p));//指针的地址,大小8printf("%d\n", sizeof(&p + 1));//指针的地址,大小8printf("%d\n", sizeof(&p[0] + 1));//第二个元素地址,大小8printf("%d\n", strlen(p));//长度,6printf("%d\n", strlen(p + 1));//长度,5/*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));//长度,5return 0;
}

二维数组

//int main()
//{
//	int a[3][4] = { 0 };
//	printf("%d\n", sizeof(a));//整个数组大小,48
//	printf("%d\n", sizeof(a[0][0]));第一个元素,大小4//	printf("%d\n", sizeof(a[0]));//第一行数组的数组名,大小16
// a[0]是第一行一维数组的数组名,数组名单独放在了sizeof里面,就表示整个数组,所以就算的就算整个数组的大小 为16//	printf("%d\n", sizeof(a[0] + 1));//第一行第二个元素地址,8
//	printf("%d\n", sizeof(*(a[0] + 1)));//第一行第二个元素,大小4
//	printf("%d\n", sizeof(a + 1));//第二行的地址,大小8
//	printf("%d\n", sizeof(*(a + 1)));//第二行数组的数组名,大小16
//	printf("%d\n", sizeof(&a[0] + 1));//第二行数组地址,大小8
//	printf("%d\n", sizeof(*(&a[0] + 1)));//第二行数组数组名,大小16
//	printf("%d\n", sizeof(*a));//第一行数组数组名,大小16
//	printf("%d\n", sizeof(a[3]));//数组名,大小16
//
//	return 0;
//}/*
二维数组有的情况下可以拿到某一行数组的数组名,这时放在sizeof中就算的也是那行数组的大小
二维数组就是数组的数组,,就是一维数组的数组
eg:
a[3][4]    a[0]就是第一行数组的数组名,sizeof算他的大小为第一行整个数组的大小   为:16
*/

总节:

数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。

二、指针相关题型

笔试题1:

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

在这里插入图片描述

笔试题2:

struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{p = (struct Test*)0x100000;printf("%p\n", p + 0x1);//0x100014printf("%p\n", (unsigned long)p + 0x1);//0x100001printf("%p\n", (unsigned int*)p + 0x1);//0x100004return 0;
}

分析:

  1. p为结构体指针,+1相当于跳过一个结构体大小,这里告知结构体的大小是20个字节,p + 0x1按16进制打印出来是0x100014
  2. p转化为无符号 长整型,并非指针,+1,就是+1,0x100001
  3. p转化为无符号整型类型指针+1跳过四个字节。0x100004
    由于以%p打印,第一个00100014,第二个00100001,第三个00100004

笔试题3:

int main()
{int a[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&a + 1);int* ptr2 = (int*)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);//4   2000000//%x打印16进制//%o打印8进制return 0;
}

在这里插入图片描述

笔试题4:

int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };int* p;p = a[0];//p就算第一个元素地址printf("%d", p[0]);//return 0;
}

在这里插入图片描述

笔试题5:

int main()
{int a[5][5];int(*p)[4];p = (int(*)[4]) a;printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0;
}

在这里插入图片描述
所以相减就是-4
在这里插入图片描述

笔试题6:

//int main()
//{
//	int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	int* ptr1 = (int*)(&aa + 1);
//	int* ptr2 = (int*)(*(aa + 1));
//	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//10 5
//	return 0;
//}

在这里插入图片描述

笔试题7:

int main()
{const char* a[] = { "work","at","alibaba" };const char** pa = a;pa++;printf("%s\n", *pa);//       atreturn 0;
}

这是其中的关系的分布图:
在这里插入图片描述

笔试题8:

int main()
{const char* c[] = { "ENTER","NEW","POINT","FIRST" };const char** cp[] = { c + 3,c + 2,c + 1,c };const char*** cpp = cp;printf("%s\n", **++cpp);//POINTprintf("%s\n", *-- * ++cpp + 3);//ERprintf("%s\n", *cpp[-2] + 3);//STprintf("%s\n", cpp[-1][-1] + 1);//EWreturn 0;
}

在这里插入图片描述
1、++cpp,cpp指向c+2,解引用拿到c+2,在解引用拿到POINT的首地址,然后按照%s打印出来POINT
2、++cpp,使cpp指向c+1,解引用拿到c+1,再–(c+1)使其指向c,再解引用拿到ENTER的地址,再+3拿到E的地址,根据%s打印出ER
类方法就是这样子,依次可以全部解出来

总结:
今天的指针数组练习题就分享到这里啦,这些题型都能够很好的帮助我们对数组和指针有更加深刻的掌握,谢谢大家!!!

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

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

相关文章

Postman应用——控制台调试

当你在测试脚本中遇到错误或意外行为时,Postman控制台可以帮助你识别,通过将console.log调试语句与你的测试断言相结合,你可以检查http请求和响应的内容,以及变量之类的。 通常可以使用控制台日志来标记代码执行,有时…

网络安全日报 2023年09月21日

1、研究人员披露基于ERMAC木马的Hook家族银行木马 https://research.nccgroup.com/2023/09/11/from-ermac-to-hook-investigating-the-technical-differences-between-two-android-malware-variants/ 研究人员发现 ERMAC 源代码被用作 Hook 的基础。恶意软件操作者可以发送到…

Visual Studio将C#项目编译成EXE可执行程序

经常看文章时会收获不少实用工具,有的在github上是编译好的,有的则是未编译的项目文件。所以经常会使用Visual Studio编译项目文件成exe可执行程序,以下为编译的流程。 第一步,从github上下载项目文件,举个例子&#…

小米手机安装面具教程(Xiaomi手机获取root权限)

文章目录 1.Magisk中文网:2.某呼:3.最后一步打开cmd命令行输入的时候:4.Flash Boot 通包-Magisk(Flash Boot通刷包)5.小米Rom下载(官方刷机包)6.Magisk最新版本国内源下载 1.Magisk中文网: htt…

【深度学习实验】前馈神经网络(七):批量加载数据(直接加载数据→定义类封装数据)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 直接加载鸢尾花数据集 a. 加载数据集 b. 数据归一化 c. 洗牌操作 d. 打印数据 2. 定义类封装数据 a. __init__(构造函数:用于初始化数据集对象) b.…

华为OD机试 - 构成正方形的数量 - 数据结构map(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》。 …

mysql 半同步复制模式使用详解

目录 一、前言 二、mysql主从架构简介 2.1 mysql主从复制架构概述 2.2 为什么使用主从架构 2.2.1 提高数据可用性 2.2.2 提高数据可靠性 2.2.3 提升数据读写性能 2.3 主从架构原理 2.4 主从架构扩展 2.4.1 双机热备(AB复制) 2.4.2 级联复制 2…

Qt核心:元对象系统、属性系统、对象树、信号槽

一、元对象系统 1、Qt 的元对象系统提供的功能有:对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C进行的一些扩展,主要是为实现信号和槽机制而引入的, 信号和槽机制是 Qt 的核心特征。 3、要使…

当网络设置为自动获取dns时而实际nds是8.8.8.8,1.1.1.1的解决方法

笔记本换网络环境后,网络设置的是自动获取IP和自动获取dns。但使用命令:config/all命令时发现dns总是8.8.8.8,1.1.1.1。导致csdn上不了。 8.8.8.8,1.1.1.1:是谷歌的dns。 解决办法: 在支行中输入regedit打开注册表后&#xff0…

windows下载虚拟机virtualBox

链接:Downloads – Oracle VM VirtualBox 进入链接这样点击: 直接下载即可

Java“牵手”速卖通商品列表页数据采集+速卖通商品价格数据排序,速卖通API接口申请指南

速卖通是阿里巴巴旗下的面向国际市场打造的跨境电商平台,被称为国际版淘宝,速卖通面向海外买家客户,通过支付宝国际账户进行担保交易,并使用国际物流渠道运输发货,是全球第三大英文在线购物网站。 速卖通商品列表数据…

关于IDEA没有显示日志输出?IDEA控制台没有显示Tomcat Localhost Log和Catalina Log 怎么办?

问题描述: 原因是;CATALINA_BASE里面没有相关的文件配置。而之前学习IDEA的时候,把这个文件的位置改变了。导致,最后输出IDEA的时候,不会把日志也打印出来。 检查IDEA配置; D:\work_soft\tomcat_user\Tomcat10.0\bin 在此目录下&…

如何在没有第三方.NET库源码的情况,调试第三库代码?

大家好,我是沙漠尽头的狼。 本方首发于Dotnet9,介绍使用dnSpy调试第三方.NET库源码,行文目录: 安装dnSpy编写示例程序调试示例程序调试.NET库原生方法总结 1. 安装dnSpy dnSpy是一款功能强大的.NET程序反编译工具,…

STM32 Cubemx 通用定时器 General-Purpose Timers同步

文章目录 前言简介cubemx配置 前言 持续学习stm32中… 简介 通用定时器是一个16位的计数器,支持向上up、向下down与中心对称up-down三种模式。可以用于测量信号脉宽(输入捕捉),输出一定的波形(比较输出与PWM输出&am…

activemq部署

目录 1.下载 2.java环境 3.解压启动 4.访问测试 5.问题记录 5.1.无法启动成功问题 5.2.其他服务器无法访问 1.下载 ActiveMQ 2.java环境 需要注意要求的jdk版本,否则启动不会成功 3.解压启动 tar -zxvf apache-activemq-5.18.2-bin.tar.gz 进入到目录下执行…

使用递归思想遍历二叉树

二叉树的遍历主要有两种方式:深度优先遍历和广度优先遍历 这篇主要讲使用深度优先遍历来遍历二叉树 深度优先遍历有以下三种 前、中、后序遍历,这三种遍历方式的主要区别是中间节点的位置所在的顺序 前序遍历:中间节点在叶子节点前面 中序遍历…

Flink--4、DateStream API(执行环境、源算子、基本转换算子)

星光下的赶路人star的个人主页 注意力的集中,意象的孤立绝缘,便是美感的态度的最大特点 文章目录 1、DataStream API1.1 执行环境(Execution Environment)1.1.1 创建执行环境 1.2 执行模式(Execution Mode)…

Linux学习记录——이십구 网络基础(2)

文章目录 1、理解网络间通信2、理解协议3、网络字节序4、socket编程接口和sockaddr结构 1、理解网络间通信 宏观上,是主机与主机在发送接收消息,但主机怎么去发送消息?主机间的通信是通过进程完成的,这个进程就是用户发起的进程&…

终于把量化入门了,实盘权限已开,学习这件事也不难

多数人18岁就死了,但直到75岁才埋。 ——网易云热评《杀死那个石家庄人》 猫猫挺喜欢这句话的,为什么只活动75岁,于是我查了查现如今78.6岁,大差不差的。 那扣扣减减,人生短短57年,唯一十八岁那年&#xff…

鼠标移入展示字体操作

鼠标移入展示字体 点击删除实行删除操作&#xff0c;点击图片文字跳转产品详情的逻辑实现 <div class"allProduct-content"><template v-for"(item, index) in obj.product" :key"index"><!-- <img :src"item.image&qu…