C语言:复习

文章目录

  • 思维导图
  • 数组和指针
  • 库函数的模拟实现
  • 判断大小端

最近知识学的差不多了,因此开始复习,本篇开始的是对于C语言的复习

思维导图

下面就依据下图,进行内容的整理

在这里插入图片描述

在这里插入图片描述

数组和指针

这个模块算是C语言中比较大的一个模块了,具体概念就不多说了,直接用例题

数组

#include <stdio.h>int main()
{//一维数组int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));    // 16printf("%d\n", sizeof(a + 0)); // 4/8printf("%d\n", sizeof(*a));    // 4printf("%d\n", sizeof(a + 1)); // 4/8printf("%d\n", sizeof(a[1]));  // 4printf("%d\n", sizeof(&a));    // 4/8printf("%d\n", sizeof(*&a));   // 16printf("%d\n", sizeof(&a + 1));// 4/8printf("%d\n", sizeof(&a[0])); // 4/8printf("%d\n", sizeof(&a[0] + 1));// 4/8//字符数组char arr[] = { 'a','b','c','d','e','f', '\0'};printf("%d\n", sizeof(arr));       // 6printf("%d\n", sizeof(arr + 0));   // 4/8printf("%d\n", sizeof(*arr));      // 1printf("%d\n", sizeof(arr[1]));    // 1printf("%d\n", sizeof(&arr));      // 4/8printf("%d\n", sizeof(&arr + 1));  // 4/8printf("%d\n", sizeof(&arr[0] + 1));// 4/8printf("%d\n", strlen(arr));   // 6printf("%d\n", strlen(arr + 0));// 6//printf("%d\n", strlen((const char*) * arr)); // ? //printf("%d\n", strlen((const char*)arr[1])); // ?printf("%d\n", strlen((const char*)&arr)); // 6printf("%d\n", strlen((const char*)(&arr + 1)));  // 未定义printf("%d\n", strlen((const char*)(&arr[0] + 1))); // 5return 0;
}

指针

int main()
{int a[5] = { 1, 2, 3, 4, 5 };int* ptr = (int*)(&a + 1);  // 指向最后一个元素的下一个位置printf("%d,%d", *(a + 1), *(ptr - 1));  // a[1] 和 a[4]return 0;
}
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;
}

接下来分析 main() 函数中的 printf 表达式:

  1. printf("%p\n", p + 0x1);
    

    在这里,p 是一个指向 struct Test 的指针,对其进行加 0x1 操作意味着指针向前偏移 0x1struct Test 类型的大小,即偏移 20 字节。因此,p + 0x1 的值为 0x100014%p 格式说明符用于打印指针的值,所以这行代码输出 0x100014

  2. printf("%p\n", (unsigned long)p + 0x1);
    

    首先,将指针 p 强制转换为 unsigned long 类型。虽然 p 的原始类型是一个指针,但转换为 unsigned long 后,它被视为一个数值。然后对这个数值加上 0x1,即 0x100000 + 0x1 = 0x100001。接着,将结果作为指针传递给 printf 函数,使用 %p 格式说明符打印。理论上,这行代码的行为是未定义的,因为 0x100001 不是一个有效的指针值。实际运行时可能会导致程序崩溃或其他不可预期的结果。

  3. printf("%p\n", (unsigned int*)p + 0x1);
    

    这里,将指针 p 强制转换为 unsigned int* 类型,即指向无符号整型的指针。由于 struct Test 大小为 20 字节,而通常情况下 unsigned int 类型为 4 字节(具体字节数可能因编译器和平台而异),所以 p 指向的对象大小与 unsigned int* 类型指针所期望的对象大小不匹配。接着,对转换后的指针加上 0x1,即偏移 4 字节。最后,将结果作为指针传递给 printf 函数,使用 %p 格式说明符打印。这行代码同样存在未定义行为,因为指针类型转换后与原始对象大小不匹配,后续操作可能导致程序崩溃或其他不可预期的结果。

综上所述:

  • 第一个 printf 表达式输出 0x100014,这是正确地对 struct Test 类型指针进行偏移后的结果。
  • 第二个和第三个 printf 表达式涉及不恰当的指针类型转换和指针运算,其行为是未定义的,可能会导致程序崩溃或其他不可预期的结果。在实际编程中应避免这类操作。
