首页/新闻资讯/正文详情

嵌入式基础day09学习笔记

发布时间:2026/9/27 5:24:41 来源:云帆数科 栏目:资讯中心
嵌入式基础day09学习笔记
多级指针 void指针 const多级指针的基本用法多级指针把一个指向指针变量的指针变量称为多级指针变量对于指向处理数据的指针变量称为一级指针变量指向一级指针变量的指针变量称为二级指针变量二级指针变量的说明形式如下数据类型 ** 指针名 相关代码示例#include stdio.h ​ int main() { int a 10; int * p a; int ** q p; ​ printf(%d %p %p\n, a, p, q); printf(%p %p %p\n, a, p, q); printf(%ld %ld %ld\n, sizeof(a), sizeof(p), sizeof(q)); printf(%d %d %d\n, a, *p, **q); ​ printf(int *:%p %p\n, p, p 1); printf(int **:%p %p\n, q, q 1); ​ return 0; } ​输出结果10 0x7ffd3bfc9c94 0x7ffd3bfc9c98 0x7ffd3bfc9c94 0x7ffd3bfc9c98 0x7ffd3bfc9ca0 4 8 8 10 10 10 int *:0x7ffd3bfc9c94 0x7ffd3bfc9c98 int **:0x7ffd3bfc9c98 0x7ffd3bfc9ca0 ​​多级指针的运算多级指针的运算指针变量加1是向地址大的方向移动一个目标数据多级指针运算也是以其目标变量为单位进行偏移int **pp1移动一个int *变量所占的内存空间int * * *pp1移动一个int **所占的内存空间代码案例#include stdio.h ​ int main() { int a[] {4, 6, 9, 10, 20}; int *p[5]; int n sizeof(a) / sizeof(int); int i; int **q; ​ for (i 0; i n; i) { p[i] a[i]; } for (i 0; i n; i) { printf(%d %d\n, a[i], *p[i]); } ​ q p;//p[0] printf(%d %d %d %d\n, a[1], *p[1], **(q 1), *q[1]); printf(%p %p\n, q, q 1); ​ return 0; }多级指针和指针数组指针数组也可以用另外一个指针来处理。例如有一个一维字符指针数组ps[5]char *ps[5] { Beijing city,……London city } ;定义另一个指针变量pps并且把指针数组的首地址赋予指针ppschar *ps[5]{……}; char ** pps ps;代码案例#include stdio.h ​ int main() { char *s[5] {apple, pear, peach, orange, banana}; char ** p s;//s[0] ​ printf(%s\n, s[1]); printf(%s\n, *(p 1)); ​ p; printf(%s\n, *p); ​ return 0; } ​运算结果pear pear pearvoid指针及用法万能指针万能指针其实就是void *类型的指针而void *指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。当某个指针是void型指针时所指向的对象不属于任何类型。因为void指针不属于任何类型不可以对其进行算术运算比如自增编译器不知道其自增需要增加多少。​void指针一般形式为void * 指针变量名称 ;对于void指针在没有强制类型转换之前不能进行任何指针的算术运算万能指针使用规则使用前必须被初始化解引用过程必须强制转换应用案例1#include stdio.h ​ int main() { int a 10; float b 3.14; char c c; ​ void * p; ​ p a; printf(int:%d %d\n, a, *(int *)p); ​ p b; printf(float:%f %f\n, b, *(float *)p); ​ p c; printf(char:%c %c\n, c, *(char *)p); ​ return 0; }输出结果int:10 10 float:3.140000 3.140000 char:c c应用案例2#include stdio.h ​ int main() { int a[] {1, 4, 5, 2, 10, 9}; void * p a; int i; ​ for (i 0; i sizeof(a) / sizeof(int); i) { //printf(%d\n, a[i]); printf(%d , *((int *)p i)); } putchar(\n); return 0; }输出结果1 4 5 2 10 9const变量 const指针常量化变量的值一般说明形式如下const 数据类型 变量名 [表达式] ;常量化变量是为了使得变量的值不能修改变量有const修饰时若想用指针间接访问变量指针也要有const修饰。const放在指针声明的什么位置呢就近原则const修饰谁谁不能改变代码案例#include stdio.h ​ int main() { const int m 10;//int const m 10; int * p m; // error: m; (*p); printf(%d\n, m); return 0; }常量化指针目标表达式一般说明形式如下const 数据类型 * 指针变量名称[ 指针运算表达式] ;常量化指针目标是限制通过指针改变其目标的数值 但指针变量存储的地址值可以修改代码案例#include stdio.h ​ int main() { int m 10; int n 100; const int * p m; //error:(*p); p n; printf(%d\n, *p); return 0; }常量化指针变量一般说明形式如下数据类型 * const 指针变量名称[ 指针运算表达式] ;使得指针变量存储的地址值不能修改。但可以通过 指针变量名称可以修改指针所指向变量的数值代码案例#include stdio.h ​ int main() { int m 10; int n 100; int * const p m; //error:p n; *p 300; printf(%d\n, *p); return 0; }常量化指针变量及其目标表达式一般说明形式如下const 数据类型 * const 指针变量名 指针运算表达式 ;常量化指针变量及其目标表达式使得既不可以修改指针变量的地址也不可以通过*指针变量名称修改指针所指向变量的值代码案例#include stdio.h ​ int main() { int m 10; int n 100; const int * const p m; //error:p n; //error:*p 300; printf(%d\n, *p); return 0; } ​main函数的参数main函数详细格式int main(int argc, const char *argv[])argv为保存命令行参数的字符串指针其中第0个参数是程序的全名以后的参数为命令行后面跟的用户输入的参数argv参数是字符串指针数组其各元素值为命令行中各字符串的首地址。指针数组的长度即为参数个数argc。代码案例#include stdio.h ​ int main(int argc, const char * argv[]) { if (argc ! 3) { printf(usage:%s ip port\n, argv[0]); return 0; } ​ int i; printf(argc%d\n, argc); for (i 0; i argc; i) { //*argv[i] A; printf(%s\n, argv[i]); } return 0; } ​函数的基本用法及传参函数函数是一个完成特定功能的代码模块其程序代码独立通常要求有返回值也可以是空值。一般形式如下:数据类型 函数名称( 形式参数说明 ) {语句序列return[(表达式)];}数据类型数据类型是整个函数的返回值类型。return[(表达式)]语句中表达式的值要和函数的数据类型保持一致。如无返回值应该写为void型函数形式参数说明是逗号””分隔的多个变量的说明形式大括弧对 {语句序列 }称为函数体语句序列是大于等于零个语句构成的代码举例使用函数实现打印hello world#include stdio.h ​ void print_hello(); ​ int main() { print_hello(); return 0; } ​ void print_hello() { printf(hello world\n); } ​函数的调用函数的使用也叫函数的调用形式如下函数名称〈实际参数〉对于无返回值的函数来讲只能形成一个函数调用语句。函数调用可以作为一个运算量出现在表达式中也可以单独形成一个语句。实参就是在使用函数时调用函数传递给被调用函数的数据。代码举例编写函数功能求两个整数的最大值并在main函数中调用该函数#include stdio.h ​ //int get_max(int, int); //int get_max(int a, int b); int get_max(int x, int y); ​ int main() { int i, j; int ret; printf(); scanf(%d%d, i, j); ​ ret get_max(i, j); printf(max:%d\n, ret); ​ return 0; } ​ int get_max(int a, int b) { if ( a b ) { return b; } else { return a; } }函数的声明函数原型声明函数的声明就是指函数原型其中形式参数说明可以缺省说明的变量名称但类型不能缺省例如double power(double, int);编译器从上往下顺序进行编译函数的应用定义求x的N次方值的函数 x是实数, n为正整数代码案例#include stdio.h ​ int global_a 200; double fun_pow(double x, int n); ​ int main() { double x 2; int n 10; printf(%lf\n, fun_pow(x, n)); printf(global_a%d\n, global_a); /* double ret; ret fun_pow(x, n); printf(%lf\n, ret); */ ​ return 0; } ​ double fun_pow(double x, int n) { int i; double ret 1; ​ global_a; ​ for (i 0; i n; i) { ret * x; } return ret; }

