指针强化练习(详解)

更多学习内容
结构体内存对齐 和 位段-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.mzph.cn/news/783304.shtml

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

相关文章

安装即启动?探索流氓App的自启动“黑科技” (Android系统内鬼之ContentProvider篇)

前段时间发现了一个神奇的app&#xff0c;它居然可以在安装之后立即自启动&#xff1a; 看到没有&#xff0c;在提示安装成功大概1到2秒后&#xff0c;就直接弹出Toast和通知了&#xff01; 好神奇啊&#xff0c;在没有第三方app帮忙唤醒的前提下&#xff0c;它是怎么做到首次安…

C++2D原创我的世界1.00.3版本上市!!!

我很郁闷&#xff0c;为什么就是整不了昼夜交替啊喂&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 虽然这看上去很简单&#xff0c;但做起来要我命&#xff01;&#xff01;&#xff01; 优化过后总共1312行&#xff0c…

DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧

遍历是指通过或遍历节点树 遍历节点树 通常&#xff0c;您想要循环一个 XML 文档&#xff0c;例如&#xff1a;当您想要提取每个元素的值时。 这被称为"遍历节点树"。 下面的示例循环遍历所有 <book> 的子节点&#xff0c;并显示它们的名称和值&#xff1a;…

Qt主窗口 之:停靠/悬浮窗口(QDockWidget)

一、QDockWidget概述 QDockWidget 是 Qt 中的一个窗口部件&#xff0c;用于创建可停靠的窗口&#xff0c;通常用于构建多文档接口&#xff08;MDI&#xff09;或可定制的用户界面。QDockWidget 允许用户将窗口停靠在应用程序的主窗口周围&#xff0c;或将其拖动到独立的浮动窗…

门控循环单元(GRU)

概述 门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;由Junyoung Chung等人于2014年提出&#xff0c;原论文为《Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling》。GRU是循环神经网络&#xff08;Recurrent Neural Network, …

实现富文本的三部曲

1、引入 ueditor.config.js ueditor.all.min.js lang/zh-cn/zh-cn.js 2、编辑器显示处 id"content" <textarea id"content" name"content"></textarea> 3、底部 <script type"text/javascript"> //实例化编辑器 …

2024.3.30学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p295-p314 super关键字 super代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器 super细节和语法 访问父类的属性&#xff0c;但不能访问父类的private属性 super.属性名 访问父类的…

回溯算法|39.组合总和

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {if (sum > target) {return;}if (sum target) {result.push_back…

Flutter(踩坑)之Android sdkmanager tool not found

D:\Flutter\flutter\bin\flutter.bat doctor --verbose [√] Flutter (Channel stable, v1.2.1, on Microsoft Windows [Version 10.0.22631.3296], locale zh-CN)• Flutter version 1.2.1 at D:\Flutter\flutter• Framework revision 8661d8aecd (5 years ago), 2019-02-14 …

【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.…

Flutter 全局控制底部导航栏和自定义导航栏的方法

1. 介绍 导航栏在移动应用中扮演着至关重要的角色&#xff0c;它是用户与应用之间进行导航和交互的核心组件之一。无论是简单的页面切换&#xff0c;还是复杂的应用导航&#xff0c;导航栏都能够帮助用户快速找到所需内容&#xff0c;提升用户体验和应用的易用性。 在移动应用…

Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)

What can I say? 2024年我还能说什么&#xff1f; Mamba out! 曼巴出来了&#xff01; 原文链接&#xff1a; [2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Mamba: Linear-Time …

进程等待+替换

✨MyShell实现✨ c并发编程&#xff08;书籍&#xff09; ✨进程等待  ✨wait/waitpid   ✨代码示例  ✨coredump   ✨什么是coredump   ✨开启coredump功能   ✨示例代码   ✨退出码 ✨进程替换  ✨原理  ✨进程替换接口一览  ✨实现一个shell  ✨myshell反思…

单链表就地逆置

算法思想&#xff1a;构建一个带头结点的单链表L&#xff0c;然后访问链表中的每一个数据结点&#xff0c;将访问到的数据结点依此插入到L的头节点之后。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef s…

【学习】软件科技成果鉴定测试有何作用

软件科技成果鉴定测试是针对软件进行项目申报、科技成果鉴定等相关目的进行的测试。软件测试报告可作为项目申报、科技成果鉴定等工作的依据之一。软件类科技成果鉴定测试从软件文档、功能性、使用技术等方面对软件系统进行符合性测试。其测试结果证明软件的质量是否符合技术合…

智能指针(C++11)

智能指针的使用 问题 我们在平时写程序的时候&#xff0c;有些情况下不可避免地会遇见内存泄露的情况。内存泄露是指因为疏忽或错误&#xff0c;造成程序未能释放已经不再使用的内存的情况。例如下面这个例子&#xff0c;内存泄漏不易被察觉。 int div() {int a, b;cin >…

Vue tree自定义滚动条位置

贴一张效果图&#xff0c;我的效果不方便贴出来 实现支持&#xff1a; 1、懒加载 2、普通加载 下面贴关键思想&#xff1a; document有一个获取element元素的方法。 let element document.getElementById(tree); let arr document.querySelectorAll(".nodelModel&quo…

【JDK常用的API】包装类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

【IDEA】安装教程

目录 一、安装IDEA 二、激活IDEA 总结 一、安装IDEA 点击idea安装包->点击next->选择安装的路径->勾选创建桌面的快捷方式->勾选将bin目录添加到环境变量->勾选文件夹当做项目工程 打开下面这四个不勾选&#xff0c;勾选表示打开文件将以下面的格式打开 安装…

Python绘制线图之plt.plot()的介绍以及使用

在Python中plt.plot是matplotlib库中的一个函数,用于绘制点和线,并对其样式进行控制,下面这篇文章主要给大家介绍了关于Python绘制线图之plt.plot()的介绍以及使用的相关资料,需要的朋友可以参考下 plt.plot() 是Matplotlib库中用于绘制线图&#xff08;折线图&#xff09;的主…