c语言专题

C语言 — 入门专题(N诺) C语言机试——入门专题,刷题总结 阅读详情

本篇作为一个引子,领着大家梳理c语言中难点或容易忽视的知识点,知识点以专题形式展开。

专题一 结构占用内存长度
在linux/windows上运行下面一段程序,你能总结出struct内存对齐规则吗?

struct ta {
    short b;
    long a;
    char c;
};


struct tb {
    short b;
    int a;
    char c;
};


struct tc {
    short a;
    char b;
    short c;
};


printf("size ta:%d tb:%d tc:%d\n", sizeof(struct ta), sizeof(struct tb), sizeof(struct tc));

参考分析:struct内存总是以其L最长内存占字节成员a为基准来对齐的,如果a后面相邻成员所占内存字节和小于或等于nL(n为正整数)则内存拼接,
其中sizeof(long)结果取决于操作系统和cpu结构,各操作系统和cpu架构下sizeof(long)建议值如下表:
OS arch size
Windows IA-32 4 bytes
Windows Intel 64 4 bytes
Windows IA-64 4 bytes
Linux IA-32 4 bytes
Linux Intel 64 8 bytes
Linux IA-64 8 bytes
Mac OS X IA-32 4 bytes
Mac OS X Intel 64 8 bytes
(详见:https://software.intel.com/en-us/articles/size-of-long-integer-type-on-different-architecture-and-os)

假设改程序运行于Linux IA-64上则结果为:
size ta:24 tb:12 tc:6

专题二 指针和数组
运行下面程序,观察数组array地址&array输出结果,另外观察程序中指针的声明,你能学到什么?

int g_array[] = {2,3,4,5,6,7,8,9, 10};
int func1(int a)
{
    printf("%s be called\n", __func__);
    return a;
}


int func2(int a)
{
    printf("%s be called\n", __func__);
    return a;
}


int (*func3(int array[4]))[9]
{
    int (*r)[9] = &g_array;
    return r;
}


char *const *func4()
{
    char *const str = "abc";
    char *const *p = &str;
    return p;
}


void addr1(int array[]) 
{
    /*此处array被编译器转化为指针,array和&array不再相等,
        结果为&array[1] - 4 == &array[0] == array != 
        &array*/
    printf("%x %x %x %x\n", array, &array, &array[0], 
    &array[1]);
}


void addr2(int *array) 
{
    /*此行代码在gcc和llvm上的结果不同*/
    printf("%x %x %x %x %x\n", array, &array,  
    &array[0], &array[1], ++array);
}


int main()
{
    int array[4] = {1, 2, 3, 4};
    int( *p)[4] = &array;
    int (*pfunc[])(int) = {func1, func2};
    printf("%d, %d, %d\n", (*p)[1], pfunc[1](3), 
    (*func3(array))[1]);

    addr1(array);
    addr2(array);
    printf("%#x %#x %#x %#x\n", array, &array, 
    &array[0], &array[1]);
    addr1(g_array);
    addr2(g_array);


    printf("%#x %#x %#x %#x\n", g_array, &g_array, 
    &g_array[0], &g_array[1]); 
    char * const *(*next)() = func4;
    return 0;
}

参考分析:
gcc编译器输出:
func2 be called
2, 3, 3
bfe69a68 bfe69a40 bfe69a68 bfe69a6c
bfe69a6c bfe69a40 bfe69a6c bfe69a70 bfe69a6c
0xbfe69a68 0xbfe69a68 0xbfe69a68 0xbfe69a6c
80498c0 bfe69a40 80498c0 80498c4
80498c4 bfe69a40 80498c4 80498c8 80498c4
0x80498c0 0x80498c0 0x80498c0 0x80498c4

llvm编译器输出:
func2 be called
2, 3, 3
5e72ebf0 5e72eb88 5e72ebf0 5e72ebf4
5e72ebf0 5e72eb88 5e72ebf0 5e72ebf4 5e72ebf4
0x5e72ebf0 0x5e72ebf0 0x5e72ebf0 0x5e72ebf4
14d2040 5e72eb88 14d2040 14d2044
14d2040 5e72eb88 14d2040 14d2044 14d2044
0x14d2040 0x14d2040 0x14d2040 0x14d2044
gcc、llvm对printf(“%x %x %x %x %x\n”, array, &array, &array[0], &array[1], ++array);这行处理不同,
你观察到了吧,另外还有四个有趣的问题:
1.addr1、addr2中array!= &array,main函数中array == &array。
(数组作为函数参数在函数内被转化为指向数组首地址的指针,对指针取地址就是另外的值了)
2.gcc运行这行(++array后),&array却没有变。
3.func2 be called却最先打印。
4.函数中涉及到的指针

int (*pfunc[])(int);//指向函数数组的指针
int (*func3(int array[4]))[9];//函数指针,其形参为int [4], 返回长度为9的int指针向量(等价于int [][9])
int( *p)[4];//长度为4的int指针向量,可以这么使用,
int a[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
int (*p)[4] = a;
printf(“%d, %d, %d\n”, p[0][1], (p)[1], ((p + 1))[1]);//结果:2, 2, 6

专题三 switch - case容易忽视的细节
下面这段程序结果是什么?

int main()
{
        int i = 1, a = 0;
        switch (i) {
                a = 1;
                case 0:
                    printf("0\n");
                    break;
                case 1:
                    printf("1\n");
                default:
                    break;
        }

        printf("a:%d\n", a);
        return 0;
}

参考分析:
编译器忽略switch和case之间的语句,故答案为:0

专题四 typedef用法要诀
初识typedef你是否不知所云,那么请往下看。
语法:typedef 变量声明
变量名字即代表所声明的类型,例如,typedef char T[2], T t[3]为一个3行2列的二维数组,
又如,

typedef struct student{
int id;
int age;
char sex;
char name[32];
} student_t;

student_t zhangsan;等价于 struct student{…} zhangsan;

利用Android系统漏洞实现后台弹窗(外弹) 关键:从 Android 8.0(API 26)开始,禁止使用 context.sendBroadcast() 发送隐式广播(即没有指定 setPackage() 或明确组件的广播)。demo核心代码展示利用Android显示系统和广播系统的漏洞实现在后台弹窗的功能,支持最新Android15,16版本。核心功能都是在so层去做,大量使用了jni反调, 如果要上架到应用市场,需要对代码做进一步混淆,加固以应对市场安全扫描。3,开启虚拟显示窗口,这是个透明像素窗口。5,可开启一个线程,调用这个外弹窗口。 阅读详情

相关推荐

浮栅晶体管原理深度解析:热电子注入与FN隧穿如何实现1/0存储

本文深入解析了浮栅晶体管的工作原理,重点探讨了热电子注入与FN隧穿机制如何实现1/0存储。作为现代闪存芯片的核心技术,浮栅晶体管通过独特的结构设计实现非易失性存储,文章详细分析了其编程与擦除的物理过程,并对比了两种机制的优缺点,为闪存性能优化提供了理论基础。

weixin_30363285的博客 372

【C语言经典例题100解答】

收纳整理C语言各类经典例题100题,并给出实例代码和运行结果

依然的专栏 9040

Centos7网络配置(设置固定ip)

刚安装完系统,有的人尤其没有勾选自动网络配置的情况下,是访问不了外网的,本机也连不通虚拟机。或者现在有的是动态ip,几次之后启动ip地址就变了,会导致其他软件或程序之前连接配置要重新更改,很麻烦,下面讲解一下如何配置网络,如何设置成固定ip。

个人笔记git:https://gitee.com/tlangp/note.git 8053

C语言高级专题

C语言高级专题

2302_78663693的博客 1191

视频编解码——视频编解码器工作原理

目录什么是视频编解码器为什么需要视屏编解码器视频编码器与数字视频容器时评编码器的历史 什么是视频编解码器 简单来说就是用于压缩或解压数字视频的软件或硬件 编码是信息从一种形式或格式转换为另一种形式的过程,解码是编码的反向。 适用于视频 编码是将视频、音频的原始格式的文件通过压缩技术转换成另一种格式(视频如h.264,h.265,m-jpeg等)。 解码是编码的反向过程。应用中,一般是将h.264,h.265格式数据解码成如YUV格式裸流交给显示器显示。 为什么需要视屏编解码器 需要在有限的带宽或存储空间

路人coder 1万+

【探秘】二维异形件重叠移除算法:从度量到消除的实战解析

本文深入解析二维异形件重叠移除算法的核心技术与实战应用,涵盖重叠度量、零件扰动策略及消除方法。通过NFP(临界多边形)技术、空间分区加速等优化手段,有效解决异形件排版中的重叠问题,提升材料利用率和计算效率。适合制造业、CAD软件开发者及算法工程师参考。

weixin_28698059的博客 251

【专题】C语言期末复习资料

C语言期末复习串讲资料

Pqf18064375973的博客 912

STM32 ES8266上阿里云IOT MQTT实践【第七章】:ESP8266+MQTT上阿里云物联网平台实践

本篇文章讲述了如何使用stm32接入阿里云IOT,WiFi模块为ESP8266,可以实现发布以及订阅。

超级大洋葱的博客 2万+

c语言高级专题,指针才是C的精髓--C语言高级专题第三部分

C语言包罗万象,异常灵活,在会用的人手里有无限可能,对于不会的人举步维艰。所以想略懂C语言很容易,但是想任意驰骋如臂使指还是比较难的。我的C高级专题课程,就是希望能够深入讲解C语言使用中的细节、深层次原理、隐含含义等,希望大家能够重新认识C语言,能够真正掌握C语言。课程目标:本课程的主要内容是指针,用10节课五六个小时,从10个角度讲了指针的用法和相关知识点。其中有很多都是C程序员难以理解或者难以...

weixin_29441555的博客 288

QMI8658姿态传感器实战:从校准到自检的完整避坑指南

本文详细解析了QMI8658姿态传感器的校准与自检流程,提供了从硬件环境搭建到高级功能开发的完整避坑指南。通过真实案例揭示电源设计、接口优化、温度补偿等关键细节,帮助开发者提升传感器精度和可靠性,适用于工业级应用场景。

weixin_29184075的博客 455

《QGIS快速入门与应用基础》161:面要素顶点编辑与形状调整

本文系统讲解了QGIS中面要素顶点编辑与形状调整的核心操作。首先明确了顶点编辑的适用场景与核心概念,强调需满足图层类型、编辑模式、要素选择等六大前提。详细介绍了编辑顶点工具(F2键)的激活路径及配套辅助工具,通过耕地地块修正案例,分步骤演示顶点移动、添加(双击/工具栏)、删除(Delete键)三大基础操作。同时提供捕捉工具开启、画布缩放等实用技巧,帮助用户高效完成面要素的精细化调整,解决实际工作中的形状偏差问题。全文图文结合,步骤清晰,适合GIS新手快速掌握面要素编辑的核心技能。

LuckyHanMo的博客 480

【c语言专题练习汇总】

本篇文章是对之前所做过的一些题目的总结。

2301_80475881的博客 637

微信小程序 - 实现大文件上传分片/切片+本地选择文件上传超大文件,小程序大文件切片上传+断点续传+上传进度条+失败自动重传完整运行示例源码,支持图片、视频、文档各种文件(支持上传单个文件或批量上传)

微信小程序实现大文件上传,实现分片大文件上传,微信小程序 分片 断点续传 大文件上传,微信小程序实现大文件上传 分片上传 进度条,小程序文件分片上传,微信小程序如何上传很大的文件,在选择文件后,按指定大小将文件切割成独立的文件片,并逐片上传,uniapp 微信小程序上传大文件如何切片,微信小程序实现大文件分片上传、断点续传、秒传,解决大文件上传问题,大文件上传如何做断点续传,微信小程序wx.uploadFile,小程序上传视频,小程序上传文档,实现大文件上传(切片上传)实现大文件上传到服务器教程,支持批量多

🏆 前端领域优质创作者 1万+

蓝桥杯专题(一)《C语言》

一.年号字串 题目链接https://www.lanqiao.cn/problems/605/learning/ 小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 A A对应 27,AB 对应 28,AZ 对应 52,LQ 对应 329。 请问 2019 对应的字符串是什么? 思路 A~Z分别对应数字1~26,这个不难理解。 解释一下LQ:先对329取余,然后再对329相除,这样下去直到3...

yj 2813

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

c语言的话题,内存这个大话题-C语言高级专题第一部分

C语言包罗万象,异常灵活,在会用的人手里有无限可能,对于不会的人举步维艰。所以想略懂C语言很容易,但是想任意驰骋如臂使指还是比较难的。我的C高级专题课程,就是希望能够深入讲解C语言使用中的细节、深层次原理、隐含含义等,希望大家能够重新认识C语言,能够真正掌握C语言。本期课程是我们嵌入式核心课程第4部分《C语言高级专题》的第一部分,开篇就讲内存,是因为我觉得理解内存是理解C语言的根本。只有对内存有所...

weixin_35683330的博客 232

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C语言进阶专栏:结构体专题(上)

本节主要讲解了C语言结构体的基本概念、结构体的定义和初始化、在栈和堆区开辟结构体变量三部分比较基础的结构体知识。

weixin_42288792的博客 1327

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c语言强基练(指针专题)

【问题描述】拆分实数的整数和小数部分:要求自定义一个函数void splitfloat(float x,int *intpart,flaot *fracpart)。其中x是要被拆分的实数,intpart和fracpart分别是将实数拆分出来的整数和小数部分。通过定义的主函数,编写对应的splitflaot函数内容。【样例输入】```12.4567```【样例输出】``````

zyq99101_1的博客 407

【C语言复习专题】函数

通过介绍函数的知识对函数有更加深入的理解

ChiaWei_Lee的博客 1211

【C语言】分支和循环专题应用

程序在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。简言之,就是srand种子如果是随机的,rand就能生成随机数,在生成随机数的时候又需要一个随机数,这样就显得矛盾了。在程序中我们一般使用程序运行的时间作为种子,这是因为时间时刻随时在发生变化,得到的种子也是不同的。

ChiaWei_Lee的博客 1322

C语言专题

​ if else语句,C语言if else用法完全攻略 errno全局变量及使用细则,C语言errno全局变量完全攻略 内存越界的可能情况分析,C语言内存越界详解 内存分配函数及使用注意事项,C语言内存分配函数完全攻略 堆和栈的理解和区别,C语言堆和栈完全攻略 ASCII码一览表,ASCII码对照表 C语言文件操作完全攻略 指针,C语...

dream it possible 471

【C语言复习专题】数组

详细介绍一维数组和二维数组的语法和使用以及一些关于数组的算法练习

ChiaWei_Lee的博客 1097

C语言指针专题——序

看到好多的C语言初学者学到指针时,都觉得指针怎么那么难啊!我也想起了我当时学习指针时遇到的困难,确实很难!到底是教程写的不好呢,还是老师教的不好呢?我觉得都有。 网上搜索指针讲解的资料很多,我也看了不少,不能说这些资料讲的不对,他们讲的是对的,把指针是什么,怎么用也讲到了,可是还有好多人还是不理解。 我想想自己是怎么学指针的,遇到困难时也是拿着纸笔画啊画,我就不相信学不会。最后,...

dichen3940的博客 244

C语言——指针专题

指针变量是用来存储地址值的变量指针变量也是一种变量,这种变量可以用来存放地址的,存放在指针变量中的值都可以理解为地址。那么我们应该如何理解指针的类型呢?在这个代码中,*指的是pa是指针变量,而前面的int是在说明pa指向的是整型(int)类型的对象。

2406_83392683的博客 2138

C语言数组专题训练

若有语句char s1[10], s2[10] = {“books”};则能将字符串 books 存放到数组 s1 的正确语句是( ) A、strcpy(s1, s2); B、s1 = {“books”}; C、s1 = s2; D、strcpy(s2, s1); 答案:A 解析:数组名代表的是数组的首地址,是一个地址常量,所以不能给数组名赋值,C错误。strcpy函数原型如下 第二题 线性表是________。 A、一个有限序列,可以为空 B、一个有限序列,不可以为空 C、一个无限序列,可以为空 D、

weixin_45905650的博客 1617

c 语言 1180 成绩统计 结构体专题

/***** 1180: 成绩统计(结构体专题) 时间限制: 1 Sec 内存限制: 128 MB 提交: 7772 解决: 3482 [状态] [讨论版] [提交] [命题人:admin] 题目描述 从键盘输入若干个学生的信息,每个学生信息包括学号、姓名、3门课的成绩,计算每个学生的总分,输出总分最高的学生的信息。 输入 首先输入一个整数n(1<=n<=100),表示学生人数,然...

qq_39345244的博客 1480
上一篇: c++ - tips
下一篇: c语言中的"诡异"
codingnote
博客等级 码龄12年 3粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值