指针强化练习(详解)

更多学习内容
结构体内存对齐 和 位段-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)的函数指针。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA 2023 for Mac 好用的Java开发工具

IntelliJ IDEA 2023是一款由JetBrains开发的强大的集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;适用于多个编程语言。它旨在提高开发人员的生产力和代码质量&#xff0c;具有以下多种特色功能&#xff1a; 软件下载&#xff1a;IntelliJ IDEA 2023 v2023.3.6中文激…

mixly编译esp32程序缺失问题bits/c++config.h

错误信息&#xff1a; 编译中... 使用平台的 ‘esp32’ 开发板&#xff0c;在列出的文件夹中&#xff1a;D:\windowsoftInstalled\mixly\mixly2.0-win32-x64\arduino-cli\Arduino15\packages\esp32\hardware\esp32\2.0.7 使用平台的 ‘esp32’ 代码&#xff0c;在列出的文件夹…

【MySQL】DQL-排序查询-语法&排序方式&注意事项&可cv例题语句

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

使用python实现i茅台自动预约

使用python实现i茅台自动预约[仅限于学习,不可商用] 运行: 直接运行 imtApi.py 打包:切换到imt脚本目录,执行打包命令: pyinstaller --onefile imtApi.py这个应用程序可以帮助你进行茅台自动化配置。以下是一些使用说明: 平台注册账号(可用i茅台)不用登录,你可以进行…

【数据分析面试】5.地址信息数据清洗合并 (Python)

题目 有两个数据框。一个包含有关地址的信息&#xff0c;另一个包含了不同城市和州之间的关系。 示例&#xff1a; df_addresses address4860 Sunset Boulevard, San Francisco, 941053055 Paradise Lane, Salt Lake City, 84103682 Main Street, Detroit, 482049001 Casca…

hackmyvm———Quick4之tar命令注入

目录 1.信息收集 2.目录扫描 3.文件上传 ​4.提权 简介&#xff1a;HackMyVm是一个集合了大量靶机的平台&#xff0c;通过下载压缩包后导入Vm虚拟机来使用&#xff0c;推荐使用VirtualBox来导入加载漏洞虚拟机。类似于Vulnhub、HackTheBox&#xff0c;但是相比于Vulnhub而言…

利用TensorRT在jetson orin 上加速YOLOv5

一、第一种方法&#xff0c;需要下载各种包&#xff1a; 要用到一个大佬的开源&#xff0c;GitHub地址如下&#xff1a; https://github.com/wang-xinyu/tensorrtx/tree/master/yolov51. 安装pycuda&#xff0c;在线安装pycuda pip3 install pycuda 或者&#xff1a; sudo…

数据结构之单链表实现(JAVA语言+C语言)

一、理论 1 单链表结构 2 增、删、查 、改思路 &#xff08;增&#xff09;直接添加放到最后即可。按顺序添加&#xff1a;找到要修改的节点的前一个节点&#xff0c;插入新节点&#xff08;&#xff09;。&#xff08;改&#xff09;要修改的节点修改内容即可。&#xff08;…

STM32+ MAX30102通过指尖测量心率+血氧饱和度

一、前言 重要的事情放在最前面&#xff1a;max30102只适用于指尖手指测量&#xff0c;不适用与手腕手指测量&#xff0c;如需做成可穿戴样式选择传感器的小伙伴请pass掉他&#xff0c;因为他只有红光和红外2种光&#xff0c;不够充足的数据源去运算。 由于一些原因&#xff0c…

阿基米德分牛问题及其Python求解

文章目录 题目大意sympy求解结果 题目大意 问 太阳神有一牛群&#xff0c;由白、黑、花、棕四种颜色的公、母牛组成&#xff0c;其间关系如下&#xff0c;求每种牛的个数。 公牛中&#xff0c;白牛多于棕牛&#xff0c;二者之差为黑牛的 1 2 1 3 \frac{1}{2}\frac{1}{3} 21​…

排序——交换排序(冒泡排序与快速排序)

本专栏和大家分享关于排序的算法,其中有插入排&#xff08;直接插入排序和希尔排序&#xff09;、选择排序&#xff08;直接选择排序和堆排&#xff09;、交换排序&#xff08;冒泡排序和快速排序&#xff09;、归并排序以及其他非基于比较的排序 本文与大家分享交换排序 目录 …

SAP FICO 银企直联

银企直联是指企业通过互联网或专线连接的方式&#xff0c;使企业的SAP系统与商业银行的业务系统通过特定的数据接口实现连接&#xff0c;在SAP系统中可以直接查询银行账户的余额和明细&#xff0c;实现付款、银企对账、自动出具余额调节表等功能。 在这主要介绍SAP相关CALLSS配…

C++—vector的介绍及使用 vector的模拟实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

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

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

【递归】有序分数(SBT)

给定一个整数 N&#xff0c;请你求出所有分母小于或等于 N&#xff0c;大小在 [0,1][0,1] 范围内的最简分数&#xff0c;并按从小到大顺序依次输出。 例如&#xff0c;当 N5时&#xff0c;所有满足条件的分数按顺序依次为&#xff1a; 0/1,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4…

Python | Leetcode Python题解之第1题两数之和

题目&#xff1a; 题解&#xff1a; class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:n len(nums)for i in range(n):for j in range(i 1, n):if nums[i] nums[j] target:return [i, j]return []

GT收发器PHY层设计(4)上板验证

文章目录 前言一、实验平台二、通道1收发数据三、通道2收发数据 前言 在前面三篇内容当中详细介绍了基于GT的PHY设计&#xff0c;本篇内容进行上板测试&#xff0c;主要查看接收数据是否能正确对齐 一、实验平台 俩个光口相互通信&#xff0c;即1发2收&#xff0c;2发1收 发…

C++要学到什么程度才能找到实习?

在考虑 C 学习到何种程度可以找到实习时&#xff0c;以下是一些具体的方向和建议。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我…

Win11 家庭版/专业版开启Hyper-V

​ 目录 收起 一、安装Hyper-V 二、启用Hyper-V Hyper-V是Windows专业版专属功能&#xff0c;但大多数&#xff08;除商业本&#xff09;品牌机内置的Windows都是家庭版。只能通过命令开启&#xff0c;方法如下&#xff1a; Windows专业版请直接阅读启用Hyper-V部分 一、安装Hy…

云服务器4核8G配置优惠价格表,买一年送3个月,12M公网带宽

腾讯云轻量4核8G12M服务器优惠价格646元15个月&#xff0c;买一年送3个月&#xff0c;配置为轻量4核8G12M、180GB SSD盘、2000GB月流量、12M带宽&#xff0c;腾讯云优惠活动页面 yunfuwuqiba.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器租用价格 腾讯云&…