10天学会嵌入式技术之c语言-Day-8

零基础C语言入门:8天掌握核心语法与VSCode环境搭建 C语言作为编程语言的基石,以其直接、高效的特性,成为理解计算机底层运作的窗口。其核心原理在于贴近机器的思维方式,通过管理内存、数据存储和函数调用等基础概念,为学习高级语言奠定坚实基础。在技术价值上,C语言广泛应用于操作系统、嵌入式系统和高性能计算等核心领域,是培养扎实编程直觉的关键。对于初学者而言,搭建一个稳定、高效的开发环境是迈出编程第一步的前提。本文聚焦于C语言学习路径规划与环境配置,通过详细解析VSCode编辑器与MinGW-w64编译器套件的安装与调试,帮助读者快速构建功能齐全的开发环境,并理解编译 阅读详情

11.4.4 回调函数

函数指针可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数简单的讲,回调函数是由别的函数执行时调用你传入的函数。
示例代码:
使用回调函数的方式,给一个整型数组 int arr[10] 赋 10 个随机数。

#include<stdio.h>
#include<stdlib.h>

//1.f就是函数指针
//2.f再initArray中被调用,是回调函数
void initArray(int* array, int arraySize, int(*f)()) 
{
  //循环
	for (int i = 0; i < arraySize; i++)
	{
		array[i] = f();//通过函数指针调用了getNextRandomValue 函数
	}
}

int main()
{
	int myarray[10];

	//rand是系统函数,会返回一个随机整数,位于<stdio.h>标准库中
	//传入rand作为参数
	initArray(myarray, 10, rand);

	//输出赋值后的数组
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", myarray[i]);
	}
	return 0;
}

41
18467
6334
26500
19169
15724
11478
29358
26962
24464

11.5 指向指针的指针(多级指针)

(1)基本介绍
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包
含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地
址,第二个指针指向包含实际值的位置。

(2)多级指针的定义与使用
        1)声明多级指针时,需要使用多个星号来表示指针的级别。

int *ptr;//一级指针
int**ptr;//二级指针
int***ptr;//三级指针

        2)初始化多级指针时,你需要逐级给指针赋值,确保每个级别的指针指向正确的目
标。

int var;
int *ptr = &var; // 一级指针指向 var
int **pptr = &ptr; // 二级指针指向 ptr
int ***ppptr = &pptr; // 三级指针指向 pptr

     3)解引用多级指针时,需要根据指针的级别使用适当数量的星号解引用操作。

printf("Value of var: %d\n", var);
printf("Value of ptr: %d\n", *ptr); // 解引用一次
printf("Value of pptr: %d\n", **pptr); // 解引用两次
printf("Value of ppptr: %d\n", ***ppptr); // 解引用三次

(3)多级指针案例演示

#include<Stdio.h>

