【c语言】指针和数组笔试题

news2024/11/17 7:39:55

1.指针和数组笔试题解析

一维数组

	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));//a单独放在sizeof内表示求整个数组的字节-----16
	printf("%d\n", sizeof(a + 0));//a不是单独放在sizeof内部,表明是首元素的地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*a));//a为首元素的地址,*a就是数组第一个元素,大小为4个字节
	printf("%d\n", sizeof(a + 1));//a不是单独放在sizeof内,a表示首元素地址,+1为第二个元素地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(a[1]));//a[1]为第二个元素,大小为int 4个字节
	printf("%d\n", sizeof(&a));//&a表示整个数组的地址,是地址就占4/8个字节,32位机器占四个字节
	printf("%d\n", sizeof(*&a));//取地址解引用相当于sizeof(a),a单独放在sizeof内表示求整个数组的字节-----16
	printf("%d\n", sizeof(&a + 1));//&a为取出整个数组的地址,+1,直接跳过整个数组,指向数组的尾,但是还是地址,地址就占4/8个字节
	printf("%d\n", sizeof(&a[0]));//&a[0]为第一个元素地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&a[0] + 1));//&a[0]为第一个元素地址,+1为第二个元素地址,地址占4/8个字节。

字符数组

char arr[] = { 'a','b','c','d','e','f' }; 
	printf("%d\n", sizeof(arr));//arr单独放在sizeof内表示求整个数组的字节-----6
	printf("%d\n", sizeof(arr + 0));//arr不是单独放在sizeof内部,+0相当于第一个元素的地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*arr));//arr不是单独放在sizeof内部,arr为首地址,解引用拿到第一个元素,占一个字节
	printf("%d\n", sizeof(arr[1]));//第二个元素,占一个字节
	printf("%d\n", sizeof(&arr));//整个数组的地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&arr + 1)); //&arr为取出整个数组的地址, + 1,直接跳过整个数组,指向数组的尾,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&arr[0] + 1));//&arr[0]第一个元素的地址,+1为第二个元素地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", strlen(arr));//从arr地址开始找'\0',--------随机数(字符数组没带反斜杠0)
	printf("%d\n", strlen(arr + 0));//arr+0为第一个元素地址开始找'\0'-------随机数(字符数组没带反斜杠0)
	printf("%d\n", strlen(*arr));//arr为首元素地址,对其解引用拿到的是第一个元素,strlen把他当做地址往后找'\0'-------奔溃
	printf("%d\n", strlen(arr[1]));//arr[1]为第二个元素,strlen把他当做地址往后找'\0'-------奔溃
	printf("%d\n", strlen(&arr));//&arr为整个数组的地址,strlen把他当做地址往后找'\0'-------随机数
	printf("%d\n", strlen(&arr + 1)); //&arr为整个数组的地址,+1跳过数组,跳到这个地址往后找'\0'-------随机数
	printf("%d\n", strlen(&arr[0] + 1));//&arr[0]为第一个元素地址,然后+1就是第2个元素的地址开始找'\0'--------随机数(字符数组没带反斜杠0)

字符串数组

char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//arr单独放在sizeof内表示求整个数组的字节-----7(字符串数组末尾有个反斜杠0)
	printf("%d\n", sizeof(arr + 0));//arr没单独放在内部,+0,表示第一个元素地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*arr));//arr没单独放在内部,arr为元素首地址,*arr拿到第一个元素,1个字节
	printf("%d\n", sizeof(arr[1]));//arr[1]为第二个元素,为1个字节
	printf("%d\n", sizeof(&arr));//&arr为整个数组的地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&arr + 1));//&arr为整个数组的地址,+1跳过这个数组,的地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&arr[0] + 1));//&arr[0]为第一个元素地址,+1为第二个元素地址,地址就占4 / 8个字节,32位机器占4个字节






	printf("%d\n", strlen(arr));//arr为首元素地址,从arr地址往后开始找'\0'-------6
	printf("%d\n", strlen(arr + 0));//arr+0为首元素地址,从arr地址往后开始找'\0'-------6
	printf("%d\n", strlen(*arr));//arr为首元素地址,解引用为第一个元素,把第一个元素当地址往后找反斜杠0------奔溃
	printf("%d\n", strlen(arr[1]));//arr[1]为第二个元素,把第二个元素当地址往后找反斜杠0------奔溃
	printf("%d\n", strlen(&arr));//&arr为整个数组的地址,strlen把他当做地址往后找'\0'-------6
	printf("%d\n", strlen(&arr + 1));//&arr为整个数组的地址, + 1跳过数组,跳到这个地址往后找'\0'------ - 随机数
	printf("%d\n", strlen(&arr[0] + 1));//&arr[0]为第一个元素地址,然后 + 1就是第2个元素的地址开始找'\0'------5

