指针强化练习(详解)

news2024/11/26 14:51:26
更多学习内容
结构体内存对齐 和 位段-CSDN博客
指针初级(基础知识)-CSDN博客
指针进阶(深入理解)-CSDN博客

目录

1.sizeof与strlen的区别

2.一维数组

3.字符指针

4.二维数组

5.指针运算(笔试题)

6.函数指针


1.sizeof与strlen的区别

请思考以下运行结果

        #include <stdio.h>
        int main()
        {
                char arr1[3] = {'a', 'b', 'c'};
                char arr2[] = "abc";
                printf("%d\n", strlen(arr1));
                printf("%d\n", strlen(arr2));
                printf("%d\n", sizeof(arr1));
                printf("%d\n", sizeof(arr1));
                return 0;
        }

结果为: 随机值,3,3,4
 

2.一维数组

请思考以下运行结果

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

结果为164或844或844或8164或84或84或8

3.字符指针

请思考以下运行结果

代码1

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

结果为6,1,1,4/8,4/8,4/8

代码2

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

结果为随机值n,随机值n,?,?,随机值n,随机值n-6,随机值n-1

代码3

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

结果为7,4/8,1,1,4/8,4/8,4/8

代码4

        char arr[] = "abcdef";
        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));

结果为6,6,?,?,6,随机值,5

代码5

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

结果为4/8,4/8,1,1,4/8,4/8,4/8

代码6

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

结果为6,5,?,?,6?,随机值,5

4.二维数组

请思考以下运行结果

        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]));

结果为48,4,16,4/8,4,4/8,16,4/8,16,16,16

5.指针运算(笔试题)

请思考以下运行结果

试题1

        #include <stdio.h>
        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,5

试题2

        struct Test
        {
                int Num;
                char *pcName;
                short sDate;
                char cha[2];
                short sBa[4];
        }*p = (struct Test*)0x100000;
        int main()
        {
                printf("%p\n", p + 0x1);
                printf("%p\n", (unsigned long)p + 0x1);
                printf("%p\n", (unsigned int*)p + 0x1);
                return 0;
         }

结果为00100020,00100001,00100004(32位机器)

以上结构体内存布局如下:

这里涉及到结构体内存对齐的知识,不理解可以点击链接学习

试题3
        #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;
         }

结果为1

试题4

        #include <stdio.h>
        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;
        }

结果为FFFFFFFC ,4

注意:二维数组在物理内存上储存其实是连续的

内存布局为:

注意:指针减指针得到的是指针之间的元素个数,而不是地址的差值

试题5

        #include <stdio.h>
        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));
                return 0;
        }

结果为10,5

试题6

        #include <stdio.h>
        int main()
        {
                char *a[] = {"work","at","alibaba"};
                char**pa = a;
                pa++;
                printf("%s\n", *pa);
                return 0;
        }

结果为at

试题7

        #include <stdio.h>
        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;
        }

结果为POINT ER ST  EW

做这样的题一定要学会画图,画出图结果就一幕了然了,如下:

:看题解的时候要看图理解

6.函数指针

请解释以下代码:

这段代码表示把0强制类型转化为void(*)()这样的函数再进行解引用进行调用

这段代码出⾃:《C陷阱和缺陷》这本书以下图片为书中所取

请解释以下代码:

这是表示一个函数名signal参数类型int和void()(int)返回类型void(*)(int)的函数指针。

指针练习就到此结束,感谢阅读

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

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

相关文章

第1章.提示词:开启AI智慧之门的钥匙

什么是提示词&#xff1f; 提示词&#xff0c;是引导语言模型的指令&#xff0c;让用户能够驾驭模型的输出&#xff0c;确保生成的文本符合需求。 ChatGPT&#xff0c;这位文字界的艺术大师&#xff0c;以transformer架构为基石&#xff0c;能轻松驾驭海量数据&#xff0c;编织…

Chrome浏览器隐藏的截图功能配置及使用

来自实用又方便&#xff0c;轻松打开Chrome浏览器隐藏的截图功能&#xff01;​​​​​​​ 一、通过谷歌Chrome浏览器 现在直接通过谷歌Chrome浏览器内置功能&#xff0c;免安装扩充插件也可以实现Chrome的截图和长截图功能了&#xff01; 也不需要额外安装任何截图工具 &a…

【C++航海王:追寻罗杰的编程之路】priority_queue(优先队列) | 容器适配器你知道哪些?

目录 1 -> priority_queue的介绍和使用 1.1 -> priority_queue的介绍 1.2 -> priority_queue的使用 1.3 -> priority_queue的模拟实现 2 -> 容器适配器 2.1 -> 什么是适配器 2.2 -> STL标准库中stack和queue的底层结构 2.3 -> deque的介绍 2.…

吐丝的蜘蛛-第15届蓝桥第5次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第176讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…

MySQL面试必备一之索引

