c语言进阶(3)——指针进阶笔试题详解

news2024/10/6 2:25:09

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

关键:数组名在两种情况下是指整个数组:
(1)sizeof(数组名)(2)&数组名
其它的情况下,都是代表数组的首元素地址。

例题 1 :一维数组

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

printf("%d\n", sizeof(a));
//此时的表达式只是数组名a,代表的是整个数组,sizeof计算的是整个数组的大小,为4*4=16个字节。

printf("%d\n", sizeof(a + 0));
//a+0是表达式,数组名a代表的是数组的首元素地址,为int型指针变量,
//+0后还是int型指针变量,大小是4/8个字节。

printf("%d\n", sizeof(*a));
//*a不是单纯的数组名,a表示的首元素的地址,解引用后为int整数1,其大小是4个字节。

printf("%d\n", sizeof(a + 1));
//a+1是表达式,数组名a表示的是首元素的地址,为int型指针变量,
//+1后还是int型指针变量,大小是4/8个字节。

printf("%d\n", sizeof(a[1]));
//a[1]表示的整型2,为int变量,其大小是4个字节

printf("%d\n", sizeof(&a));
//此时的数组名a表示的整个数组,&a后表示的数组指针,是指针,占4/8个字节

printf("%d\n", sizeof(*&a));
//此时的数组名a表示的是整个数组,&a后解引用后是数组名a,此时单纯的数组a,表示的整个数组
//其大小是4*4=16个字节

printf("%d\n", sizeof(&a + 1));
//&a是整个数组的地址,+1后还是表示地址,是地址,其大小是4/8

printf("%d\n", sizeof(&a[0]));
//数组首元素取地址,是地址,其大小是4/8

printf("%d\n", sizeof(&a[0] + 1));
//数组首元素取地址后+1还是表示地址,是地址,其大小是4/8。

return 0;

}

例题 2 :字符数组

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

printf("%d\n", sizeof(arr));
//数组名表示这个数组,计算的整个数组的大小,为1*6=6

printf("%d\n", sizeof(arr + 0));
//此时为表达式,数组名表示的首元素的地址,+0之后还是地址,是地址,其大小为4/8

printf("%d\n", sizeof(*arr));
//数组名arr此时为数组首元素,解引用后为字符‘a’,其大小为1个字节

printf("%d\n", sizeof(arr[1]));
//此时计算的数组第二元素‘b’,其大小为1个字节

printf("%d\n", sizeof(&arr));
//此时数组名为整个数组,&arr 代表是数组指针,是指针,是地址,其大小为4/8

printf("%d\n", sizeof(&arr + 1));
//此时数组名为整个数组,&arr代表的是数组指针,加一后还是指针,是地址,其大小为4/8个字节

printf("%d\n", sizeof(&arr[0] + 1));
//&a[0]是char*类型的指针,加一后还是指针,是地址,其大小为4/8个字节。

return 0;

}
#include<string.h>
int main()
{
char arr[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’ };

printf("%d\n", strlen(arr));
//此时的数组名是首元素的地址,但是该数组没有以'\0'结尾,所得的值是随机的

printf("%d\n", strlen(arr + 0));
//同上

printf("%d\n", strlen(*arr));
//此时的数组名是首元素的地址,解引用后是‘a’->97 ,此时非法访问地址97,error

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;

}

int main()
{
char* p = “abcdef”;

printf("%d\n", sizeof(p));
//p是一个char *类型的指针,是地址,其大小为4/8个字节

printf("%d\n", sizeof(p + 1));
//同上

printf("%d\n", sizeof(*p));
//p指向的是字符串的首元素a的地址,解引用后得到字符a,其大小为1个字节。

printf("%d\n", sizeof(p[0]));
//同上

printf("%d\n", sizeof(&p));
//&p是得到变量p的地址,是二级指针,是地址,其大小为4/8

printf("%d\n", sizeof(&p + 1));
//同上

printf("%d\n", sizeof(&p[0] + 1));
//&p[0]得到的是字符a的地址,加一后还是地址,是地址,其大小为4/8

printf("%d\n", strlen(p));
//得到整个字符串的长度6

printf("%d\n", strlen(p + 1));
//得到5

printf("%d\n", strlen(*p));
//*p得到字符‘a’==97,非法访问  error

printf("%d\n", strlen(p[0]));
//同上

printf("%d\n", strlen(&p));
//&p得到的是变量p的地址,不知道结束符在哪,是随机值

printf("%d\n", strlen(&p + 1));
//同上

printf("%d\n", strlen(&p[0] + 1));
//&p[0]得到的是字符a的地址,加1后得到的是字符b的地址,得到5

return 0;

}