指针保存字符串数组首地址

	char* p = "abcdef";
	printf("%d\n", sizeof(p));//p保存的是字符串首元素的地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(p + 1)); //p保存的是字符串首元素的地址,+1为第二个元素地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*p)); //p保存的是字符串首元素的地址,对他解引用得到的是第一个元素,占一个字节
	printf("%d\n", sizeof(p[0]));//p[0]相当于*(p+0),第一个元素占一个字节
	printf("%d\n", sizeof(&p)); //p指针的地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&p + 1)); //p指针的地址+1,还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&p[0] + 1));//p[0]相当于第一个元素,&p[0]相当于第一个元素地址,&p[0] + 1为第二个元素地址,地址就占4 / 8个字节,32位机器占4个字节

	printf("%d\n", strlen(p));//p保存的是字符串首元素的地址,从首元素地址开始往后找反斜杠0--------6
	printf("%d\n", strlen(p + 1));//p保存的是字符串首元素的地址,+1为第二个元素地址开始往后找反斜杠0--------5
	printf("%d\n", strlen(*p));//p保存的是字符串首元素的地址,解引用为第一个元素,strlen把他当地址开始往后找反斜杠0------奔溃
	printf("%d\n", strlen(p[0]));//p[0]为首元素,将a的ascll码值当地址开始往后找反斜杠0------奔溃
	printf("%d\n", strlen(&p));//p指针的地址,开始往后找反斜杠0-----随机值
	printf("%d\n", strlen(&p + 1)); //p指针的地址+1,开始往后找反斜杠0-----随机值
	printf("%d\n", strlen(&p[0] + 1));//p[0]相当于第一个元素,&p[0]相当于第一个元素地址,&p[0] + 1为第二个元素地址开始往后找反斜杠0-------5

二维数组

	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//a单独放在sizeof内表示求整个数组的字节------3*4*4=48
	printf("%d\n", sizeof(a[0][0]));//第一个元素,大小为4个字节
	printf("%d\n", sizeof(a[0]));//a[0]相当于数组名---*(a+0)---*a,如果是一维数组a表示首元素的地址,二维数组a表示第一行数组的地址,相当于把第一行整个数组放在sizeof内部,*a表示第一行元素,4*4=16;
	printf("%d\n", sizeof(a[0] + 1));//a[0]相当于数组名,但是没有单独放在sizeof内部,相当于第一行第一个元素地址,+1为第一行第二个元素地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*(a[0] + 1)));//上一个说(a[0] + 1)这个是第二个元素的地址,对其解引用得到的是第二个元素,为4个字节
	printf("%d\n", sizeof(a + 1));//a没有单独放在sizeof内,表示第一行的地址,+1表示第二行的地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*(a + 1)));//上一个说a + 1为第二行的地址,对其解引用得到第二行,4*4=16;
	printf("%d\n", sizeof(&a[0] + 1));//&a[0]为第一行的地址,&a[0] + 1为第二行的地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*(&a[0] + 1)));//第二行的地址解引用得到第二行,4*4=16;
	printf("%d\n", sizeof(*a));//a没有单独放在sizeof内,a表示第一行的地址,*a得到是第一行,4*4=16;
	printf("%d\n", sizeof(a[3]));//sizeof(a[3])直接会被替换成sizeof(a[0]),不会访问a[3]的地址,不会越界访问--16