相关推荐

C++学习日记 Day7:类对象作为类成员+友元
C++学习日记 Day7:类对象作为类成员+友元

## 今天学了什么今天学习C类对象作为类成员语法、类和对象-友元。## 类对象作为类成员在C中,类中的成员可以是另一个类的对象,在构造时,会先构造其他类对象,再构造类自身,析构顺序则相反。验证:打开VIsio s… · 2026/9/27 5:24:41

Python协同过滤旅游推荐系统:从矩阵构建到Top-N推荐实现
Python协同过滤旅游推荐系统:从矩阵构建到Top-N推荐实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 5:24:22

不懂代码搞高权重网站出售:5步用免费工具搞定
不懂代码搞高权重网站出售:5步用免费工具搞定

不懂代码搞高权重网站出售:5步用免费工具搞定 想做网站却连一行代码都不会写?别慌,这正是大多数创业团队负责人的常态。你不需要成为程序员,只需要会点鼠标和懂得使用 免费工具 ,就能搭建出能卖钱的网站。… · 2026/9/27 5:24:22

AS5600角度跳变根因分析与STM32五层防护实战
AS5600角度跳变根因分析与STM32五层防护实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 6:04:54

吃透C语言核心运算符,一段代码搞定赋值、位运算、逻辑运算、嵌套三目运算
吃透C语言核心运算符,一段代码搞定赋值、位运算、逻辑运算、嵌套三目运算

很多C语言初学者学完语法后,最大的痛点就是:分不清赋值/逻辑/位运算的区别、看不懂三目运算嵌套、搞不懂运算符优先级。这些基础运算符是编程的基石,也是笔试、面试、期末考的高频考点,很多人栽在 & 和&&、| 和 ||、普… · 2026/9/27 6:04:54

3个实战案例拆解wordpress4.8模板路径避坑
3个实战案例拆解wordpress4.8模板路径避坑

3个实战案例拆解wordpress4.8模板路径避坑 域名买回来不会配,服务器买完不知道放哪,这种“搞不懂”的焦虑,很多创业团队负责人都经历过。别急,今天不聊虚的,直接上 实战案例… · 2026/9/27 6:04:54

PaddleGAN 图像翻译实战指南:Pix2Pix 与 CycleGAN 的配对/非配对训练全解析
PaddleGAN 图像翻译实战指南:Pix2Pix 与 CycleGAN 的配对/非配对训练全解析

人工智能深度学习计算机视觉媒体生成视频处理图像处理 【免费下载链接】PaddleGAN PaddlePaddle GAN library, including lots of interesting applications like First-Order motion transfer, Wav2Lip, picture repair, image editing, photo2cartoon, image style transfer,… · 2026/9/27 6:04:48

RK3588烧录卡在Loader阶段的根因与实战解决方案
RK3588烧录卡在Loader阶段的根因与实战解决方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 6:04:48

二极管完全指南:从原理到仿真,一文搞懂!
二极管完全指南:从原理到仿真,一文搞懂!

结合线性直流稳压电源实战案例 | 含电路仿真波形图大家好!今天我们来聊聊电子世界里最基础也最重要的器件之一——二极管。无论你是电子小白还是想系统复习的工程师,这篇文章都会带你从原理到仿真,全面搞懂二极管!────────… · 2026/9/27 6:04:48

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码