C语言
文章平均质量分 60
车子 chezi
乐于开源,善于分享。死磕自己,方便大家。广泛查阅,独立思考。持续琢磨,自成一家。
展开
-
sizeof 的结果取决于什么
本文讨论的是 C 语言中的一个运算符:sizeof注意,是运算符,不是函数。sizeof 的结果是在编译时就可以确定的,于是有人认为,sizeof 的结果取决于编译器。这样说也对,但是我认为,C 和 C++ 旨在成为高效的语言。为了实现最大效率,C 或 C++ 实现必须考虑源自底层硬件的某些因素。出于这个原因,确保每种基本类型都基于硬件直接支持的某种表示是很有意义的。因此,sizeof 的结果取决于硬件。可以这么说,sizeof 的结果取决于处理器(更具体地说,ISA,指令集架构,例如 x86 和 x原创 2022-03-08 19:41:21 · 1663 阅读 · 0 评论 -
GNU C 中的零长数组
文章目录什么是零长数组(Arrays of Length Zero)零长数组的使用零长数组和指针的区别定义什么类型的零长数组什么是零长数组(Arrays of Length Zero)如果我们在程序中定义一个零长度数组,你会发现除了 GCC 编译器,在其它编译环境下可能就编译通不过或者有警告信息。咱们看一个很简单的例子:int buffer[0];int main(void){ printf("%d\n", sizeof(buffer)); return 0;}你会发现,输原创 2022-01-17 18:58:16 · 987 阅读 · 0 评论 -
C语言中的匿名结构体
在 C 的 C11 标准中,添加了匿名结构和匿名联合。匿名联合/结构也称为未命名联合/结构,由于没有名称,因此不会创建它们的直接对象(或变量),通常我们在嵌套结构或联合中使用它们。An anonymous struct declaration is a declaration that declares neither a tag for the struct, nor an object or typedef name. Anonymous structs are not allowed in C++原创 2022-01-16 23:32:15 · 5216 阅读 · 1 评论 -
sizeof(函数名)=?
sizeof(函数名)=?直接上代码#include <stdio.h>int foo(void){ printf("hello\n"); return 0;}int main(void){ printf("%lu\n", sizeof(foo)); printf("%lu\n", sizeof(&foo)); printf("%lu\n", sizeof(foo()));}假设保存为文件 1.c编译:$ gcc -Wa原创 2021-10-31 22:36:09 · 1080 阅读 · 0 评论 -
C语言16进制字符串转数字
假设有一个十六进制字符串,“99AD1B5226A37E3E058E3B8E27C2C666”,如何把它按照字节来切分,然后转成整型?也就是说转换成 0x99, 0xAD, 0x1B, …代码实现C 语言参考代码:#include <stdio.h>#include <stdlib.h>#include <string.h>char *key = "99AD1B5226A37E3E058E3B8E27C2C666";void main(void){原创 2021-09-19 11:27:45 · 4617 阅读 · 0 评论 -
强符号与弱符号
文章目录强符号不允许多次定义强弱可以共存都是弱符号简而言之,在 C 语言中,函数和初始化的全局变量(包括显示初始化为 0)是强符号,未初始化的全局变量是弱符号。在链接器进行链接的时候,有下面的规则强符号不允许多次定义(即不同的目标文件中不能有同名的强符号)强弱可以共存,共存时,强覆盖弱都是弱符号时,选择占用空间最大的;我们举例子说明。强符号不允许多次定义针对 1,代码片段是:// a.c int tea = 2; // strong// b.cint tea = 1; // s原创 2021-06-13 10:31:42 · 985 阅读 · 1 评论 -
快速排序
文章目录原理讲解C 语言实现添加调试信息时间复杂度原理讲解假设我们现在对“6 1 2 7 9 3 4 5 10 8”这 10 个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被“基准数”这个名词吓到了,其实就是一个用来参照的数,看到后面你自会明白)。我有选择困难症,就让第一个数 6 作为基准数吧。接下来,需要将这个序列中所有比基准数 6 大的数放在它的右边,比基准数 6 小的数放在它的左边,类似下面这种排列:3 1 2 5 4 6 9 7 10 8如原创 2021-04-03 21:36:06 · 644 阅读 · 0 评论 -
不带头节点的单链表如何头插(多图易懂)
文章目录缘起带头节点的头插不带头节点的头插错误的代码为什么错误如何修改返回新的头指针二级指针缘起本文想说的是单向非循环链表的头插。单向非循环链表,可以是带头节点的,也可以是不带头节点的。对于前者,代码比较简单,后文会说。对于后者,不带头节点的单向链表的头插,我发现即使有多年工作经验的老鸟,也可能写出错误的代码。带头节点的头插#include <stdio.h>#include <assert.h>#include <stdlib.h>typedef s原创 2020-11-22 21:22:08 · 13085 阅读 · 4 评论 -
C语言的复合语句表达式
看一个例子int main(void){ int x = 10; int y = 1; int c = ({x;y;}); printf("c = %d\n",c);}第 5 行,这样写合法吗?答案是合法,结果输出 1再比如({ int y = foo(); int z; if(y > 0) z = y; else z = -y; z;})这就是复合语句表达式。原创 2020-07-26 20:10:48 · 6521 阅读 · 1 评论 -
C语言指针入门 《C语言非常道》
C语言基础之指针初步文章目录C语言基础之指针初步初识指针取地址运算符和指针变量的声明指针指向什么类型很重要解引用运算符总结与补充指针是 C 语言的难点,也是亮点。有人说如果不懂指针,那就不算是掌握了 C 语言。作为一个嵌入式软件工程师,我认为指针是 C 语言的杀手锏,离开了它,C 语言不可能在嵌入式领域“一览众山小”。好了,进入正题。初识指针int a = 5;这句话定义了 int...原创 2019-09-24 23:32:52 · 1035 阅读 · 2 评论 -
C 语言基础之数组
文章目录什么是数组数组变量的声明多维数组什么是数组数组,顾名思义,就是一组数。假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码:int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int ZhouJie_score = 7...原创 2019-09-17 22:57:42 · 1393 阅读 · 0 评论 -
C 语言的基本数据类型
C 语言的基本数据类型注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢?如果写了一句:int a;那么执行的时候在内存中会有什么变化呢?橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。上图就是我在某宝的...原创 2019-09-13 21:54:10 · 412 阅读 · 0 评论 -
C语言可变参数详解
C语言可变参数详解什么是可变参数函数在C语言编程中有时会遇到一些参数可变的函数,例如printf()、scanf(),其函数原型为:int printf(const char* format,…)int scanf(const char *format,…)就拿 printf 来说吧,它除了有一个参数 format 固定以外,后面的参数其个数和类型都是可变的,用三个点“…”作为参数占位...原创 2018-12-31 22:46:06 · 21919 阅读 · 6 评论 -
C/C++中 static 的作用
在C中,有三个作用:1.修饰全局变量: 作用是隐藏,也就是这个全局变量仅在本文件中可见2.修饰局部变量:作用是扩展变量的生存期,令这个局部变量成为静态的3.修饰函数:作用是隐藏,将此函数的作用域限制在本文件中在C++中,有两个作用:1.修饰成员变量:静态成员是类的所有对象中共享的成员,而不是某个对象的成员。对多个对象来说,静态数据成员只存储一处。2.修饰成原创 2020-04-05 22:28:12 · 833 阅读 · 0 评论 -
程序员面试系列——冒泡排序
虽然冒泡排序是排序算法里面最简单的一种,但是不可轻视。我在应届生的面试和社招的面试中,都被问到了冒泡排序。基本思想:冒泡排序属于蛮力法,它比较表中的相邻元素,如果它们是逆序的话就交换它们的位置。重复多次后,最终,最大的元素就“冒”到列表的最后一个位置。第二遍操作将第二大的元素“冒”出来。这样一直重复,直到n-1遍(列表共有n个元素)以后,该列表就排序好了。原创 2017-07-23 21:43:19 · 1580 阅读 · 0 评论 -
程序员面试系列——有符号数的溢出
请看这样一道题:#include <string.h>#include <stdio.h>int main(void){ signed char a[1000]={0}; for(int i=0; i<1000; ++i) a[i] = -1 - i; printf("%lu\n",strlen(a)); return 0;}请问此程序输出什么原创 2017-09-06 21:31:41 · 2677 阅读 · 0 评论 -
程序员面试系列——大小端
大端、小端是“字节顺序”里面的概念。字节顺序可以分为大端序、小端序、混合序。原创 2017-09-10 21:49:42 · 771 阅读 · 0 评论 -
浅谈尾调用和尾递归(C语言)
什么是尾调用在计算机科学里,尾调用是指一个函数里的最后一个动作是一个函数调用的情形,即这个调用的返回值直接被当前函数返回的情形。这种情形下称该调用位置称为“尾位置”。说得通俗点,尾调用就是指某个函数的最后一步是调用另一个函数。这个调用位置称为“尾位置”。比如有个函数叫fun,其实现是:int fun(void){ foo();}上面代码中,函数fun的最后一步是原创 2018-01-07 21:58:20 · 2721 阅读 · 2 评论 -
浅谈尾递归的优化
在 浅谈尾调用和尾递归 这篇博文中,我谈了什么是尾递归以及编译器如何优化尾递归。这篇文章,咱来个具体的例子,通过汇编代码来看看优化和不优化的区别。求阶乘的尾递归写法// file_name : factorial.c#include int factorial_tail(int n, int product_from_n){ if (n == 1) re原创 2018-01-18 23:07:56 · 880 阅读 · 0 评论 -
C语言中“数组名”和“&数组名”
C语言中 数组名 和 &数组名== 实验环境 == 1. 编译器:gcc 5.4.0 2. 操作系统:Ubuntu 16.04 x86_64缘起本以为此知识点我已熟练掌握,可是最近应用的时候还真给记混淆了。所以写篇文章加深印象。Show me the code废话少说,show me the code.#include <stdio.h>int ...原创 2018-04-22 23:35:27 · 9712 阅读 · 14 评论 -
伪随机数C语言编程
在程序设计中,有时会用到随机数。本文介绍在 Linux 编程环境下,如何生成伪随机数。什么是伪随机数伪随机数是通过一个确定性的算法计算出来的“似乎”是随机的数序,因此伪随机数实际上并不随机。在计算伪随机数时,假如初始值不变的话,那么伪随机数的数序也不变。伪随机数的优点要产生真正的随机数,必须使用专门的设备,比如热噪信号、量子力学效应、放射性元素的衰退辐射,或使用无法预测的现...原创 2018-06-10 22:38:03 · 6491 阅读 · 0 评论 -
C 语言运算符优先级
C 语言运算符优先级优先级运算符描述结合性1++ --后缀自增与自减从左到右()函数调用[]数组下标.结构体与联合体成员访问->结构体与联合体成员通过指针访问(type){list}复合字面量(C99)2++ --前缀自增与自减从右到左+ -一元加与减! ~逻辑非、逐...原创 2018-12-23 12:27:06 · 935 阅读 · 0 评论 -
C语言实现通用链表初步(四)----双向链表
在前面的文章中,我们讨论了如何实现通用类型的链表,方法是用原创 2014-05-19 16:17:59 · 1009 阅读 · 0 评论