int main()
{

    int var;
    int *ptr;     //一级指针
    int **pptr;    //二级指针
    int ***ppptr;   //三级指针

    
    var=3000;
    ptr=&var;        //var变量的地址赋给ptr
    pptr=&ptr;       //表示将ptr存放的地址赋给pptr
    ppptr=&pptr;     //表示将pptr存放的地址赋给ppptr


    printf("var's address is %p\nav's valua is %d \n\n",&avr,arv);
    printf("ptr`s adddress is %p \nptr`s value is %p \n*ptr=%d \n\n",
 &ptr, ptr, *ptr);
    printf("pptr`s address is %p \npptr`s value is %p \n*pptr=%p
\n**pptr=%d \n\n", &pptr, pptr, *pptr, **pptr);
    printf("ppptr`s address is %p \nppptr`s value is %p \n*ppptr=%p
\n**ppptr=%p \n***ppptr=%d \n\n", &ppptr, ppptr, *ppptr, **ppptr,
***ppptr);

return 0;
}

var`s address is 0000000cffbffdec
var`s value is 3000
ptr`s adddress is 0000000cffbffde0
ptr`s value is 0000000cffbffdec
*ptr=3000
pptr`s address is 0000000cffbffdd8
pptr`s value is 0000000cffbffde0
*pptr=0000000cffbffdec
**pptr=3000
ppptr`s address is 0000000cffbffdd0
ppptr`s value is 0000000cffbffdd8
*ppptr=0000000cffbffde0
**ppptr=0000000cffbffdec
***ppptr=3000

11.6 空指针

赋为 NULL 值的指针被称为空指针,NULL 是一个定义在标准库 <stdio.h>中的值为零
的宏常量。
声明指针变量的时候,如果没有确切的地址赋值,为指针变量赋一个 NULL 值是好的
编程习惯

#include<Stdio.h>

int main()
{

 int *p=NULL;
 int num=34;
 p=&num;

 printf("p=%p\n",p);
 printf("*p=%p\n".*p);

 return 0;

}

p=000000000061FE14
*p=34
 

11.7 野指针

野指针就是指针指向的位置是不可知(随机性,不正确,没有明确限制的)。

11.7.1

(1)指针使用前未初始化
指针变量在定义时如果未初始化,其值是随机的,此时操作指针就是去访问一个不确
定的地址,所以结果是不可知的。此时 p 就为野指针。

int *p;
printf("%d\n");

在没有给指针变量显式初始化的情况下,一系列的操作(包括修改指向内存的数据的值)
也是错误的。

(2)指针越界访问

int arr[4]={10,20,30,40}
int *p=arr;
p+=4;
printf("%d",p);  //此时*p即为越界访问

当 p += 4 之后,此时 *p 访问的内存空间不在数组有效范围内,此时 *p 就属于非法
访问内存空间,p 为野指针。

(3)指针指向已释放的空间

#include<Stdio.h>

int *test()
{
    int a=10;
    return &a;
}

  int main()
{
  int *p=test();
 printf("%d",*p);
 return 0;
 
}     

调用 test()函数将返回值赋给 p,test 函数的返回值是局部变量 a 的地址,函数调用结束
局部变量会被销毁,其所占用的内存空间会被释放,p 指向的是已经释放的内存空间,所以
p 是野指针。

11.7.3 如何避免野指针

(1)指针初始化如果没有确切的地址赋值,为指针变量赋一个 NULL 值是好的编程
习惯。
(2)小心指针越界。
(3)避免返回指向局部变量的指针。
(4)指针使用之前检查指针是否为 NULL。

11.8 指针使用一览

第十二章  预处理器

12.1 基本介绍

12.1.1 预处理器

C 语言编译器在编译程序之前,会先使用预处理器(preprocessor)处理代码,代码经过
预处理之后再送入编译器进行编译。
预处理器的主要任务包括宏替换、文件包含、条件编译等。
 

12.1.2 预处理指令

预处理过程中会执行预处理指令,预处理指令以 # 号开头,用于指导预处理器执行不
同的任务。
预处理指令具有如下特点:
(1)预处理指令应该放在代码的开头部分。
(2)预处理指令都以 # 开头,指令前面可以有空白字符(比如空格或制表符),# 和
指令的其余部分之间也可以有空格,但是为了兼容老的编译器,一般不留空格。

//推荐写法(顶格写)
#include<stdio.h>

//不推荐写法(有空格)
  #include<stdio.h>

(3)预处理指令都是一行的,除非在行尾使用反斜杠,将其折行。

#include<std\
io.h>

(4)预处理指令不需要分号作为结束符,指令结束是通过换行符来识别的。

#include<stdio.h>;//有分号会报错

#define PI 3.14;  //宏定义不用分号  ,会成为PI的值的一部分

12.2 宏定义

12.2.1 基本结束

宏定义,就是用一个标识符(宏名称)来表示一个替换文本,如果在后面的代码中出现
了宏名称,预处理器会将它替换为对应的文本,称为宏替换或宏展开。
宏定义的基本语法形式如下:

#define 宏名称 替换文本

宏名称:宏的名称,是一个标识符,通常使用大写字母表示,以便与变量名区分开来。
替换文本:宏名称在代码中的每次出现都会被替换为这段文本。
前面的案例中,我们曾经使用宏定义来定义常量和布尔类型。

12.2.2 使用宏定义常量

#include<stdio.h>

//定义常量

#define PI 3.14

int main()
{
  //定义变量保存半径,值通过用户输入获取
 double radius;
printf("请输入半径:");
scanf("%lf",&radius);

//计算面积并输出
printf("圆的面积:%lf",PI*PI*radius);

return 0;

12.2.3 使用宏定义数据类型

#include<stdio.h>

//宏定义
#define BOOL int
#define TRUE 1
#define FALSE 0

int main()
{

    //使用整型表示真假两种状态
    //int isPass = 0;
    //int isOk = 1;

    //借助于宏定义
BOOL isPass = FALSE;
BOOL isOk = TRUE;

if(isPass)
{
    printf("Pass");
}
if("Ok");
{
printf("Ok");
}

return0;
}

上面代码中使用宏定义声明了 BOOL、TURE、FALSE,后面代码中出现 BOOL 会替换
成 int,出现 TRUE 会替换成 1,出现 FALSE 替换成 0。

12.2.4 宏定义的替换文本

替换文本可以含任何字符,它可以是字面量、表达式、if 语句、函数等,预处理程序
对它不作任何检查,直接进行文本替换,如有错误,只能在编译已被宏展开后的源程序时发
现。

#include<stdio.h>
#define M (n*n+3*n)
#define PRINT_SUN printf("sum=%d",sum)

int main()
{
    int n=3;
    int sum = 3*M+4*M+5*M;
    3*(n*n+3*n)+4*(n*n+3*n)+5*(n*n+3*n);
    PRINT_SUM;

return 0;
}

sum=216

12.2.5 宏定义嵌套

宏定义允许嵌套,在宏定义的替换文本中可以使用已经定义的宏名,在宏展开时由预处
理程序层层替换。
代码示例:
 

#include<stdio.h>
#define PI 3.1415926
#define S*PI*y*y

int main()
{

    int y=2;
    printf("%f",s);

    Rreturn 0;
}

12.566370

12.2.6 取消宏定义

如要取消宏定义使用#undef 命令

#include <stdio.h>
#define PI 3.14159
int main()
{
    printf("PI=%f", PI);
    return 0;
}

#undef PI // 取消宏定义
    void func()
{
    // printf("PI=%f", PI); //错误,这里不能使用到 PI 了
}

12.3 带参数的宏定义

12.3.1 基本介绍

(1)C 语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参
数称为“实际参数”,这点和函数有些类似。
(2)对带参数的宏,在展开过程中不仅要进行文本替换,还要用实参去替换形参。
(3)带参宏定义的一般形式为#define 宏名(形参列表)替换文本,在替换文本中可以含有各个形参。
(4)带参宏调用的一般形式为:宏名(实参列表)。
代码示例:

#include<stdio.h>

//说明
//1.MAX就是带参数的宏
//2.(a,b)就是形参
//3.(a>b)?a:b 是带参数的宏对应字符串,该字符串中可以使用形参

#define MAX(a,b) (a>b)?a:b

int main()
{

    int x,y,max;
    printf("input tow numbers:");
    scanf("%d%d",&x,&y);

// 说明
// 1. MAX(x, y); 调用带参数宏定义
// 2. 在宏替换时(预处理,由预处理器), 会进行字符串的替换,同时会使用实
       //参, 去替换形参
// 3. 即 MAX(x, y) 宏替换后 (x>y) ? x : y

max=MAX(x,y);
printf("max=%d\n",max);

return 0;
}

12.3.2 注意事项和细节

1)带参宏定义中,形参之间可以出现空格,但是宏名和形参列表之间不能有空格出
现。
(2)在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型,而在宏调
用中,实参包含了具体的数据,要用它们去替换形参,因此实参必须要指明数据类型。
(3)在宏定义中,替换文本内的形参通常要用括号括起来以避免出错。
代码示例:

#include <stdio.h>

// 带参宏定义,字符串内的形参通常要用括号括起来以避免出错
#define SQ(y) (y) * (y)

int main()
{
     int a, sq;
     printf("input a number: ");
     scanf("%d", &a);

// 宏替换为 (a+1) * (a+1)
     sq = SQ(a + 1);
     printf("sq=%d\n", sq);
     return 0;
}

12.3.3 带参数定义和函数的区别

(1)宏展开仅仅是文本的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,
它没有机会参与编译,也不会占用内存。
(2)函数是一段可以重复使用的代码,会被编译,会给它分配内存,每次调用函数,
就是执行这块内存中的代码。
案例:分别使用函数和带参数的宏计算平方值:
函数实现:

#include<stdio.h>

int SQ(int y)
{
	return y * y;
}

int main()
{
	int i = 1;
	while (i <= 5)
	{

		printf("%d\n",SQ(i++));
	}

	return 0;
}

带参数的宏实现:

#include<stdio.h>
#define SQ(y)(y)*(y)

int main()
{
	int i = 1;

	while (i <= 5)
	{
		//SQ(i++)会被替换成(i++)+(i++),i(++)会被执行两次,最终无法得到我们想要的结果
		//printf("%d\n",SQ(i++));

		printf("%d\n",SQ(i));
		i++;
	}

	return 0;

}

12.4 文件包含

#include 指令用于引入标准库头文件、自定义头文件或其他外部源代码文件,以便在当
前源文件中使用其中定义的函数、变量、宏等内容。

一个源文件可以导入多个头文件,一个头文件也可以被多个源文件导入。
标准库头文件、自定义头文件的扩展名都是 .h。

12.4.1 包含标准库文件

标准库头文件是系统提供的头文件,直接引入即可,像我们前面用过的 stdio.h、stdbool.h、string.h、time.h 等。引入标准库头文件需要使用尖括号将文件名包裹起来,格式
如下:

#include<头文件名.h>

12.4.2 包含自定义头文件

自定义头文件的文件名写在双引号里面, 格式如下:

#include“文件名.h”

建议把所有的常量、宏、系统全局变量和函数原型写在自定义的头文件中,在需要的时
候随时引用这些头文件。

(1)使用相对路劲

如果自定义的头文件在源文件的同级目录或源文件所在目录的下级目录,使用 ./ 开头
的路径,./ 可以省略。
如果自定义的头文件在源文件所在目录的上级或者更上级,使用 ../ 开头的路径。
参照以下目录结构:

├─ myheader05.h
└─ project
     ├─ inc
     │     └─ myheader04.h
    ├─ myheader03.h
    └─ src
         ├─ includes
         │    └─ myheader02.h
         ├─ main.c
         └─ myheader01.h

如果要在源文件 main.c 中引入以上自定义的头文件,需按照如下写法:

#include "myheader01.h" // 等价于 #include "./myheader01.h"
#include "includes/myheader02.h" // 等价于 #include "./myheader01.h"
#include "../myheader03.h"
#include "../inc/myheader04.h"
#include "../../myheader05.h"

需要注意的是,建议将头文件放置在源文件所在目录或子目录中,以保持项目的组织结
构清晰

(2)使用绝对路径

绝对路径是文件在文件系统中的完整路径,它从文件系统的盘符(Windows 系统)或
根目录(Linux 系统、MacOS 系统)开始,沿着文件系统的目录结构一直到达目标文件。

Windows 系统中使用绝对路径引入自定义头文件,示例如下:

#include "C:\Preparation\Embedded\01CLang\code\project\foo.h"

Linux 系统或 MacOS 系统中使用绝对路径引入自定义头文件,示例如下:

#include "/usr/local/lib/foo.h"

需要注意的是,通常我们建议使用相对路径引入自定义头文件,因为相对路径更加灵活
和可移植。

12.5 条件编译

12.5.1 #if

(1)  #if...#endif

#if...#endif 指令用于预处理器的条件判断,满足条件时,内部的行会被编译,否则就被
编译器忽略。

#if 0
const double pi = 3.1415; // 不会执行
#endif

上面示例中,#if 后面的 0,表示判断条件不成立。所以,内部的变量定义语句会被编
译器忽略。#if 0 这种写法常用来当作注释使用,不需要的代码就放在#if 0 里面。
#if 后面的判断条件,通常是一个表达式。如果表达式的值不等于 0,就表示判断条件
为真,编译内部的语句;如果表达式的值等于 0,表示判断条件为伪,则忽略内部的语句。

(2)#if … #else … #endif

#if...#endif 之间还可以加入#else 指令,用于指定判断条件不成立时,需要编译的语句。

#define FOO 1

#if FOO
    printf("define\n");
#else
    printf("not defined\n");
#endif

上面示例中,宏 FOO 如果定义过,会被替换成 1,从而输出 defined,否则输出 not
defined。

(3)#if … #elif … #else … #endif

如果有多个判断条件,还可以加入#elif 命令。

#if HAPPY_FACTOR == 0
    printf("I'm not happy!\n");
#elif HAPPY_FACTOR == 1
    printf("I'm just regular\n");
#else
    printf("I'm extra happy!\n");
#endif

上面示例中,通过#elif 指定了第二重判断。注意,#elif 的位置必须在#else 之前。如果
多个判断条件皆不满足,则执行#else 的部分。
没有定义过的宏,等同于 0。因此如果 UNDEFINED 是一个没有定义过的宏,那么#if
UNDEFINED 为伪,而#if !UNDEFINED 为真。

12.5.2 #ifdef 

#ifdef...#endif 指令用于判断某个宏是否定义过。
有时源码文件可能会重复加载某个库,为了避免这种情况,可以在库文件里使用#define
定义一个空的宏。通过这个宏,判断库文件是否被加载了。

#ifdef EXTRA_HAPPY
    printf("I'm extra happy!\n");
#endif
#ifndef EXTRA_HAPPY
    printf("I'm just regular\n");
#endif

上面示例中,针对宏 EXTRA_HAPPY 是否被定义过,#ifdef 和#ifndef 分别指定了两种
情况各自需要编译的代码。
#ifndef 常用于防止重复加载。举例来说,为了防止头文件 myheader.h 被重复加载,可
以把它放在#ifndef...#endif 里面加载。

#ifndef MYHEADER_H
#define MYHEADER_H
#include "myheader.h"
#endif

上面示例中,宏 MYHEADER_H 对应文件名 myheader.h 的大写。只要#ifndef 发现这个
宏没有被定义过,就说明该头文件没有加载过,从而加载内部的代码,并会定义宏MYHEADER_H,防止被再次加载。

12.5.5 案例分析

(1)具体要求
开发一个 C 语言程序,让它暂停 5 秒以后再输出内容"helllo, 尚硅谷!~",并且要求跨
平台,在 Windows 和 Linux 下都能运行,如何处理。
(2)提示
        1)Windows 平台下的暂停函数的原型是 void Sleep(DWORD dwMilliseconds),参数的