int main()
{int a[4] = { 1, 2, 3, 4 };// 1000 0000 0000 0000 0000 0000 0000 0000 // 0100 0000 0000 0000 0000 0000 0000 0000// 00        00        00        02// 0000 0000 0000 0000 0000 0000 0000 0100int* ptr1 = (int*)(&a + 1); // 最后一个元素的下一个位置int* ptr2 = (int*)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2); // 最后一个元素return 0;
}
#include <stdio.h>int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };int* p;p = a[0];printf("%d", p[0]); // p + 0 实际存储的是1 3 5 0 0 ...return 0;
}
#include <stdio.h>
int main()
{// 1, 2, 3, 4, 5// 6, 7, 8, 9, 10int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 = (int*)(&aa + 1); // 跳过了整个二维数组int* ptr2 = (int*)(*(aa + 1)); // aa[1]printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1)); // 10 5return 0;
}
#include <stdio.h>
int main()
{const char* a[] = { "work","at","alibaba" };const char** pa = a; // wpa++; // atprintf("%s\n", *pa);return 0;
}

库函数的模拟实现

void* mymemcpy(void* destination, const void* source, size_t num)
{void* res = destination;assert(destination);assert(source);while (num--){*(char*)destination = *(char*)source;destination = (char*)destination + 1;source = (char*)source + 1;}return res;
}
void* mymemmove(void* destination, const void* source, size_t num)
{void* res = destination;assert(destination);assert(source);if (destination <= source || (char*)destination >= ((char*)source) + num){destination = (char*)destination + num - 1;source = (char*)source + num - 1;while (num--){*(char*)destination = *(char*)source;destination = (char*)destination - 1;source = (char*)source - 1;}}else{while (num--){*(char*)destination = *(char*)source;destination = (char*)destination + 1;source = (char*)source + 1;}}return res;
}

判断大小端

union MyUnion
{int a;char c[4];
};
int main()
{MyUnion un;un.a = 0x123456;if (un.c[0] == 0x12)printf("大端\n");elseprintf("小端\n");return 0;
}int main()
{int a = 0x123456;char* pa = (char*)&a;if (*pa == 0x12)printf("大端\n");elseprintf("小端\n");return 0;
}

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

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

相关文章

流媒体协议--RTMP

文章目录 RTMP播放基本流程TCP握手过程RTMP握手过程connect连接createStream 创建流play 播放命令deleteStream删除流RTMP数据组成 RTMP(Real Time Messaging Protocol)是一个应用层协议&#xff0c;主要用于在Flash player和服务器之间传输视频、音频、控制命令等内容。 该协议…

【笔试强训_Day06】

文章目录 1.字符串相乘 1.字符串相乘 题目链接 解题思路&#xff1a; 高精度乘法&#xff0c;注意要学会下面这种列式相乘的形式&#x1f34e; 注意细节❗&#xff1a; ① &#x1f34e; 首先把列式相乘的数据都存放到数组中去&#xff0c; 然后再对数组中的数据进行取余进…

C++:运算符重载和“const”成员

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;运算符重载》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 赋值运算符重载1. 运算符重载2.赋值运算符重载第一个点第二个点&…

迅雷下载不了的资源怎么下载?

我想下载Boost库&#xff0c;但是下载不下来 用迅雷下载是一直卡在0k 后来尝试在centos上用wget进行下载&#xff0c;竟然可以 wget https://boostorg.jfrog.io/artifactory/main/release/1.85.0/source/boost_1_85_0.tar.gz

揭开ChatGPT面纱(一):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言&#xff1a;探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库&#xff1a;地址&#xff0c;本博客对应01文件夹。 序言&#xff1a;探索人工智能的新篇章 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为…

2024燃动智火-业务视角的中国企业AI+学习发展报告

来源&#xff1a;新华三 学习型组织的数字化转型是众多企业关注的焦点&#xff0c;数字战略需要人才升级&#xff0c;数字 化学习加速人才培养。AI 技术在学习中的运用&#xff0c;为企业学习型组织的数字化转型插 上了飞翔的翅膀。这份报告解码了AI 时代企业的学习发展&#…

混合现实(MR)开发框架

混合现实&#xff08;MR&#xff09;开发框架为开发者提供了构建MR应用程序所需的基本工具和功能。它们通常包括3D引擎、场景图、输入系统、音频系统、网络功能以及支持同时处理现实世界和虚拟世界信息的功能。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