本文首发于公众号&#xff1a;Hunter后端 原文链接&#xff1a;MySQL面试必备一之索引 在面试过程中&#xff0c;会有一些关于 MySQL 索引相关的问题&#xff0c;以下总结了一些&#xff1a; MySQL 的数据存储使用的是什么索引结构B 树的结构是什么样子什么是复合索引、聚簇索…

嵌入式第一部分-第一集:ARM那些你得知道的事

ARM&#xff1a;Advanced RISC Machine&#xff0c;先进精简指令集机器 ARM公司只做设计&#xff0c;不生产。 国内IC生产厂商&#xff1a;华为海思、全志、瑞芯微、MTK&#xff08;联发科&#xff09; 扩展&#xff1a;ARM的商业模式了解。 使用三星S5PV210开发板进行视频的讲…

红黑树介绍及插入操作的实现

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

CubeIDE 下如何将版本号和日期关联。

1. 使用__DATE__ 和__TIME__获取编译日期和时间。 2. 将__DATE__ 和__TIME__转换成UINT 3. 将转换后的数赋值给版本号。 4. 设置工程保证每次都会重新编译对应文件。 对应函数如下&#xff1a; uint8_t VER_MAIN; uint8_t VER_SUB; uint8_t VER_MIN; #include <stdlib.…

原子类 AtomicReference 详解

通过对 AtomicInteger、AtomicBoolean 和 AtomicLong 分析我们发现&#xff0c;这三个原子类只能对单个变量进行原子操作&#xff0c;那么我们如果要对多个变量进行原子操作&#xff0c;这三个类就无法实现了。那如果要进行多个变量进行原子操作呢&#xff1f;操作方式就是&…

node.js的错误处理

当我打开一个不存在的文件时&#xff0c;错误如下&#xff1a; 在读取文件里面写入console.log&#xff08;err&#xff09;&#xff0c;在控制台中可以看到我的错误代码类型&#xff1a;文件不存在的错误代码 ENOENT。见更多错误代码---打开node.js官方API文档Error 错误 | N…

AtCoder Beginner Contest 347 A - E

A - Divisible 大意 给定个数&#xff0c;对于其中能被整除的数&#xff0c;输出商。 思路 直接计算即可。 代码 #include<iostream> using namespace std; int main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, k;cin >> n >> k;while…

IDEA 详细设置

详细设置 如何打开详细配置界面 1、显示工具栏 2、选择详细配置菜单或按钮 系统设置 默认启动项目配置 启动IDEA时&#xff0c;默认自动打开上次开发的项目&#xff1f;还是自己选择&#xff1f; 如果去掉Reopen projects on startup前面的对勾&#xff0c;每次启动IDEA就会…

OSCP靶场--Access

OSCP靶场–Access 考点( 文件上传[黑名单apache.htaccess绕过] Kerberoasting SeManageVolume滥用提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.187 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-3…

【图轮】【 最小生成树】【 并集查找】1489. 找到最小生成树里的关键边和伪关键边

本文涉及知识点 图轮 最小生成树 并集查找 关键边 1489. 找到最小生成树里的关键边和伪关键边 给你一个 n 个点的带权无向连通图&#xff0c;节点编号为 0 到 n-1 &#xff0c;同时还有一个数组 edges &#xff0c;其中 edges[i] [fromi, toi, weighti] 表示在 fromi 和 to…

【Leetcode】2580. 统计将重叠区间合并成组的方案数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个二维整数数组 ranges &#xff0c;其中 ranges[i] [starti, endi] 表示 starti 到 endi 之间&#xff08;包括二者&#xff09;的所有整数都包含在第 i 个区间中。 你需要…

loadbalancer 引入与使用

在消费中pom中引入 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> 请求调用加 LoadBalanced 注解 进行服务调用 默认负载均衡是轮训模式 想要切换…

基于Java+SpringBoot+vue仓库管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

转移指令的原理

文章目录 转移指令的原理1. 操作符offset2. jmp指令3. 依据位移进行转移的jmp指令4. 转移的目的地址在指令中的jmp指令5. 转移地址在寄存器中的jmp指令6. 转移地址在内存中的jmp指令7. jcxz指令8. loop指令9. 根据位移进行转移的意义10. 编译器对转移位移超界的检测 转移指令的…

六种典型的商业间谍软件实例分析

近年来&#xff0c;随着数字化经济的快速发展&#xff0c;这也推动了商业间谍软件数量的急剧增长。目前&#xff0c;商业间谍软件的主要类型包括以下六种。 商业间谍软件是一种软件应用程序/脚本&#xff0c;也被称为“跟踪软件”、“监视软件”&#xff0c;主要功能包括非法数…

Kerberos 认证 javax.security.auth.logon.LoginException:拒绝链接 (Connection refused)

kerberos 服务重启之后异常 项目中用到了hive 和hdfs &#xff0c;权限认证使用了Kerberos&#xff0c;因为机房异常&#xff0c;导致了Kerberos 服务重启&#xff0c;结果发现本来运行正常的应用服务hive 和hdfs 认证失败&#xff0c;报错信息是 典型的网络连接异常 排查思路…