【C语言】指针和数组笔试题解析

news2024/11/23 8:13:32

简单不先于复杂,而是在复杂之后。

 

 注:题目会附在前面,大家可以先复制代码自己做一遍,再看答案。

目录

1. 一维数组 

2. 字符数组 

2.1 sizeof 相关

2.1.1 题一

2.1.2 题二

2.1.3 题三

2.2 strlen 相关 

2.2.1 题一 

2.2.2 题二

2.2.3 题三 

3. 二维数组 


 

1. 一维数组 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//一维数组
int main()
{
	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));

	return 0;
}

 

 

 

 

 

 

 

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//一维数组
int main()
{
	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));//16
	//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节

	printf("%d\n", sizeof(a + 0));//4(32位平台)/8(64位平台)
	//数组名并不是单独放在 sizeof 内部,也没有取地址,故数组名代表首元素地址,a+0后还是首元素地址
	//是地址,大小就是4/8个字节

	printf("%d\n", sizeof(*a));//4
    //*a 中的 a 就是数组首元素的地址,*a 就是对首元素的地址解引用找到的就是首元素
	//首元素的大小就是4个字节


	printf("%d\n", sizeof(a + 1));//4或者8
	//a 是首元素地址,a + 1 代表第二个元素的地址
	//大小是4/8

	printf("%d\n", sizeof(a[1]));//4
	//计算的是数组第二个元素的大小

	printf("%d\n", sizeof(&a));//4/8
    //&a 取出的是数组的地址,数组的地址,也就是个地址
	//是地址,大小就是4/8

	printf("%d\n", sizeof(*&a));//16
	//&a 得到的是数组的地址,类型是int(*)[4],是一种数组指针
	//数组指针解引用找到的是数组
	
	//也可以理解为 & 和 * 抵消 

	printf("%d\n", sizeof(&a + 1));//4/8
	//&a 取出的是数组的地址,=
	//&a 类型是 int(*)[4]
	//&a+1 是从数组a的地址向后跳过一个了(4个整型元素的)数组的大小
	//&a+1还是地址,是地址就是4/8个字节

	printf("%d\n", sizeof(&a[0]));//4/8
	//&a[0]取出的是第一个元素的地址
	//计算的就是地址的大小

	printf("%d\n", sizeof(&a[0] + 1));//4/8
	//&a[0]+1 是第二个元素的地址
	//大小是4/8个字节

	return 0;
}

2. 字符数组 

strlen: 求字符串长度的,关注的是字符串中的 \0 ,计算的是 \0 之前出现的字符字数

            是库函数,只针对字符串

 

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

              是操作符

2.1 sizeof 相关

2.1.1 题一

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };
	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));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));

	return 0;
}

 

 

 

 

 

 

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", sizeof(arr));//6
	//sizeof(数组名)计算整个数组的大小

	printf("%d\n", sizeof(arr + 0));//4/8
	//arr + 0 是数组首元素的地址

	printf("%d\n", sizeof(*arr));//1
	//*arr 就是数组的首元素,大小是1字节
	//*arr -->  arr[0
    //*(arr + 0) --> arr[0]
	 
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4/8
	//&arr 是数组的地址,是地址就是4/8个字节

	printf("%d\n", sizeof(&arr + 1));//4/8
	//&arr + 1 是数组后的地址

	printf("%d\n", sizeof(&arr[0] + 1));//4/8
	//&arr[0] + 1 是第二个元素的地址

	return 0;
}

2.1.2 题二

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	char arr[] = "abcdef";

	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));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));

	return 0;
}

 

2.1.3 题三

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	char* p = "abcdef";

	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;
}

 

 

2.2 strlen 相关 

2.2.1 题一 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };

	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));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
	
	return 0;
}

 

 

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", strlen(arr));//随机值
	// strlen 会从数组首地址直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')

	printf("%d\n", strlen(arr + 0));//随机值(同理)

	printf("%d\n", strlen(*arr));//--> strlen('a'); --> strlen(97); //野指针
	//程序会报错
	printf("%d\n", strlen(arr[1]));//--> strlen('b'); --> strlen(98); //野指针

	printf("%d\n", strlen(&arr));//随机值

	printf("%d\n", strlen(&arr + 1));//随机值 - 6

	printf("%d\n", strlen(&arr[0] + 1));//随机值 - 1
	
	return 0;
}

 2.2.2 题二

 

 

 

