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

news2025/1/16 7:42:06

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


一、求数组长度和大小

普通一维数组

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

	return 0;
}

字符数组

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

	return 0;
}

指向字符串的字符指针

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

	return 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   5
        return 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);//0x100014
	printf("%p\n", (unsigned long)p + 0x1);//0x100001
	printf("%p\n", (unsigned int*)p + 0x1);//0x100004
	return 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);//       at
	return 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);//POINT
	printf("%s\n", *-- * ++cpp + 3);//ER
	printf("%s\n", *cpp[-2] + 3);//ST
	printf("%s\n", cpp[-1][-1] + 1);//EW
	return 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.coloradmin.cn/o/1031666.html

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

相关文章

[plugin:vite:css] [sass] Undefined mixin.

前言: vite vue3 TypeScript环境 scss报错: [plugin:vite:css] [sass] Undefined mixin. 解决方案: 在vite.config.ts文件添加配置 css: {preprocessorOptions: {// 导入scss预编译程序scss: {additionalData: use "/resources/_ha…

如何使用远程桌面软件进行远程工作

远程工作提供了更大的灵活性和自由度,使得可以在任何地点工作。而要实现高效的远程工作,一个关键的工具就是远程桌面软件。本文将详细介绍如何使用远程桌面软件进行远程工作,以帮助读者提高工作效率。 一、了解远程桌面软件的基本原理 远程桌…

带你一步实现《栈》(括号匹配问题)

栈的结构及概念 栈是一种特殊的线性表,只允许在固定的一端插入或删除数据,进行插入和删除的一端被称为栈顶,另一端称为栈底。栈中的数据遵循后进先出原则 LIFO(LAST IN FIRST OUT) 俗称栈的插入过程叫做压栈,入栈&…

Batbot智慧能源管理云平台:拥抱数字化,提高能源效率!

我们拥抱数字化,以帮助提高能源效率。 政府已采取措施增强国家的环境信誉,旨在实现雄心勃勃的法定目标,即到2035年,将国家温室气体排放量减少78%(与1990年相比)。 拥抱数字化,提高能源效率&a…

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone header加上Last-Modified属性(表示这个资源在服务器上的最后修改时间): ----------------------------------------------------------------…

ThinkPHP5,使用unionAll取出两个毫无相关字段表的数据且分页

一:首先来了解一下 union 和 unionAll 1:取结果的并集,是否去重 union:对两个结果集进行并集操作,不包括重复行,相当于distinct,同时进行默认规则的排序; unionAll:对两…

JVM面试题-JVM对象的创建过程、内存分配、内存布局、访问定位等问题详解

对象 内存分配的两种方式 指针碰撞 适用场合:堆内存规整(即没有内存碎片)的情况下。 原理:用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存…

【QT】QRadioButton的使用(17)

QRadioButton这个控件在实际项目中多用于多个QRadioButton控件选择其中一个这样的方式去执行,那么,今天这节就通过几个简单的例子来好好了解下QRadioButton的一个使用。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装:Download Pyt…

PIL或Pillow学习2

接着学习下Pillow常用方法: PIL_test1.py : 9, Pillow图像降噪处理由于成像设备、传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信息统称为“噪声”, 比如数字图像中常见的“椒盐噪声”&…

聊一聊Twitter的雪花算法

什么是Twitter的雪花算法方法? 这是一种在分布式系统中生成唯一ID的解决方案。Twitter在推文、私信、列表等方面使用这种方法。 •ID是唯一且可排序的•ID包含时间信息(按日期排序)•ID适用于64位无符号整数•仅包含数字值 符号位&#xff08…

芋道商城,基于 Vue + Uniapp 实现,支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面 DIY 等功能

商城简介 芋道商城,基于 芋道开发平台 构建,以开发者为中心,打造中国第一流的 Java 开源商城系统,全部开源,个人与企业可 100% 免费使用。 有任何问题,或者想要的功能,可以在 Issues 中提给艿艿…

【从0学习Solidity】 10. 控制流,用solidity实现插入排序

【从0学习Solidity】10. 控制流,用solidity实现插入排序 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关…

python中的NaN在质量控制中怎么处理?

一、数据中的缺省值 气象数据中经常存在缺省值,比如未入库的站点数据、比如海温格点实况数据中的陆地区域。这些缺省值往往被赋予NaN(Not a Number,非数)。NaN是计算机科学中数值数据类型的一类值,表示未定义或不可表…

远程端点管理和安全性

当今的企业网络环境是一个分布式动态环境,其中有许多需要管理、验证和保护的移动部件,而不会对最终用户的生产力产生任何威慑力。提供有效的端点管理安全性,同时仍提供无缝最终用户体验的解决方案至关重要。 Endpoint Central 执行的活动可确…

Linux高性能服务器编程 学习笔记 第六章 高级IO函数

pipe函数用于创建一个管道,以实现进程间通信: fd参数是一个包含两个int的数组。该函数成功时返回0,并将一对打开的文件描述符填入其参数指向的数组,如果失败,则返回-1并设置errno。 pipe函数创建的这两个文件描述符f…

用Python爬取短视频列表

短视频是一款备受欢迎的短视频分享平台,每天都有大量精彩的视频内容等待我们去探索。在本文中,我们将分享如何使用Python爬取短视频的视频列表,让您能够发现更多有趣的视频。 一、安装必要的库 在开始之前,确保已安装以下库&…

Unity——对象池

对象池是一种朴素的优化思想。在遇到需要大量创建和销毁同类物体的情景时,可以考虑使用对象池技术优化游戏性能。 一、为什么要使用对象池 在很多类型的游戏中都会创建和销毁大量同样类型的物体。例如,飞行射击游戏中有大量子弹,某些动作游戏…

java用easyexcel按模版导出

首先在项目的resources下面建一个template包,之后在下面创建一个模版,模版格式如下: 名称为 financeReportBillStandardTemplateExcel.xlsx: {.fee}类型的属性值,是下面实体类的属性,要注意这里面的格式&a…

iPhone15拉胯,国产手机用折叠屏大反攻!

文 | 智能相对论 作者 | K星 iPhone偷懒式的15代机型发布,让市场大跌眼镜,虽然在莫名的宗教虔诚下依旧卖得很好,但苹果走下神坛之巅已经板上钉钉。 但是,苹果从最高处摔落,却依旧在神坛之上,iPhone15拉胯…

【STM32笔记】HAL库定时器捕获配置、操作及通用函数定义

【STM32笔记】HAL库定时器捕获配置、操作及通用函数定义 文章目录 定时器捕获设置输入捕获滤波器设置输入捕获极性设置输入捕获映射关系设置输入捕获分频器 定时器配置定时器捕获函数全局变量定时器回调和定时器捕获回调频率计算 附录:Cortex-M架构的SysTick系统定…