单位是“毫秒”,位于<windows.h>头文件。
        2)Linux 平台下暂停函数的原型是 unsigned int sleep (unsigned int seconds),参数的单
位是“秒”,位于 <unistd.h> 头文件。

#include <stdio.h>
#if _WIN32 //如果是 windows 平台, 就引入 <windows.h>
#include <windows.h>
#define SLEEP(t) Sleep(t * 1000)
#elif __linux__ // 如果是 linux 平台, 就引入<unistd.h>
#include <unistd.h>
#define SLEEP sleep
#endif
int main()
{
SLEEP(5);
    printf("hello, 尚硅谷~");
return 0;
}

13.6 预处理命令总结

从XSA到Linux应用:Petalinux与Vitis的嵌入式开发全流程解析 本文详细解析了从XSA文件到Linux应用的嵌入式开发全流程,重点介绍了Petalinux与Vitis工具链的使用技巧和实战经验。通过XSA硬件描述、Petalinux工程搭建、系统镜像优化及Vitis开发配置等关键步骤,帮助开发者高效完成ZYNQ平台开发,解决常见问题并提升开发效率。 阅读详情

相关推荐

Django Cookie/Session

Cookie是一种小型的文本文件,通常由Web服务器发送到用户浏览器,并存储在用户的本地计算机上。当用户再次访问该网站时,浏览器会将Cookie发送回服务器,从而实现用户身份验证、个性化设置等功能。Session是一种在服务器端存储用户会话信息的方式。与Cookie不同,Session数据存储在服务器上,而不是客户端。Django框架通过在客户端存储一个Session ID来实现Session的跟踪。Django框架的Cookie/Session机制为开发者提供了方便的数据存储和会话管理功能。