2.2.3 题三 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{
	char* p = "abcdef";

	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;
}

 

3. 二维数组 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int a[3][4] = { 0 };

	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a[0][0]));
	printf("%d\n", sizeof(a[0]));
	printf("%d\n", sizeof(a[0] + 1));
	printf("%d\n", sizeof(*(a[0] + 1)));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(*(a + 1)));
	printf("%d\n", sizeof(&a[0] + 1));
	printf("%d\n", sizeof(*(&a[0] + 1)));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a[3]));

	return 0;
}

 

 

 

 

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

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

相关文章

面试之线程池(高级开发 必问)

今天被面试 问麻了。第一个问题是&#xff1a; 一个类有私有的变量&#xff0c;如果修改这个类的私有变量。使用setter方法除外。&#xff08;后来才知道用反射&#xff09; 算了&#xff0c;我还是太水了。回归主题。 线程池的优点: (1):降低资源消耗&#xff0c;通过重读…

UE4/5动画蓝图中Additive Animations讲解

Additive Animation指用当前动画作为Additive动画减去参考位置后得到的Delta量&#xff0c;再通过Apply Additive节点将任意动画输出套用该Delta量&#xff0c;从而达到动画叠加的效果。 官方案例的Additive Animation案例&#xff0c;位于“内容示例/Animation_Basics”场景中…

【Visual Studio】printf() 函数无输出显示问题。使用 C++ 语言,配合 Qt 开发串口通信界面

使用 C 语言&#xff0c;配合 Qt 开发串口通信界面时&#xff0c;遇到 printf() 函数无输出显示。 在工程属性的对应位置添加 editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$(ProjectName).exe 即可&#xff0c;如下图所示。 成功运行的截图如下&#xff1a; Ref. Visual Studio 20…

用uniapp完成一个前端项目

持续更新中… 这里给初学者提供一个uniapp的练习项目&#xff0c;学习uniapp需要vue和微信小程序的基础&#xff08;其实微信小程序基础需要的不多&#xff09;&#xff0c;建议把基础内容学牢固了再看本文。 本项目完成的是H5小程序APP的新闻项目&#xff0c;下面就开始说一下…

kubectl详解之声明式管理方法

目录 一、声明式管理方法二、资源配置清单的管理2.1 查看资源配置清单2.1 修改资源配置清单并应用2.1.1 离线修改2.1.2 在线修改 一、声明式管理方法 适合于对资源的修改操作 声明式资源管理方法依赖于资源配置清单文件对资源进行管理 资源配置清单文件有两种格式&#xff1a;…

Codeforces 879 C.Game with Reversing

博弈&#xff0c;思维&#xff0c;分类讨论 题意&#xff1a; 给你两个字符串&#xff0c;Alice可以每次选一个字符串的任意字母换成任意的字母&#xff0c;Bob可以选择一个字符串进行反转&#xff0c;Alice希望快速结束游戏&#xff0c;Bob希望拖延游戏&#xff0c;问你如果…

【智能座舱系列| 域控制器】 — 智能座舱域控制器技术发展趋势分析

引言 提到座舱域控制器用的主控SoC芯片,大家第一个会想到应该就是高通的SA8155P 。目前,在主机厂新上市的中高端车型中,其座舱的主控SoC芯片多是采用高通的SA8155P, SA8155P为什么会得到众多主机厂的青睐呢?不妨先看一看高通座舱SoC芯片的迭代历程。 高通座舱芯片的迭代历…

Docker 部署 Tomcat 并开放 8082 端口

本文目录 1. 是否安装 Docker2. 拉取 Tomcat 镜像3. 运行 Tomcat 容器4. 验证 Tomcat 容器运行5. 测试 Tomcat 访问6. 开放 8082 端口 1. 是否安装 Docker 可以通过下面的命令来验证是否安装了 Docker&#xff1a; docker --version可以看到&#xff0c;输入该命令后显示了 D…

Cesium.js基础使用(vue)

如何通过Cesium创建一个地图&#xff1a; 1、npm安装(这里使用1.95.0版本) npm i cesium1.95.0 -s 或 yarn add cesium1.95.0 -s 2、组件引入 import * as Cesium from "cesium/Cesium"; 3、容器创建 <div id"cesiumContainer" /> 4、核心类Vi…

创业项目分享 - 想赚大钱得学会偷懒