2.总结

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

3.指针笔试题

笔试题1:

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

分析:
在这里插入图片描述
在这里插入图片描述

笔试题2

//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p 的值为0x100000。如下表表达式的值分别为多少?
int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

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

笔试题3:

int main()
{
    inta[4] = { 1, 2, 3, 4 };
    int*ptr1= (int*)(&a+1);
    int*ptr2= (int*)((int)a+1);
    printf( "%x,%x", ptr1[-1], *ptr2);    return0;
}

分析:在这里插入图片描述
在这里插入图片描述

笔试题4:

int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) }; 
	int* p;
	p = a[0];
	printf("%d", p[0]); 
	return 0;
}

分析:==注意里面不是这种{}==所以是逗号表达式在这里插入图片描述
在这里插入图片描述

笔试题5:

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

分析:
在这里插入图片描述
在这里插入图片描述

笔试题6:

int main()
{
    intaa[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));
    return 0;
}

分析:在这里插入图片描述

在这里插入图片描述

笔试题7:

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

分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

笔试题8:

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

分析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

五个很实用的IDEA使用技巧

日常开发中,相信广大 Java 开发者都使用过 IntelliJ IDEA 作为开发工具,IntelliJ IDEA 是一款优秀的 Java 集成开发环境,它提供了许多强大的功能和快捷键,可以帮助开发者提高编码效率和质量。除了一些常见的技巧,如自动…

[篇五章五]-如何禁用 Windows Defender-我的创作纪念日

################################################## 目录 禁用掉烦人的 Windows Defender 在本地组策略编辑器中禁用 Windows Defende 关闭 Microsoft Defender 防病毒 禁止 Defender 开机自动运行 重新激活 Windows Defender #######################################…

字符串函数和内存函数详解(2)

🐵本文会将会对剩余的字符串库函数和内存函数进行讲解 1.strstr📚 1.1函数用法✏️ strstr函数原型: strstr用于在字符串中找子串,strstr会返回str1中出现str2的起始地址,如果在str1中没有找到str2,则返回…

FreeRTOS移植以及核心功能