froginwe11的博客 467

10天学会嵌入式技术之C语言-day-4

手把手入行嵌入式之10天学会C语言day-4

2301_80748708的博客 1314

2023年5月青少年软件编程Python等级考试四级真题(含答案和解析)

电子学会,2023年5月,青少年软件编程,Python等级考试,四级真题(含答案和解析)

m0_37554648的博客 904

10天学会嵌入式技术之C语言-day-2

手把手入行嵌入式之10天学会C语言day-2

2301_80748708的博客 947

从零到一:NI USB-8506 LIN通讯的驱动安装与硬件调试全攻略

本文详细介绍了NI USB-8506 LIN通讯设备的驱动安装与硬件调试全流程,包括硬件准备、驱动下载与配置、NI MAX设置及常见问题解决方案。通过实战应用与性能优化技巧,帮助用户快速掌握LIN通讯技术,适用于车载数据记录和自动化测试等场景。

weixin_28273593的博客 924

SIwave仿真手册——信号完整性仿真之S参数的提取(二)

上一篇简单了讲述了软件的各个操作界面,本次博客更新关于的仿真,因为第二章完整的内容比较多,所以分成好几篇博客进行分享。

luohuo9844的博客 1万+

10天学会嵌入式技术之C语言-day-7

手把手入行嵌入式之10天学会C语言day-7

