- 博客(53)
- 收藏
- 关注
原创 ARM学习笔记(12)
输出1KHz的PWM信号,周期就是1ms,对应周期寄存器的数值设为1000即可。芯片内部寄存器可以直接读取设备ID、触摸点数、每个点的XY坐标等信息,坐标数据存放在0x8158 ~ 0x815B地址区间。4. 配置GIC中断控制器:注册gt9147中断处理函数,设置中断优先级,使能对应中断通道。7. 中断服务函数中,先判断当前按下的点数,再依次读取每个点的坐标。// PWM初始化:1MHz计数时钟,1KHz周期,50%占空比。- 引脚默认高电平:采样寄存器值越大,占空比越大。
2026-09-29 17:29:53
550
原创 ARM学习笔记(11)
屏幕尺寸以英寸为单位,指的是屏幕左上角到右下角的对角线长度,1英寸等于2.54厘米。屏幕分辨率是横向像素点个数 × 纵向像素点个数,常见规格有800×480、1920×1080(1080P)、2560×1440(2K)。本质上和二维数组是对应的,相当于 unsigned int a[480][800] ,a[0][0]就对应屏幕左上角的第一个像素。- PCLK(Pixel Clock):像素时钟信号线,用来同步每个像素点发送的时间间隔。- RGB565:每个像素占2字节,R、G、B分别占5位、6位、5位。
2026-09-28 19:59:07
434
原创 ARM学习笔记(10)
SPI全称串行外设接口,是全双工、同步的串行通信协议,典型一主多从架构,由SCLK时钟线、MOSI、MISO、CS片选线四根线组成。MOSI负责主机发送、从机接收,MISO负责从机发送、主机接收,CS是片选信号,主机拉低对应从机的CS引脚即可选中通信,速率覆盖1MHz到上百MHz,像OLED、加速度传感器这类外设大多支持SPI驱动。常用的SPI从机设备ADXL345是三轴加速度传感器,它的分辨率为13位,加速度量程可达±16g,1g对应9.8m/s²。- 拓扑:I2C支持多主多从,SPI为一主多从架构。
2026-09-27 18:41:32
404
原创 ARM学习笔记(9)
另一个是LM75温度传感器,工作电压2.7V~5.5V,测温范围-55℃~125℃,精度±2~±3℃,9位分辨率对应0.5℃步进,设备地址0x48,温度寄存器地址0x00,读取2字节数据后舍弃低7位,就能得到当前温度值,都是入门常练的器件。再说说ADC分辨率,指的是用多少位二进制数来表示转换结果,位数越高,能划分的电压等级越精细,最小可识别的电压变化就越小。以5V基准电压为例,把电压区间不断对半拆分,让待测电压和区间中间值逐一比较,大于中间值记1,小于则记0,一步步缩小范围,最终逼近真实电压值。
2026-09-27 09:54:02
455
原创 ARM学习笔记(8)
读写的时候按地址去操作寄存器位就行,这也是 I2C 最常见的应用场景——挂个传感器、EEPROM 之类,就是往它寄存器地址里读写数据。最低位是 0 ,表示主机写数据给从机;- 应答信号:第 9 个时钟周期,接收方向发送方回复应答——低电平是 ACK,高电平是 NACK。- 起始信号:SCL 为高电平时,SDA 从高变低,出现下降沿。- 结束信号:SCL 为高电平时,SDA 从低变高,出现上升沿。// 起始信号:SCL 高电平时,SDA 高->低。// 结束信号:SCL 高电平时,SDA 低->高。
2026-09-23 18:38:11
417
原创 ARM学习笔记(7)
EPIT 是 32 位自减型定时器,计数范围 0x00000000 ~ 0xFFFFFFFF ,时钟源可以选 24 MHz,也可以选 32.768 KHz 的 RTC。GPT 最典型的应用是电机转速相关。频率是周期的倒数,反过来就能算出转速。输入捕获:从某个引脚捕获两次电平跳变之间的时间间隔,属于输入检测,一般用来测电机转速这类信号。输出比较:匹配到计数值之后,从引脚输出指定频率的方波,属于输出控制,一般用来控制电机转速。今天整理 day07 的笔记,主要是定时器和 UART 两块,挑几个关键点过一遍。
2026-09-22 18:32:22
407
原创 ARM学习笔记(6)
顺带提一下ocp原则:对代码修改是关闭的,对代码扩展是开放的,写驱动的时候尽量按这个思路来。PFD(相位分数分频器):实现分数倍频/分频,比例为N/M,大于1是倍频,小于1是降频。预分频器的位宽决定分频范围,2位预分频器分频档位少,3位预分频器可以实现1~8分频。GIC V2版本:最多支持1020个中断,256个优先级,范围0~255。IMX6ULL芯片:实际支持160个中断,32个优先级,范围0~31。PLL(锁相环):倍频,输入24MHz,乘以N倍得到高频时钟。中断优先级的规则是编号越小,优先级越高。
2026-09-21 17:34:54
418
原创 ARM学习笔记(5)
GIC全称通用中断控制器,是ARM专门为Cortex-A系列处理器设计的中断管理外设,相当于所有中断的总调度室。今天整理IMX6ULL的中断体系,和之前51单片机的中断对比下来,架构上复杂不少,核心差别就是多了一层GIC通用中断控制器。对比51单片机的中断,IMX6ULL多了GIC分发这一层,还要处理多核的中断分发,逻辑上更完整。1. 外设端:配置引脚中断触发方式(比如下降沿),打开外设中断使能,满足条件时外设发出中断信号。4. 内核读取GIC的中断通知寄存器,拿到中断号,找到对应的中断服务函数执行。
2026-09-20 18:25:38
612
原创 ARM学习笔记(4)
工程上一般会把外设驱动分层放到bsp目录,比如led.c、led.h,beep.c、beep.h,主函数只调用接口,结构更清晰。objcopy:格式转换工具,把elf文件转换成纯二进制的bin文件,去掉调试信息和段头,直接可以烧写到开发板运行。ld:链接器,把多个.o目标文件拼接起来,指定程序运行的起始地址,生成elf可执行文件。gcc:编译器,把.c和.S源文件编译成.o目标文件,只做编译和汇编,不做链接。.text段:存放代码和指令,是只读可执行的,程序运行的入口就在这里。
2026-09-18 20:38:49
393
原创 ARM学习笔记(3)
CCM_CCGR0 ~ CCM_CCGR6 控制所有外设的时钟门,写入 0xFFFFFFFF 即可打开全部外设时钟。软中断(SVC):由指令主动触发,格式为 SVC<c> #<imm24> ,比如 svc #7 ,常用于实现系统调用。IOMUXC_SW_MUX_CTL_PAD_xxx :配置引脚复用功能,选择是GPIO还是其他外设模式。IOMUXC_SW_PAD_CTL_PAD_xxx :配置引脚电气属性。GPIOx_DR 输出高低电平,写0为低,写1为高。
2026-09-17 18:25:16
444
原创 ARM学习笔记(2)
判断规则:能由一个8位的常数循环右移偶数位得到,也就是0~255范围内的数,通过循环右移偶数位可以得到的数值,就是合法立即数。2. bl:带链接的跳转,跳转前会把下一条指令的地址保存到LR寄存器,用于函数调用,调用完可以通过LR返回。ADD{S}{c} <Rd>, <Rn>, <Rm>, <type> <Rs> @ 带移位的加法。ORR:按位或指令,用来将寄存器的某一位置1,操作数中为1的位,对应目标位就置1。BIC:位清除指令,用来将寄存器的某一位清0,操作数中为1的位,对应目标位就清零。
2026-09-16 18:23:10
530
原创 ARM学习笔记(1)
Cortex-A:应用级,跑操作系统的场景,比如手机、平板。代表有Cortex-A5、A7、A8、A9,像IMX6ULL、STM32MP157用的就是Cortex-A7。指令精简,芯片结构简单,成本低、体积小、功耗低。指令功能多,芯片设计复杂,成本高、体积大、功耗也大。PC(R15):程序计数器,本质是指针,指向当前正在执行指令的下一条指令。Cortex-R:实时领域,主打高实时性,典型如汽车电子。
2026-09-15 19:02:23
492
原创 51单片机学习笔记:ds18b20要点整理
复位 → 发 0xCC 跳过 ROM → 发 0x44 开启温度转换 → 延时 750ms → 再复位 → 发 0xBE 读温度 → 连续读 2 个字节。分辨率:9~12 位可调,步进 0.5℃ / 0.25℃ / 0.125℃ / 0.0625℃。写'0':拉低至少 60us、不超过 120us,传感器在 15~60us 内采样到低电平。if(dat & 0x01) // 写1:拉低<15us就释放。// 拉低480~960us,复位脉冲。// 15us内采样。// 采样应答(拉低60~240us)
2026-09-14 18:16:43
525
原创 51单片机学习笔记(3)
单片机IO是TTL电平,电脑原生串口是RS232负逻辑电平,两者电压范围不同,不能直接对接。CH340就是常用的电平转换芯片,实现USB转TTL串口,电脑和单片机就能通信了。串行是单根线逐位传输,硬件成本低、传输距离远、抗干扰强,长距离一般都用串行,比如RS485差分传输;最经典的参数配置:9600 8 N 1,对应波特率9600、8位数据位、无校验、1位停止位。从机应答时,功能码最高位置1,比如主机发0x01,从机回0x81。整体看下来,串口配置和协议解析是这部分的核心,也是后面上位机控制实验的基础。
2026-09-12 18:42:11
626
原创 51单片机学习笔记(2)
简单说就是CPU跑程序的时候,外部有更紧急的事件过来,先暂停当前任务,去处理紧急事件,处理完再回来接着跑。输入模式用来检测引脚电平变化,比如按键、ADC信号,细分有上拉输入、下拉输入、浮空输入、模拟输入。51单片机用12MHz晶振时,经过12分频,实际计数频率是1MHz,也就是每1微秒计数器加1。第二天的内容核心是GPIO、中断、定时器和PWM,都是后续实操的基础,把重点捋一遍。中断有优先级,高优先级可以打断低优先级的中断服务,也就是中断嵌套,最多支持两层嵌套。
2026-09-11 19:21:04
490
原创 51单片机学习笔记:入门篇
同一时刻只有一位数码管点亮,快速轮询切换,利用人眼视觉暂留,看起来就是常亮的效果。频率和时间互为倒数,比如2.1GHz的信号,对应的周期约为0.5ns,逻辑分析仪这类工具经常会用到这个换算。按材料分为锗管、硅管;按结构分为NPN和PNP,看箭头就能区分:箭头朝外是NPN,箭头朝内是PNP。MCU:微控制器,把外设、存储器都集成在单芯片上,成本低,单片机就属于MCU。第一天都是打底的内容,位运算和动态显示的逻辑是后面所有实验的基础,得吃透。4. 按位异或 ^ :相同为0,不同为1,用来翻转指定位电平。
2026-09-10 20:00:17
421
原创 Linux学习笔记:poll与epoll
简单说就是poll解决了select有fd数量上限的问题,但本质上和select差不多,还是要在用户态和内核态之间来回拷贝,返回后还要自己遍历找哪个fd就绪了,而且只有水平触发。整体流程就是epoll_create创建集合,epoll_ctl把fd加进去,epoll_wait等事件,返回后直接遍历就绪的fd处理就行,比select简洁高效很多。epoll比poll和select都高效,核心原因就是集合放在内核里,不用每次调用都拷贝一遍,而且直接返回就绪的fd,不用自己遍历全部。
2026-09-05 10:47:56
552
原创 Linux学习笔记:TCP并发服务器
printf("客户端 [%s:%d] 断开\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));printf("客户端 [%s:%d] 接入\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));主线程负责accept,每来一个客户端就创建一个子线程,子线程负责收发。四种方式各有适用场景,客户端少用多进程多线程就行,高并发场景下IO多路复用更合适,不用频繁创建销毁进程线程。
2026-09-03 17:42:55
530
原创 Linux学习笔记:HTTP协议
第一行是请求行,GET是请求方法,/是请求路径,HTTP/1.1是协议版本。HTTP本质就是TCP连接上发一段规定格式的文本,服务器收到后返回一段状态行加响应头加空行加响应体,把这些拼对就能通信。第一行是状态行,200是状态码,OK是状态描述。后面是响应头,空行之后是响应体,也就是实际的网页内容。HTTP是超文本传输协议,在应用层,基于传输层TCP协议,默认端口80。接着上一篇,整理HTTP协议这部分,应用层的内容,基于TCP的。URL里问号后面是参数,多个参数用&连接,参数名和值用等号连接。
2026-09-02 18:31:45
548
原创 Linux学习笔记:TCP协议
应答机制:TCP为发送的数据进行编号,发送数据时报文头部的序列号是这包数据第一个数据的编号;TCP和UDP最大的区别就是TCP要先建立连接再通信,服务端需要listen监听、accept接收客户端,收发用send和recv,断开时走四次挥手。服务端:socket() → bind() → listen() → accept() → recv() → send() → close()- 滑动窗口机制:本质是个缓冲区,保存已发送并收到应答的数据、已发送未收到应答的数据、未发送但在对方处理范围内的数据。
2026-09-01 19:09:37
317
原创 Linux学习笔记:网络通信
应用层:HTTP(超文本传输)、HTTPS(SSL加密)、FTP(文件传输,TCP)、TFTP(简单文件传输,UDP)、DNS(域名解析)、MQTT(物联网消息队列遥测传输)端口号是16位的数值,范围0-65535,作用是唯一标识一个网络进程,通讯时用来区分数据包属于哪个进程。- 1-1023:知名端口,http是80,FTP是20/21,TFTP是69,HTTPS是443,MQTT是1883。子网掩码用来区分网络位和主机位,比如255.255.255.0,是1的部分对应网络位,是0的部分对应主机位。
2026-08-31 18:46:02
621
原创 Linux学习笔记:信号、消息队列与共享内存
管道适合简单的数据流,信号适合异步通知,消息队列带类型可以做优先级,共享内存效率最高但需要额外同步,根据场景选就行。共享内存是进程间效率最高的通信方式,原理是利用内存映射,把同一段物理内存映射到多个进程的用户空间,避免了数据的反复拷贝。消息队列是System V的IPC对象,思路是把通信数据封装成消息体来发送,还增加了消息类型,可以按类型设置优先级。// 只收类型为1的。信号是进程间的通知机制,不携带数据,属于异步通知,也叫软中断。// 建立映射,shmaddr传NULL让系统选地址,返回映射后的首地址。
2026-08-29 19:21:49
578
原创 Linux学习笔记:进程间通信(IPC)
我整理了一下,主要分三大类:同一主机的古老通信方式(无名管道、有名管道、信号)、System V的IPC对象(共享内存、消息队列、信号量集),还有跨主机用的socket网络通信。有名管道有个特点:open的时候会阻塞,必须读端和写端同时打开,程序才会继续往下走。操作比无名管道多一步:先创建管道文件,再打开、读写、关闭。创建并打开一个无名管道,pipefd[0]是读端,pipefd[1]是写端。操作流程很简单:创建管道、读、写、关闭。读返回0:只有读端没有写端时,管道没数据了read直接返回0,不再阻塞。
2026-08-28 17:57:11
519
原创 Linux多线程:创建、回收与互斥同步
四个参数:thread保存线程ID,attr是线程属性(传NULL用默认),start_routine是线程要执行的任务函数,arg是传给任务函数的参数。分离属性:用 pthread_detach(tid) 设置,线程结束后由操作系统自动回收,不需要其他线程管。创建线程的主进程不能先于线程结束,否则线程直接就没了。线程退出有三种方式:线程函数执行完return、所在进程结束、调用 pthread_exit 主动退出。非分离属性:这是默认属性,线程结束后必须被其他线程回收,用 pthread_join。
2026-08-27 18:47:50
621
原创 Linux学习笔记:进程回收、exec函数簇与线程
命名规律其实挺好记:l代表list(参数列表形式),p代表PATH(走环境变量查找),v代表vector(数组形式传参)。它的本质是把外部程序替换到当前进程的文本区,进程本身还是那个进程,只是跑的代码变了。创建线程时,进程只为它分配独立的栈区空间(默认8M),堆区、数据区、文本区、内核区域都是和进程共享的。和execl类似,但它会去PATH环境变量保存的路径里找可执行文件,所以file直接写程序名就行,比如 "ls"。效率 (进程)要分配0-4G虚拟内存,开销大 (线程)创建快,只分配栈区,切换也快。
2026-08-26 18:10:23
424
原创 Linux学习笔记:进程
僵尸进程:进程已经退出了,但父进程没回收它的资源。避免方法:父进程用 wait() 或 waitpid() 回收,或者让它变成孤儿进程由系统回收。printf("子进程: PID=%d, 父进程PID=%d\n", getpid(), getppid());创建时操作系统会给它分配0-4G的虚拟内存空间,进程是系统资源分配的最小单位。- 孤儿进程:父进程先结束了,子进程就成了孤儿,会被系统进程收养,结束后由系统回收。配合 getpid() 拿自己的PID, getppid() 拿父进程的PID。
2026-08-25 18:25:07
415
原创 Linux学习笔记:目录IO与帧缓冲
它把显存抽象成设备文件,应用层往这个设备里写数据,就能控制屏幕上每个像素点的颜色。以上就是目录IO、常用辅助函数和framebuffer的核心内容,都是Linux应用编程里比较基础的部分,记下来方便以后翻。这篇接着之前的文件IO往下记,主要是目录操作、一些常用辅助函数,还有framebuffer的基本用法。从目录流里读一条文件信息,成功返回struct dirent指针,读到末尾或失败返回NULL。创建一个目录文件,参数是目录名和权限,成功0失败-1。打开一个目录,成功返回目录流指针,失败返回NULL。
2026-08-24 17:58:33
466
原创 Linux学习笔记:文件IO
文件IO是Linux内核提供的接口,属于系统调用,操作对象是文件描述符而不是FILE指针。可以组合使用,比如标准IO的"w"对应 O_WRONLY | O_TRUNC | O_CREAT ,mode给0664。文件描述符:打开文件时系统分配的一个小的非负整数,用来标记这个文件。- 全缓冲:默认4K,文件交互。关闭文件,成功返回0,失败返回-1。从文件读取数据,成功返回实际读到的字节数,到达文件末尾返回0,失败返回-1。向文件写入count字节的数据,成功返回实际写入的字节数,失败返回-1。
2026-08-24 00:29:01
464
原创 Linux学习笔记:fwrite、fread与流定位
四个参数:ptr是数据首地址,size是每个元素多少字节,nmemb是写几个元素,stream是文件流指针。whence有三个取值:SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾)。用的时候注意,tm_mon是从0开始的,tm_year要加1900才是实际年份。/* 星期 0-6, 周日=0 *//* 一年中第几天 0-365 *//* 年 - 1900 *//* 时 0-23 *//* 秒 0-60 *//* 分 0-59 *//* 月 0-11 */
2026-08-21 19:06:34
357
原创 Linux应用软件编程学习笔记(一)
变量、数组、数据结构都存在内存里,读写快,但程序结束或掉电就没了,空间小还贵。文件存在硬盘上,速度慢点,但掉电不丢,空间大便宜。查man手册时分章节:man 1是命令,man 2是系统调用,man 3是库函数。Linux里一切皆文件,不只是.txt、.jpg这种,硬件操作接口也是文件,比如/dev/fb0。逻辑很直接:打开源文件和目标文件,循环从源文件读一个字符写进目标文件,读到EOF就停,最后关文件。- 标准IO:标准C库提供的接口,属于库函数,比如printf、scanf,头文件stdio.h。
2026-08-20 20:14:47
335
原创 c语言学习笔记:排序与查找方法整理
/ 优化:本轮是否发生交换。// 小于基准的区域边界。时间复杂度:平均 O(nlogn),最坏 O(n²)1、选择排序:每轮选出最小元素,放到已排序区间末尾。时间复杂度:O(logn) 空间复杂度:O(1)4、快速排序:选基准,分区,递归排序左右子数组。空间复杂度:O(logn) 不稳定。空间复杂度:O(1) 不稳定。空间复杂度:O(1) 稳定。空间复杂度:O(1) 稳定。时间复杂度:O(n²)时间复杂度:O(n²)
2026-08-20 09:42:37
425
原创 数据结构学习笔记:二叉树
第12层共 2^11 = 2048 个节点,其中 472 / 2 = 236 个有孩子(非叶子),剩下 2048 - 236 = 1812 个是叶子。满二叉树基础上,按从左至右、从上至下的顺序增加节点;12层满二叉树有 2^12 - 1 = 4095 个节点,4567 - 4095 = 472,说明第13层有472个节点。树是根节点加若干子节点,一对多的关系。二叉树就是广度为二的树形结构,各节点的左右子节点不能交换。- 叶子节点(终端节点):没有子节点,度为0。- 分支节点:有子节点的节点。
2026-08-18 19:46:51
440
原创 数据结构学习笔记:队列与栈
栈的应用我觉得挺有意思的:撤销功能、网页的后退、判断回文字符串、检查括号是否配对,这些本质上都是栈的思想。栈的基本操作也就这些,核心就是记住"先进后出"四个字,不管顺序还是链式实现,思路都是一样的。链式栈用链表实现,通常把链表头当作栈顶,这样入栈出栈都是头插头删,效率最高,不需要遍历。队列的应用场景挺多的,最常见的就是数据缓存,比如打印机的任务队列、消息队列这些。入队和出队的逻辑都不复杂,入队找尾,出队删头,记得维护好队尾指针就行。平时用得最多的是空增栈,栈顶指向下一个可插入的位置。
2026-08-17 20:52:26
363
原创 数据结构学习笔记:双向链表、内核链表与队列
普通链表是把数据塞进结点里,一旦定了数据类型,这条链表就只能存这种类型。内核链表反过来,把链表结点嵌到数据结构体里面,这样同一套链表操作函数能操作不同类型的数据,复用性强很多。入队在队尾操作,出队在队头操作,有了尾指针入队就不用从头遍历到尾了,效率高一些。常用操作和单向链表差不多:创建、插入、删除、查找、修改、遍历、销毁。出队的时候要注意边界情况:队里只剩一个结点时,删完后头指针和尾指针都得置空,不然尾指针就成野指针了。常用场景是数据缓存。操作接口包括:创建队列、入队、遍历、判空、出队、取队头元素、销毁。
2026-08-17 08:30:03
528
原创 数据结构学习笔记
要学的内容包括顺序表、单向链表、双向链表、循环链表、队列、栈、二叉树、哈希表。尾删稍微麻烦一点,得找到倒数第二个结点,把它的 pnext 置空再释放最后一个结点。- 顺序存储:占连续内存,代表是数组。访问快,但插入删除要移动大量数据,还得预分配空间,分多了浪费分少了越界。头插的思路很直接:新建结点 → 赋值 → 新结点的指针域指向原来的头结点 → 头指针指向新结点。链表的基本操作有七个:创建、插入(头插/尾插)、删除(头删/尾删)、查找、修改、遍历、销毁。- 线性结构:一对一,比如顺序表、链表、队列、栈。
2026-08-13 20:38:50
458
原创 c语言学习笔记:内存管理与位运算
这部分核心就是理解内存分布、会用malloc/free,以及位运算的几个常用操作。- 堆区:手动申请和释放,空间大但效率相对低。用malloc申请,free释放,忘了释放就内存泄漏了。系统自动管理,默认8M,访问效率高但空间小。- malloc(size) :申请size字节的堆空间,成功返回首地址,失败返回NULL。最近学到了内存管理和位运算这一块,内容不算多但挺重要的,整理一下重点。>> 右移 有符号数补符号位,无符号补0,相当于除2^n。原理就是 a ^ a = 0 , a ^ 0 = a。
2026-08-10 21:01:15
518
原创 c语言学习笔记:联合体,枚举与内存管理
这部分内容里,内存管理是重点也是难点,尤其是堆和栈的区别、malloc/free的使用,还有内存泄露的概念,都得搞清楚。最近整理了一下C语言后面几部分的知识点,从联合体到内存管理,这块内容挺重要的,尤其是内存管理,面试经常问到。共用体方式利用的就是成员共用内存这个特点,给int赋值1,然后看char类型的b是不是1,就能判断出是小端还是大端。用typedef之后代码会简洁很多,特别是结构体、枚举这些类型,写起来方便,可读性也好。简单说就是申请的堆空间用完没释放,程序运行过程中一直占着,这就是内存泄露。
2026-08-07 21:22:43
452
原创 c语言学习笔记:const指针、void指针与结构体
因为int要存在4的倍数位置,short占了0-1,int就得从4开始,占4-7,char占8,整体再对齐到4的倍数,就是12。普通指针比如char*、int*,不仅保存地址,还有明确的指向,知道一次访问多少字节。这两种写法一样,const修饰的是*p,也就是p指向的内容不能改,但p本身的指向可以改。这部分内容里,const修饰指针的三种情况和结构体对齐是最容易出错的,得多写代码验证。p的指向不能改,*p的内容也不能改,定义时必须初始化。p指针本身是只读的,不能改指向,所以定义的时候必须初始化。
2026-08-06 19:54:44
625
原创 c语言学习笔记:指针进阶
定义:int (*pfun)(int, int);二维数组存的是字符串本身,而指针数组存的是字符串常量的地址。场景:主要用在想在被调函数中修改主调函数里的指针变量时,实参就需要传指针变量的地址,形参用二级指针接收。可以返回:静态变量地址、全局变量地址、字符串常量地址,或者是通过参数传进来的地址。// *pptr 就是主函数里的 ptr,通过二级指针修改它指向的地址。首先得搞清楚,指针数组本质上是数组,只不过数组里存的元素都是指针。这是最抽象的一个概念,它本质是指针,指向的是函数的入口地址。
2026-08-05 21:17:29
474
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