想创业赚钱&#xff0c;就不能偷懒&#xff0c;得卷死你的同行才行&#xff0c;为何今天话锋突转呢?请放心&#xff0c;这篇不是标题党&#xff0c;而是想要强调&#xff0c;在不同的阶段&#xff0c;对“偷懒”的定义是不一样的&#xff0c;因为不同的阶段&#xff0c;我们的…

ESP32(MicroPython) LCD1602 显示通过Socket通信接收的数据

本程序 实现了通过LCD1602 显示通过Socket通信接收的数据。由于外设驱动有滚动显示的特性并且每次显示要清除之前显示的内容&#xff0c;在显示字符前通过空格和换行清除之前显示的数据&#xff0c;并判断字符串长度&#xff0c;一行显示不下时分两行显示。 代码如下 #导入Pi…

C#对字符串的常用处理总结C#控制台

目录 C#用空格分隔的字符串string转换成字符数组string[]&#xff1b;字符串数组string[]转换成整型数组int[] 1、将用console.readline()获取的用空格分隔的string转换成string[] 2、将string[]转换成int[]&#xff08;c#3.0&#xff09; 截取指定字符串 C#RichTextBox截断…

ModaHub魔搭社区:Milvus 数据迁移工具 – MilvusDM

目录 Milvus 数据迁移工具 — MilvusDM 简介 功能介绍 Faiss to Milvus Milvus 数据迁移工具 — MilvusDM 简介 MilvusDM 是一款针对 Milvus 研发的数据迁移工具&#xff0c;支持 Milvus 数据传输以及数据文件的导入与导出&#xff1a; Faiss to Milvus&#xff1a;将未…

基于Transformer视觉分割综述

基于Transformer视觉分割综述 SAM &#xff08;Segment Anything &#xff09;作为一个视觉的分割基础模型&#xff0c;在短短的 3 个月时间吸引了很多研究者的关注和跟进。如果你想系统地了解 SAM 背后的技术&#xff0c;并跟上内卷的步伐&#xff0c;并能做出属于自己的 SAM…

获取齐治堡垒机任意用户登录权限

他一个人呆呆地坐在禾场边上&#xff0c;望着满天的星星&#xff0c;听着小河水朗朗的流水声&#xff0c;陷入了一种说不清楚的思绪之中。这思绪是散乱而飘浮的&#xff0c;又是幽深而莫测的。他突然感觉到&#xff0c;在他们这群山包围的双水村外面&#xff0c;有一个辽阔的大…

spring之BeanFactory

spring之BeanFactory DefaultListableBeanFactory示例代码类继承实现结构 BeanFactory是Bean工厂&#xff0c;所以很明显&#xff0c;BeanFactory会负责创建Bean&#xff0c;并且提供获取Bean的API。 DefaultListableBeanFactory 在Spring源码中&#xff0c;BeanFactory接口存…

ULTRAMAT 23红外气体分析仪

后面板接口图 485通信接口 7脚和9脚 模拟量接口 选装接口 635430034211014569720.pdf (chem17.com)https://img64.chem17.com/2/20140807/635430034211014569720.pdf 特此记录 anlog 2023年7月3日

redis从零开始(6)----分布式锁

场景 修改时&#xff0c;经常需要先将数据读取到内存&#xff0c;在内存中修改后再存回去。在分布式应用中&#xff0c;可能多个进程同时执行上述操作&#xff0c;而读取和修改非原子操作&#xff0c;所以会产生冲突。增加分布式锁可以解决这个问题 基本原理 同步锁&#xf…

14.PWM输出

1.通用定时器PWM概述&#xff1a; 2.PWM工作过程&#xff1a; 2.PWM模式1&PWM模式2&#xff1a; 3.向上计数配置&#xff1a; 4.PWM模式&#xff1a; 5.自动重载的预装载寄存器&#xff1a; 6.STM32定时器3输出通道引脚&#xff1a; 7.PWM输出库函数&#xff1a; PWM输出…

java 单元测试覆盖率调研

1、覆盖率工具对比 根据网上的资料搜索发现&#xff0c;现在常用的 java 单元测试覆盖率工具主要有&#xff1a; EmmaCoberturaJacocoClover(商用&#xff09; 工具JacocoEmmaCobertura原理使用 ASM 修改字节码修改 jar 文件&#xff0c;class 文件字节码文件基于 jcoverage,…