2301_80748708的博客 829

《UDS协议从入门到精通》系列——图解0x34:请求下载

上传下载类服务之0x34-请求下载,图解请求+响应格式,直观易懂,快速上手!!

车载系统攻城狮 4930

10天学会嵌入式技术之C语言-day-6

手把手入行嵌入式之10天学会C语言day-6

2301_80748708的博客 1093

【华为OD机试真题 2025B卷】737、统计监控器、需要打开多少监控器 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025B卷】737、统计监控器、需要打开多少监控器 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为

KJ.JK 715

Oracle数据库表空间使用情况查询

在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对象的逻辑存储单元。了解表空间的使用情况对于数据库管理员和开发人员来说是非常重要的,因为它可以帮助他们监控数据库的空间使用情况并进行容量规划。本文将介绍如何查询Oracle数据库中的表空间使用情况。通过执行以上SQL查询语句,你可以获得Oracle数据库中表空间的使用情况、文件大小和表空间大小等信息。这些信息可以帮助你了解数据库的存储情况,并进行适当的优化和容量规划。查看表空间的数据文件和表空间大小。查看表空间的使用情况。

CsmbPascal的博客 859

10天学会嵌入式技术之51单片机-day-1

手把手入行嵌入式之10天学会51单片机day-1

2301_80748708的博客 1332