文章目录 freertos和ucos区别,优缺点比较移植步骤核心功能内存管理(5种内存管理策略)FreeRTOS任务调度算法有三种时间管理通信管理 栈管理 freertos和ucos区别,优缺点比较 FreeRTOS(Free Real-Time Operating System&…

jdk20 download 配置(linux window mac)

download 直达链接 jdk20,17 wget https://download.oracle.com/java/20/latest/jdk-20_linux-x64_bin.deb # 类似格式替换包的名称就可以实现终端下载jdk下载登录/oracle账号 下载jdk有可能存在要求登录帐号的情况 # 好心人的帐号 账号: 59968873qq.com 密码&…

数据库基本概念与安装MySQL数据库

MySQL数据库基本操作与简单管理 1、数据库的基本概述1.1数据库背景1.2数据库组成1.3数据库发展1.4数据库组成1.5数据库的数据流向1.6数据库功能1.7DBMS的工作模式 2、关系性数据库和非关系性数据库2.1关系型数据库2.2非关系型数据库2.3关系型数据库和非关系型数据库的区别 3、编…

“Vue进阶:深入理解插值、指令、过滤器、计算属性和监听器“

目录 引言:Vue的插值Vue的指令Vue的过滤器Vue的计算属性和监听器vue购物车案例总结: 引言: Vue.js是一款流行的JavaScript框架,它提供了许多强大的功能来简化前端开发。在本篇博客中,我们将深入探讨Vue的一些高级特性…

【计算机基础知识】计算机的概念

欢迎来到我的:世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 目录 前言1.计算机的概念计算机的发展历程知识拓展: 计算机的特点计算机的分类 2.计算机的应用计算机的发展趋势知识拓展: 总结 前言 美…

双翌保养码使用指南方法三

保养码使用指南方法三:WiseAlign版本 为了保障您能够顺利使用软件,使之正常运行和合规使用,如何正确使用保养码显得尤为重要。以下是针对 WiseAlign软件的保养码使用指南,帮助您顺利进行激活操作。 步骤一:打开软件并…

uniapp:不同权限设置不同的tabBar

1、在pages.json里,将所有tabBar涉及的页面都加进来。 我这里使用username来动态显示tabBar。 jeecg用户显示:首页,订单,消息,发现,我的,一共5个tabBar。 admin用户显示:首页&…

喜报:项目验收季之陕西融通军民服务社会议室大屏系统项目建设顺利通过竣工验收

由达之云承建的陕西融通军民服务社会议室大屏系统项目建设日前完满完成各项建设任务,建设成果达到预期项目建设目标,并于9月19日顺利通过项目竣工验收。 陕西融通军民服务社有限公司会议大屏系统建设项目为大会议室增加一套视频会议系统,将原…

同为科技(TOWE)工业用插头插座及配电箱产品选型推荐

工业用插头插座及配电箱产品是专用于工业环境中的电源连接和电气设备控制,与普通家用插头插座相比,通常具有更高的功率和电流容量,并且设计上考虑了耐用性、安全性和适应各种环境条件的能力。工业用插头插座产品类型多样,包括插头…

【数仓建设系列之六】数仓管理利器-数据中台

【数仓建设系列之六】数仓管理利器-数据中台介绍 相信看过前面几篇数仓建设系列文章的同学已经对什么是数仓以及如何建设数仓有了充分的认知和了解了,那么问题很多的小明就要问了,既然数仓已经建设起来了,那企业如何管理运营数仓呢&#xff1…

WorkPlus打造智慧企业移动门户,开启高效办公新时代

在移动互联网时代,企业对于高效办公和便捷访问的需求不断增长。WorkPlus作为领先的品牌,致力于打造智慧企业移动门户,帮助企业实现高效协作与便捷访问。本文将重点介绍WorkPlus如何通过创新解决方案,为企业提供定制化的智慧移动门…

Python画图系列——折线图

好看的折线图 import numpy as np import matplotlib.pyplot as plt# 生成随机数据 # np.random.seed(42) # 设置随机种子以确保可重复性 sample_numbers np.arange(1, 21) # 生成1到20的样本编号random_data np.random.rand(20) # 生成20个随机数,范围在0到1之…

企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所…

文字处理工具 word 2019 mac中文版改进功能

Microsoft Word 2019 是微软公司的文字处理软件,是 office 2019 套件中的一部分。它是一个功能强大、易于使用的工具,可以帮助用户创建各种类型的文档,包括信函、简历、报告、手册等。 Word 2019 提供了许多功能和改进,包括更好的…

Day 02 python学习笔记

python运算符 算术运算符 混合运算的优先级: () > ** * / // % 高于 - 赋值运算符 - * / ** a 1 > a 3 > a a 3 其余同理 注意: python没有自增自减 (a a a-- --a&#xff0…

华为技术有限公司副总裁、计算产品线总裁张熙伟一行到访湖南欧拉生态创新中心座谈交流

9月16日下午,华为技术有限公司(简称:华为)副总裁、计算产品线总裁张熙伟一行到访湖南欧拉创新中心开展座谈交流。麒麟信安董事长杨涛,麒麟信安高级副总裁刘坤、陈松政,副总裁王攀、颜跃进等参加交流。 华为…

【HTTP】Cookie 和 Session 详解

Cookie 和 Session 一. Cookie1. 什么是 Cookie2. Cookie 的作用3. Cookie 的组成4. Cookie 的组织形式5. Cookie 的传输6. 如何提高 Cookie 的安全性7. Cookie 类 二. Session1. 理解会话机制 (Session)2. Sessoin 的组织形式3. HttpSession 类 三. Cookie 和 Session 的联系与…