int main()
{
char arr[] = “abcdef”;
printf(“%d\n”, sizeof(arr));
//此时数组名arr是整个数组的地址,其大小为7*1=7

printf("%d\n", sizeof(arr + 0));
//此时数组名是首元素的地址,是char*类型的数据,其大小为4/8个字节

printf("%d\n", sizeof(*arr));
//此时数组名为首元素的地址,解引用后是a,char类型,其大小为1个字节

printf("%d\n", sizeof(arr[1]));
//arr[1]为字符b,为char类型,其大小为1个字节

printf("%d\n", sizeof(&arr));
//此时的数组名是整个数组的地址,是数组指针,是地址,其大小为4/8

printf("%d\n", sizeof(&arr + 1));
//此时的数组名是整个数组的地址,,是数组指针,加1后还是数组值,是地址,其大小为4/8个字节

printf("%d\n", sizeof(&arr[0] + 1));
//&arr[0]是字符a的地址,是char*类型的指针,+1后还是指针,是地址,其大小为4/8个字节


printf("%d\n", strlen(arr));
//此时数组名是首元素的地址,得到6

printf("%d\n", strlen(arr + 0));
//同上

printf("%d\n", strlen(*arr));
//*arr指的是字符a,非法访问--error

printf("%d\n", strlen(arr[1]));
//同上

printf("%d\n", strlen(&arr));
//此时的数组名是整个数组的地址,是首元素的地址,可得到6

printf("%d\n", strlen(&arr + 1));
//此时数组名是整个数组的地址,+1跳过整个数组,不知道结束符在哪里,得到的值是随机的

printf("%d\n", strlen(&arr[0] + 1));
//&arr[0]+1是字符b的地址,得到5

return 0;

}

例题3 :二维数组

int main()
{
//二维数组
int a[3][4] = { 0 };

printf("%d\n", sizeof(a));
//此时的数组名是整个数组,其大小为3*4*4=48

printf("%d\n", sizeof(a[0][0]));
//是整数0,是int类型,其大小为4个字节

printf("%d\n", sizeof(a[0]));
//此时a[0]首行的数组名,是整行的数组,大小为4*4=16

printf("%d\n", sizeof(a[0] + 1));
//此时a[0]是首行数组首元素的地址,+1后还是int*类型的指针,是地址,其大小为4/8

printf("%d\n", sizeof(*(a[0] + 1)));
//由上知道,解引用后是int类型的整数,其大小为4

printf("%d\n", sizeof(a + 1));
//此时数组名a是首元素的地址,首元素是int [4]类型的数组,
//加1后是第二行的数组地址,是地址其大小就是4/8

printf("%d\n", sizeof(*(a + 1)));
//由上知,a+1是第二行的地址,解引用后int [4]类型的数组,其大小为4*4=16

printf("%d\n", sizeof(&a[0] + 1));
//此时a[0]是第一行数组名,&a[0]取得是第一行数组的地址,+1后是第二行数组的地址,是地址其大小就是4/8

printf("%d\n", sizeof(*(&a[0] + 1)));
//由上知&a[0] + 1是第二行的地址,解引用后是int [4]类型的数组,其大小为4*4=16

printf("%d\n", sizeof(*a));
//*a得到首元素a[0],是第一行数组的数组名,此时是第一行数组的整个数组,其大小为4*4=16

printf("%d\n", sizeof(a[3]));
//如果数组存在第四行,a[3]就是第四行的数组名,
//数组名单独放在sizeof内部,计算的是第四行的大小4*4=16

return 0;

}

总结

数组名在两种情况下是指整个数组:
(1)sizeof(数组名)(2)&数组名
其它的情况下,都是代表数组的首元素地址。

2.指针笔试题