车载软件刷写工具vFlash --- 自动化接口(Automation API)应用简介

车载软件刷写工具vFlash --- 自动化接口(Automation API)应用简介

Soly_kun的博客 361

21天C语言速通计划:清华教授设计的每日突破关卡

C语言作为计算机编程领域的经典语言,以其高效性、灵活性和对底层硬件的强大操控能力,在系统软件、嵌入式开发、游戏开发等众多领域都有着广泛的应用。然而,对于许多初学者来说,掌握C语言并非易事。为了帮助大家在短时间内快速掌握C语言的核心知识和技能,清华教授精心设计了这份21天C语言速通计划,为你打造每日突破关卡,让你在21天内实现C语言的快速入门和提升。

星辰夜语的博客 1266

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jre9下载 jdk9

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

5天学会Linux C高级

软件名_版本号.次版本号-修订次数_架构.后缀函数是一个完成特定功能的代码模块,其程序代码独立变量名=值val=10注:等号两边都不能有空格。CC=gcc取shell变量的值:$变量名在shell编程中通常定义的变量名用大写,变量的调用:$变量名Linux Shell/bash从右向左赋值如:Y=yyX=$Yecho $X //输出yy使用unset命令删除变量的赋值如:X=xxunset Xecho $X //没有任何输出。

qq_52049228的博客 1590

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

10天学会嵌入式技术之51单片机-day-5

手把手入行嵌入式之10天学会51单片机-day5

2301_80748708的博客 1048

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

8天学会C语言?Day1入门+VSCode全配置,零基础也能上手

一、C语言真能8天入门?别被焦虑带偏在编程圈,“3天精通Python”“7天学会Java”的速成口号随处可见,C语言作为出了名的“入门难、后劲足”的语言,竟也有8天速成的说法。

2601_95052618的博客 216

5天零基础通关嵌入式C语言:敲开万亿IoT与工业嵌入式赛道的核心大门

与 const。

从零开始,掌握网络安全。提供全面的网络安全教程、攻防演练技巧和行业动态。 270

21天学会C++_Day1----C++的发展史

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。

金哥的博客 896

21天学会C++:Day1----C++的发展史

21天学会C++:Day1

m0_73096566的博客 1055

Day01-嵌入式自学第一天

