C语言基础回炉
文章平均质量分 64
Linux老A
嵌入式打杂专家
展开
-
Linux内核双向循环链表 list_head 部分功能重构
一 为什么要重构Linux中的双向循环链表?第一,首先 Linux内核双向循环链表的实现依赖于GNU编译器,里面有一些语法是GUN编译器的语法,标准C编译器不能使用它。所以需要清除平台相关代码。1 ({})2 typeof()3 _builtin_prefetch() 用于优化代码4 static inline GNU编译器中可以这样组合是用,但是标准C中不可以这样使用第二,需要清除文件中的依赖// #include <linux/types.h>// #include <原创 2021-03-29 16:50:47 · 261 阅读 · 0 评论 -
Linux 中的经典宏 container_of(ptr, type, member)剖析
#ifndef offsetof#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER)#endif#ifndef container_of#define container_of(ptr, type, member) ({ \ const typeof(((type*)0)->member)* __mptr = (ptr); \ (type*)((char*原创 2021-03-28 15:45:48 · 620 阅读 · 1 评论 -
C基础第42课 -- 内存操作经典问题分析二
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1#include <stdio.h>#include <malloc.h>void test(int* p, int size){ int i = 0; for(i=0; i<size; i++) { printf...原创 2020-04-14 22:42:19 · 245 阅读 · 0 评论 -
C基础第41课 -- 内存操作经典问题分析一
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。指针变量的值是非法的内存地址的含义:非法的内存地址,不是给我们分配的内存地址。合法的内存地址:通过变量的定义而得到的变量地址是合法的。通过malloc()申请得到的内存地址是合法的内存地址。如果说我们的指针变量中保存的内存地址不属于上面两种情况,就可以说我们的指针变量这个时候就是野指针。实验1...原创 2020-04-14 21:55:16 · 375 阅读 · 0 评论 -
C基础第40课--程序的内存布局
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。原创 2020-02-16 14:57:42 · 264 阅读 · 0 评论 -
C基础第39课--程序中的三国天下--栈,堆,静态存储区
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。esp:栈顶指针ebp:指向函数调用结束后的返回地址原创 2020-02-12 11:20:33 · 328 阅读 · 0 评论 -
将B的内存空间 扣上A的类型模子,通过A访问B空间
用pb针对B的操作会让 a变量的值改变,因为其实是针对起始地址的偏移内存操作由于两个类型内存结构相同 所以成员偏移也相同#include <stdio.h>struct A{ int i; int j; char c; double d;};struct B{ int i1; int j1; char c1;...原创 2020-02-06 18:01:49 · 194 阅读 · 0 评论 -
C基础第38课--动态内存分配
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。我们平时所说的内存地址起始隐含了两个概念,一个是内存的起始地址,一个是内存的长度。malloc(0) 是合法的,会返回一个地址,但是由于长度为0,所以不能使用。提问 :如果向系统不停的malloc(0),向系统不停的申请长度为0的内存空间,而且只申请不释放,最终的程序会产生内存泄漏吗?答案: ...原创 2020-01-23 11:22:51 · 209 阅读 · 0 评论 -
C基础第37课--指针阅读技巧分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1:复杂指针的阅读#include <stdio.h>int main(){ int (*p1)(int*, int (*f)(int*)); int (*p2[5])(int*); int (*(*p3)[5])(int*); ...原创 2020-01-22 17:51:48 · 247 阅读 · 0 评论 -
C基础第36课--函数与指针分析,函数指针
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 :函数指针的使用实验2 :通过函数指针直接跳转到某个固定地址开始执行实验3:回调函数使用函数指针是实现函数回调的关键技术!!!函数的入口地址 就是函数名,加不加 & 并没有影响实验1 :函数指针的使用#include <stdio.h>// 定义新的函数类型...原创 2020-01-22 15:13:01 · 309 阅读 · 0 评论 -
C基础第35课--数组参数和指针参数分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。二维数组退化为 数组指针实验2:传递与访问二维数组#include <stdio.h>void access(int a[][3], int row){ // sizeof(*a) :数组a中 第0个数组所占用的空间大小 // 有多少列 int col = size...原创 2020-01-22 13:54:17 · 257 阅读 · 0 评论 -
C基础第34课--多维数组和多维指针
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1:指针的传址调用 — 重置动态空间的大小实验2 :遍历二维数组实验3:二维指针模拟二维数组 — 动态申请二维数组实验1:重置动态空间的大小#include <stdio.h>#include <malloc.h>int reset(char**p, int si...原创 2020-01-22 12:40:28 · 316 阅读 · 0 评论 -
C基础第33课--main函数和命令行参数
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。经过试验都正确!实验1:打印main 参数 ,环境变量#include <stdio.h>// char* env[] 操作系统传递的环境变量int main(int argc, char* argv[], char* env[]){ int i = 0; ...原创 2020-01-22 10:26:35 · 457 阅读 · 0 评论 -
C基础第32课--数组指针和指针数组分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。定义数组类型通过数组类型定义数组指针,或者直接定义数组指针实验1#include <stdio.h>//定义数组类型typedef int(AINT5)[5];typedef float(AFLOAT10)[10];typedef char(ACHAR9)[9];int ...原创 2020-01-22 09:26:41 · 2716 阅读 · 0 评论 -
C基础第31课--字符串典型问题分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 : snprintf注意实验2 :字符串使用注意实验3 :字符串比较实验4 : 字符串循环右移实验1 : snprintf注意#include <stdio.h>int main(){ char buf[10] = {0}; char src[] = "...原创 2020-01-21 15:15:00 · 256 阅读 · 0 评论 -
C基础第30课--C语言中的字符串
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 :字符串的定义: 可以用 一个字符串字面量来初始化一个字符数组 最后字符数组 变成了字符串 被自动加了 /0#include <stdio.h>int main(){ char ca[] = {'H', 'e', 'l', 'l', 'o'}; //字符数组 没有 反斜...原创 2020-01-21 13:11:25 · 333 阅读 · 0 评论 -
C基础第29课--指针和数组分析(下)
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 :数组的访问方式#include <stdio.h>int main(){ int a[5] = {0}; int* p = a; int i = 0; for(i=0; i<5; i++) { p[i] ...原创 2020-01-21 12:13:13 · 245 阅读 · 0 评论 -
C基础第28课--指针和数组分析(上)
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1#include <stdio.h>int main(){ int a[5] = {0}; int* p = NULL; printf("a = 0x%X\n", (unsigned int)(a)); printf("a + 1 = 0x%...原创 2020-01-21 10:48:22 · 209 阅读 · 0 评论 -
C基础第27课--数组的本质分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 : sizeof(数组名) 求 数组大小#include <stdio.h>int main(){ int a[5] = {1, 2}; int b[] = {1, 2}; printf("a[2] = %d\n", a[2]); pri...原创 2020-01-21 09:44:16 · 207 阅读 · 0 评论 -
C基础第26课--指针的本质分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。原创 2020-01-20 14:26:45 · 233 阅读 · 0 评论 -
C基础第25课--# 和 ## 操作符使用分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 :#运算符分使用25-1.c#include <stdio.h>#define STRING(x) #xint main(){ printf("%s\n", STRING(Hello world!)); printf("%s\n", STRING(1...原创 2020-01-13 08:18:56 · 313 阅读 · 0 评论 -
C基础第24课--#pragma使用分析,#pragma message ,#pragma once, #pragma pack 和 内存对齐
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 :#pragma message 使用实验2 : #pragma pack 和 内存对齐实验3:结构体内存对齐方式分析实验4 : 内存对齐—微软面试题预处理器指示字 #pragma实验1 :#pragma message 使用#include <stdio.h>#if...原创 2020-01-12 18:11:56 · 603 阅读 · 0 评论 -
C基础第23课--#error 和 #line使用分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1情景:需要定义某个宏的时候,假如没有定义 代码就会执行其他分支,不会执行目标分支,这时候如果在条件编译的时候就添加 #error预处理器指示字 没有定义该宏 就报错 就会避免这种隐患。实验1情景:需要定义某个宏的时候,假如没有定义 代码就会执行其他分支,不会执行目标分支,这时候如果在条件编译的...原创 2020-01-12 16:32:19 · 221 阅读 · 0 评论 -
C基础第22课--条件编译使用分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 :条件编译是什么实验2 : 通过命令行 定义宏情景1 :定义宏代表一个值情景2:定义宏代表一个标识符是否存在。仅仅是定义一个宏,但是不给他赋值,宏和变量是不同的,宏可以代表一个值,他也可以仅仅表示一个标识符是否存在。实验3:include 间接包含的时候实验4; 使用条件编译解决 重复包含的编...原创 2020-01-12 14:26:27 · 381 阅读 · 0 评论 -
C基础第21课--宏定义与使用分析
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 : 宏是被预处理器所处理的,预处理器只进行简单的文本替换,不会进行语法检测实验2 : 宏表达式的强大和易出错实验3:宏的作用域,对于宏而言 是没有作用域限制的,作用域的概念是针对C语言里面的变量和函数的,不针对宏。因为宏是被预处理器处理的,编译器根本不知道宏标识符的存在,所以编译器根本无法将作用域的...原创 2020-01-12 12:26:55 · 2005 阅读 · 0 评论 -
C基础第20课--链接过程简介
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验120-1.c#include <stdio.h>extern char* name();extern int add(int a, int b);int main(){ printf("Name: %s\n", name()); printf("Resu...原创 2020-01-01 19:08:46 · 217 阅读 · 0 评论 -
C基础第19课--编译过程简介
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验119-1.h/* This is a header file. */char* p = "Delphi";int i = 0;19-1.c#include "19-1.h"// Begin to define macro#define GREETING...原创 2020-01-01 15:48:04 · 221 阅读 · 0 评论 -
C基础第18课--三目运算符和逗号表达式
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1:三目运算符最后返回的是一个值,而不是变量本身,不可以作为左值使用。但是可返回地址,操作地址。实验2:三目运算符的返回类型,有疑问,需要提问实验3:逗号表达式 实验4:逗号表达式的应用,用一行代码实现 strlen,递归调用!!!牛皮!!!实验1:三目运算符最后返回的是一个值,而不是变量本身,...原创 2019-12-22 20:57:56 · 234 阅读 · 0 评论 -
C基础第17课 ++和--操作符分析
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1#include <stdio.h> int main(){ int i = 0; int r = 0; r = (i++) + (i++) + (i++); printf("i = %d\n", i); printf("r = %d\n...原创 2019-12-22 18:08:14 · 236 阅读 · 0 评论 -
C基础第16课 位运算符分析
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1实验2 :交换两个整形变量的值方法一 :定义中间变量,麻蛋 低级实验3 :交换两个整形变量的值方法二 :部分和 ,但是不能满足两个非常大的int型数据相加结果溢出int类型范围的情况实验4 :交换两个整形变量的值方法三 :位运算 按位异或,最简洁 最高效实验5:按位或按位与 VS 逻辑或逻辑与...原创 2019-12-22 16:27:17 · 233 阅读 · 0 评论 -
C基础第15课 逻辑运算符分析
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 :&& 与 || 混合运算实验2: && 与 || 混合运算 加强实验3:逻辑非 !实验实验1 :&& 与 || 混合运算#include <stdio.h>int main(){ int i = 0; int...原创 2019-12-19 00:32:51 · 200 阅读 · 0 评论 -
C基础第14课 单引号和双引号
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。1 C语言中的单引号用来表示字符字面量,单引号括起来的单个字符表示的是整数 ASCII码 一个字节2 C语言中的双引号用来表示字符串字面量,字符串被编译的过后,就会被存放在内存中的某个地址空间中,而我们在程序中得到的就是这一段存放字符串的内存空间的地址,占用四个字节。“a” 第一个字节是 a 第二个字...原创 2019-12-16 00:29:31 · 3307 阅读 · 0 评论 -
C基础第11课 enum, sizeof, typedef 分析
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。提纯:1 enum 中定义的值是C语言中真正意义上的常量2 sizeof 是C语言的内置关键字,不是函数,所以他不会到程序运行的时候才给我们计算变量或者类型的大小值,而是在编译的期间计算并且替换为对应的值3 typedef的三种写法 以及 typedef 仅仅是给一个类型重命名而已,编译器没有要求被重命名...原创 2019-12-15 22:24:22 · 278 阅读 · 0 评论 -
C基础第10课 struct 和 union 分析
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。实验1 :gcc 编译器环境gcc 编译器环境空结构体以及空结构体所定义的变量占用的内存大小都为0实验2 :bcc 编译器环境bcc编译器不允许空结构体的存在实验3 : vc编译器环境vc编译器环境也是不允许空结构体存在的实验4 柔型数组的大小是0实验5 柔型数组的使用#inclu...原创 2019-12-15 20:29:10 · 209 阅读 · 0 评论 -
C基础第9课 const和volatile分析
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。原创 2019-12-08 23:07:28 · 226 阅读 · 0 评论 -
C基础 7~8,循环语句, goto 和 void 分析
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。第七课:循环语句第八课 : goto 和 void 分析第七课:循环语句不可以!continue是为循环语句设计的,switch语句是分支语句,和分支语句没关系。第八课 : goto 和 void 分析C语言是一种面向过程的结构化语言,主要结构有三种结构:顺序执行,选择执行,循环执行...原创 2019-12-01 23:38:46 · 415 阅读 · 0 评论 -
C基础 4~6,类型转换,变量属性,分支语句
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。第四课:类型之间的转换第五课:变量属性第六课:分支语句第四课:类型之间的转换第五课:变量属性为什么要有 register关键字:C语言的诞生是为了效率,寄存器的访问速度要比内存访问的速度要快得多,所以为了高效,允许存在寄存器变量,方便访问,提高访问速度。程序静态区:生命周期和...原创 2019-12-01 18:11:31 · 194 阅读 · 0 评论 -
C基础 1~3,数据类型,符号,浮点数
学习自狄泰软件学院唐佐临老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。第一课 : 基本数据类型第二课 : 有符号和无符号第三课 : 浮点数的秘密第一课 : 基本数据类型第二课 : 有符号和无符号无符号数本身就大于0 最小值减一后变成最大值。所以不停的循环,所以在使用无符号数作为循环变量的时候要十分注意循环条件。第三课 : 浮点数的秘密...原创 2019-12-01 17:07:48 · 298 阅读 · 0 评论