题目 1:

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

在这里插入图片描述

题目 2:

//结构体的大小是20个字节
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
printf(“%p\n”, p + 0x1);
printf(“%p\n”, (unsigned long)p + 0x1);
printf(“%p\n”, (unsigned int *)p + 0x1);
return 0;
}
在这里插入图片描述

题目 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);
return 0;
}
在这里插入图片描述

题目 4:

#include <stdio.h>
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;
}
在这里插入图片描述

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

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

相关文章

【算法面试】算法在面试中考察的是什么(金三银四面试专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/Liunx内核/C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1f4…

Kafka消息中间件

Kafka消息中间件 同时市场上也发展处ActiveMq、RabbitMQ、Kafka、RocketMQ、Pulsar等众多优秀的框架&#xff1b;在大数据领域中Kafka目前是使用较多的框架。Kafka作为内部消息通知的框架&#xff0c;可以适应项目中大数据量的高吞吐、实时流计算等功能实现。 分布式消息中间…

【自学C++】C++整型

C整型 C整型教程 C 的整型用来存放整数 类型 的数字&#xff0c;即不可以带小数&#xff0c;C 整型可以分为短整型 short&#xff0c;整型 int&#xff0c;长整型 long 和 long long 类型。 C整型取值范围 数据类型取值范围字节数short-32768 ~ 327672int-2147483648 ~ 214…

小米万兆路由器里的Docker安装drawio

小米2022年12月份发布了万兆路由器&#xff0c;里面可以使用Docker。 今天尝试在小米的万兆路由器里安装drawio 20.8.3。 准备工作 请参考https://engchina.blog.csdn.net/article/details/128515422的准备工作。 查看Docker Hub镜像信息 访问https://hub.docker.com/r/jgr…

axios系列之并发

文章の目录一、axios.all(iterable)二、axios.spread(callback)写在最后处理并发请求的助手函数 一、axios.all(iterable) function a() {return axios.get("http://localhost/a"); } function b() {return axios.get("http://localhost/b"); }axios.all…

【Linux 进程控制】进程创建、进程终止、进程等待、进程替换

1.进程创建&#xff08;fork&#xff09;#include<iostream> #include<unistd.h> using std::cout; using std::endl;int main() {if(fork()0){cout<<"child:"<<"I am child"<<endl;}else{cout<<"parent:"&…

用555定时器接成的施密特触发器电路/滞回电压比较器中,用什么方法能调节回差电压的大小?包含工作原理与应用

一、简答:电源电压或外接控制电压改变时&#xff0c;可以改变回差电压的大小。二、施密特触发器电路工作原理&#xff1a;滞回电压比较器&#xff0c;又名施密特触发器&#xff0c;有两个稳定状态&#xff0c;与一般触发器不同的是&#xff0c;施密特触发器采用电位触发方式&am…

【免杀】通用shellcode原理及思路——FS段寄存器获取kernel32.dll基址逻辑、根据函数名进行查找逻辑、双指针循环遍历获取函数名称

通用shellcode通用shellcode思路FS段寄存器获取kernel32.dll基址逻辑根据函数名进行查找逻辑双指针循环遍历获取函数字符串总结通用shellcode思路 1、保存相关字符串 user32.dll、LoadLibraryA、GetProcAddress、MessageBoxA、hello 51hook 2、通过fs寄存器获取kernel32.dll…

8.Isaac教程--在Kaya上运行IsaacSDK

在Kaya上运行IsaacSDK 构建自己的 NVIDIA Kaya 机器人后&#xff0c;请按照本页中的步骤在其上运行一些示例应用程序。 文章目录在Kaya上运行IsaacSDK安装和设置操纵杆应用程序跟随我的应用程序物体检测应用地图应用安装和设置 在 Kaya 上运行应用程序之前完成这些先决条件步…

Jenkins+Git+Maven自动化部署配置

JenkinsGitMaven自动化部署配置基本思路1、jenkins安装maven依赖2、git安装3、Jenkins中新建任务3.1 git配置3.2 maven配置3.3 pom.xml配置3.4 build4、自动化发布到测试服务器并自动执行(Test-server)4.1 安装Publish Over SSH插件4.2 修改Post Steps配置4.3 执行构建5、小插曲…

实战6 :基于mmdetection搭建Faster R-CNN实现酒液杂质检测

项目介绍: 本教程讲述如何解决依赖运动变化来区分目标的目标检测问题。以酒液杂质目标检测为例,讲述如何合理利用运动的酒液图像来设计算法进行杂质的检测。通过学习掌握依赖运动变化区分目标的检测任务的解决方法。首先我们对酒液杂质检验任务做了简要介绍。接下来再对数据…

【C进阶】qsort函数详解

qsort函数前言qsort函数&#xff08;一&#xff09;引例&#xff1a;简单的冒泡排序&#xff08;二&#xff09;qsort函数接收1.介绍2.void*&#xff08;三&#xff09;使用1.用qsort实现一个比较整型的函数2.用qsort实现一个比较结构体的函数3.用qsort实现一个比较浮点型的函数…

试读:目标检测定义及技术详解

1.通用目标检测Generic Object Detection定义 目标检测旨在从图像、视频或者类似高维数据中定位大量预定义类别的物体实例&#xff0c;原始的图像、视频或类似数据经过数据预处理后&#xff0c;进入目标检测模型进行前向预测&#xff0c;最终得到数据中每个实例的位置以及该实…

Compose 动画入门 (一) : animateXxxAsState 实现放大/缩小/渐变等效果

1. 前言 动画是Android Compose中很重要的一块内容。利用Compose可以简洁地定义动画&#xff0c;我们可以轻松快速地通过动画让应用变得生动有趣。 本文会介绍如何定义一个最简单的Compose动画&#xff0c;从而实现Compose动画。 1.1 定义一个Box 首先&#xff0c;我们先定义…

关于volatile解决内存可见性问题(保证线程安全)

Volatile是和内存可见性问题是密切相关的。先看下面一段代码&#xff0c;执行结果是什么&#xff1f; class MyCount{public int flag 0; } public class ThreadDemo15 {public static void main(String[] args) {MyCount myCount new MyCount();Thread t1 new Thread(()-&…

B站涨粉十万+!B站up主如何吸引高质量粉丝?

如何在b站快速增长粉丝&#xff0c;b站如何快速涨粉丝&#xff0c;这是所有Up主都关心的问题&#xff0c;对于初来乍到B站的up主来说&#xff0c;发布的作品内容是极为重要的&#xff0c;B站最初的粉丝积累往往都是靠这些在B站生产的视频。作品是否精彩&#xff0c;能否吸引粉丝…

AutoCAD打开文件提示“无法识别的版本,不能读取”

今天遇到一个很奇怪的问题&#xff0c;在CAD中执行自己创建的命令并关闭文档之后&#xff0c;重新打开CAD提示“无法识别的版本&#xff0c;不能读取”错误对话框。 后来查询资料&#xff0c;发现这是CAD的一个老bug了。原因是该dwg文档所在的目录下某个文件的文件名以“无”开…

MATLAB-常微分方程求解

MATLAB中可以用来求解常微分方程(组)的函数有ode23、 ode23s、 ode23t、 ode23tb 、ode45、ode15s和odel13等&#xff0c;见下表。它们的具体调用方法类似&#xff0c;为了方便后面的描述&#xff0c;在后面的介绍中将使用solver统一代替它们。函数的具体调用方法如下。[T,Y] s…

简述 synchronized 和 ReentrantLock 之间的区别?

相同点 synchronized 和 ReentrantLock 都是 Java 中提供的可重入锁。 可重入锁&#xff1a;什么是 “可重入”&#xff0c;可重入就是说某个线程已经获得某个锁&#xff0c;可以再次获取锁而不会出现死锁。 不同点 用法不同&#xff1a;synchronized 可以用来修饰普通方法、静…

红中私教:使用wamp64配置靶场

应朋友请求&#xff0c;出一篇配服务器的教程 首先安装软件 https://cowtransfer.com/s/9db1b9ad2c1d44 点击链接查看 [ wampserver3.3.0_x64.exe ] &#xff0c;或访问奶牛快传 cowtransfer.com 输入传输口令 pgs341 查看&#xff1b; 接下来&#xff0c;使用HbuilderX打开我…