`linux@ubuntu:~$` 是什么意思?为什么 Linux 的删除没有回收站?Vim 到底怎么退出?——这是我学嵌入式第一天遇到的所有疑问。本文从零开始,记录了我对嵌入式、Linux、Ubuntu 的理解,以及 pwd/ls/cd/touch/mkdir/cp/mv/rm 八个命令的实战练习、Vim 三种模式切换和 gcc 编译流程。适合刚接触 Linux 的初学者参考。

2401_89245836的博客 581

C语言30天实战:从零基础到项目驱动,掌握核心生产力与接单能力

C语言作为计算机编程的基石,其核心价值在于对底层内存管理和系统资源的直接控制能力。通过理解指针、内存分配等基础原理,开发者能够构建高效的软件系统,尤其在嵌入式开发、操作系统和性能敏感领域具有不可替代的技术优势。掌握C语言不仅能够培养扎实的编程思维,还能为从事系统级开发和高性能应用打下坚实基础。本文以项目驱动和问题解决为导向,通过构建学生信息管理系统等实战案例,帮助学习者将语法知识转化为解决实际问题的能力,并自然融入动态内存管理和文件操作等关键热词,为初学者提供一条清晰的学习路径和就业准备指南。

weixin_30247781的博客 457

C语言30天速通:零基础到项目实战与就业接单指南

C语言作为一门经典的编程语言,其核心价值在于提供了对计算机底层内存和硬件的直接控制能力,是理解计算机系统原理和进行系统级开发的基石。从语法基础到指针、内存管理等核心概念,其学习路径遵循从基础到进阶的工程实践逻辑。掌握C语言不仅能构建扎实的编程思维,更是进入嵌入式开发、操作系统、高性能计算等核心领域的关键。对于初学者而言,一套结构清晰、注重实战的学习方案至关重要。本文聚焦于【30天速通】与【实战项目】两大核心,提供了一条从零基础到具备完成控制台应用、管理文件数据、进行动态内存分配等能力的系统化路径。该路径通过

weixin_30820077的博客 423

机械本科生勇闯嵌入式[ DAY 1 ]

51单片机核心包含4组8位I/O口(P0-P3)、128字节RAM、4KB ROM(可扩展)和2个16位定时器。深入研究总线协议(I2C、SPI)驱动OLED、EEPROM等器件,为后续学习STM32等高级单片机打下基础。中断系统支持5个中断源(2个外部、2个定时器、1个串口),通过IP寄存器设置优先级。定时器工作模式由TMOD寄存器控制,常见模式1为16位计数,模式2为8位自动重装。学习使用看门狗定时器(WDT)提高系统稳定性,了解低功耗模式(如空闲模式和掉电模式)的应用场景。

Ganmingru的博客 721

C学习笔记【day01】

C++ DAY01 就业方向 前端开发工程师 分为B/S,C/S模式 C/S方向有两个,一个是金融方向客户端,一个是游戏方向客户端 B/S模式和C/S模式区别 B/S不需下载客户端,浏览器就是一个客户端。操作简单,传输数据不方便,系统更新较为容易。 C/S需要独立安装客户段。操作复杂,数据文件保存至本地,传输数据比较少,系统每次升级都需要重新下载资源。 后端开发工程师为主要的就业方向 大数据就业方向目前比较好的三个方向:推荐,广告,搜索,图像处理,AI。 嵌入式开发工程师 需要懂硬件(需要学会数电和模

IMNOTTOBE的博客 1437

打灰哥学习嵌入式51的Day 4

-----其作用就是能够实时响应外部的事件,提高了系统的灵活性和响应能力。定时器中断实现步骤:启用定时器中断、选择定时器脉冲来源和工作模式、设置脉冲计数器初始值、设置定时器中断优先级、启动定时器。中断优先级:每个中断可以设置4个优先级,数字越大,优先级越高【两个优先级相同的中断同时触发,中断号小的优先】定时器中断流程分析:看手册自行分析(主要学习了模式1--16位定时器/计数器)今天的学习内容主要分为三部分:中断系统的简单概述、外部中断、定时器中断。下面有一个定时器中断案例:-------LED闪烁。

qq_51589300的博客 370
上一篇: 10天学会嵌入式技术之C语言-day-7
下一篇: 10天学会嵌入式技术之C语言-Day-9
昊昊昊昊昊明
博客等级 码龄3年 285粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值