springboot+ssm基于Java的小型企业银行账目管理系统代码Lw

本毕业设计课题要求学生基于软件工程方法&#xff0c;根据课题的需求&#xff0c;给出小型企业银行账目管理系统概要设计、详细设计、数据库的设计以及系统实现和测试&#xff0c;并撰写规范的毕业设计说明书。该系统的主要模块有&#xff1a;系统管理、帐目管理、查询统计、用…

如何使用 ArcGIS Pro 制作边界晕渲效果

在某些出版的地图中&#xff0c;边界有类似于“发光”的晕渲效果&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro 制作这种晕渲效果&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的行政区划数据&#xff0c;除了行政区划数据&#xff0c…

【Flutter】多语言方案二:GetX 版

介绍 多语言方案&#xff1a;GetX版&#xff0c;需要手动自定义字符串引用常量&#xff0c;优点不需要自己管理状态。 目录 介绍运行效果一、安装 GetX二、使用1.语言配置 在lib/core下创建一个language文件夹&#xff0c;文件夹下创建一个local.dart文件2.language文件夹下创…

程序员自由创业周记#32:新产品构思

程序员自由创业周记#32&#xff1a;新产品构思 新作品 我时常把自己看做一位木匠&#xff0c;有点手艺&#xff0c;能做一些作品养活自己。而 加一、Island Widgets、Nap 就是我的作品。 接下来在持续维护迭代的同时&#xff0c;要开启下一个作品的创造了。 其实早在2022的1…

进程间通信(1)管道

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

【C语言】内存函数-memcpy-memmove-memset...用法及实现,沉淀自己!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. memcpy函数使用和模拟实现 2. memmove使用和模拟实现 3. memset函数的使用 4. memcmp函数的使用 1. memcpy函数使用和模拟实现 <string.h>-------…

Buildroot系统构建学习笔记(以百问网imx6ullPro开发板为例)

一、Builroot是什么&#xff1f; Buildroot是一组Makefile和补丁&#xff0c;可简化并自动化地为嵌入式系统构建完整的、可启动的Linux环境(包括bootloader、Linux内核、包含各种APP的文件系统)。Buildroot运行于Linux平台&#xff0c;可以使用交叉编译工具为多个目标板构建嵌…

沉思录 (梁实秋)

链接&#xff1a;https://pan.quark.cn/s/8e27564b02f5

Python 检测当前系统的内存及硬盘资源,发送邮件告警通知(告警内容包含告警语句及网卡和系统版本时间)

颜色块 rootbogon:~ 2024-04-18 16:16:40# cat DefaultColor.py ######################################################################### # File Name: DefaultColor.py # Author: eight # Mail: 18847097110163.com # Created Time: Thu 11 Apr 2024 10:…

H3C之GRE VPN

华子目录 GRE实验测试 MGRE实验 GRE实验 第一步&#xff1a;接口配置IP地址 <H3C>sys System View: return to User View with CtrlZ. [H3C]sysname r1 [r1]int g0/0 [r1-GigabitEthernet0/0]ip add 192.168.1.1 24 [r1-GigabitEthernet0/0]int g0/1 [r1-GigabitEtherne…

短视频素材哪里去找?推荐几个视频素材免费下载的网站

高质量的资源&#xff0c;会让你的视频创作更加生动和具有吸引力。下面我为你介绍世界各地的优质无水印视频素材网站&#xff0c;以拓宽你的创作视野&#xff0c;帮助你在这个视觉革命的时代中脱颖而出。 1. 蛙学府&#xff08;中国&#xff09; 提供各种类别的优质高清视频素…

视频监控平台的web客户端看到的视频画面是黑屏时的处理方法

目录 一、问题描述 二、问题分析 &#xff08;一&#xff09;总体分析 &#xff08;二&#xff09;视频流传输问题的原因分析 1、网络问题 2、设备问题 3、配置和设置问题 4、兼容性问题 三、诊断和排查步骤 &#xff08;一&#xff09;编码方式问题的处理办法 &…

Redis中的订阅发布(一)

订阅发布 概述 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBER命令&#xff0c;客户端可以订阅一个或多个频道&#xff0c;从而成为这些频道的订阅者(subscribe)&#xff1a; 每当有其他客户端向被订阅的频道发送消息(message)时&…