C语言了解指针(1):看透指针底层,不再死记硬背

C语言面试核心考点解析:指针、内存管理与底层原理实战指南 在计算机科学中,内存管理和指针操作是理解程序运行机制的核心基础。指针作为内存地址的抽象,直接关联到数据的存储、访问与生命周期管理,其原理涉及栈、堆等内存区域的分配与回收。掌握这些底层知识不仅能提升代码的健壮性和性能,更是深入理解操作系统、嵌入式系统、高性能中间件等领域的关键。在实际开发中,诸如动态内存分配、结构体内存对齐、多线程数据同步等场景都离不开对内存模型的清晰认知。本文围绕C语言面试中的高频考点,系统梳理了指针的多层语义、动态内存管理、关键字作用域以及预处理器等核心概念,并通过典型面试题剖析,帮助开发 阅读详情

前言:都说指针是C语言的灵魂,同时也是无数初学者的五指山。很多同学指针只会死记&和*,写代码全靠猜,遇到内存调试直接一头雾水。
指针的本质并不复杂,他是内存的门牌号,我们从内存的底层出发、把指针最基础的核心逻辑讲透,读懂本文,那你就踏入指针的门槛了。

一、内存、地址与指针到底是什么?

我们可以把计算机内存类比成一栋宿舍楼。
宿舍楼里有许许多多房间,如果不给房间编上门牌号,找人就只能一间一间挨个敲门,效率极低。给每个房间分配唯一门牌号之后,只要拿到门牌号,就可以瞬间定位到人。

计算机内存也是一模一样的逻辑:

  1. 内存会被切分成无数个内存单元,每个单元固定占 1 字节(8bit),这就是宿舍楼的一个个小房间。
  2. 每一个内存单元,都会分配唯一编号,这个编号就叫做内存地址,对应宿舍的门牌号。
  3. 在 C 语言的概念里:内存单元编号 = 地址 = 指针。

硬件层面:地址总线完成编址

CPU 想要读写内存数据,需要硬件总线完成通信,其中地址总线专门用来传递地址编号。

  • 32 位机器拥有 32 根地址总线,每根线代表 0 或者 1,总共可以产生2^32种地址编号,所以 32 位可以寻址 4GB 内存空间。
  • 64 位机器拥有 64 根地址总线,可以表示海量的内存地址。

小补充单位换算:
1 Byte = 8 bit
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB

重点:变量不是只有一个地址!
比如int a = 10;,int 占 4 字节,会占用连续 4 个内存单元,拥有 4 个地址。&a取到的是这 4 个字节里最小的那个首地址。CPU 拿到首地址,结合类型,就可以访问后续连续的若干字节。

二、指针变量:用来存放地址的变量

地址(指针)本身是一串十六进制数字,比如0x006FFD70,我们需要一个专门的变量把这个地址存起来,这个变量就是指针变量。

2.1 取地址符&

&叫做取地址操作符,作用:取出变量在内存当中的首地址。

#include <stdio.h>
int main()
{
    int a = 10;
    printf("%p\n", &a); // %p专门打印地址
    return 0;
}

运行输出一串十六进制地址,这就是变量a的首地址。

2.2 指针变量的定义

int a=10;
int * ps=&a;

拆解int * ps:

  • ps 是变量名字;
  • * 告诉编译器:ps 是一个指针变量;
  • 前面的int代表:ps 这个指针,指向的对象是 int 类型。

同理:

char c ="cylnk";
char * pz=&c;//char *存放char类型变量的地址

所以ps 这个变量内部存储的值就是 a 的首地址,通过 ps,就能找到变量 a 所在的内存空间。

2.3 解引用操作符*

`*``放在指针变量前面,叫做解引用:拿着指针里面存的地址,找到对应的内存空间。

#include <stdio.h>
int main()
{
    int y = 100;
    int* ps = &y;
    *ps = 0; // 通过ps中存储的地址,找到y,把y赋值为0
    return 0;
}

这里*pa等价于变量 a。修改*pa,本质就是修改内存中 a 的值。
很多同学疑惑:直接写a=0不行吗,为什么要用指针?
指针提供了第二条修改内存数据的通路。后续写函数传参、操作数组、动态内存的时候,这个特性会发挥巨大作用。

⚠️注意区分两个 *:

  1. 定义的时候的*:仅仅标记这是指针变量;
  2. 使用时的*pa:代表解引用操作,访问指针指向的内存。

2.4 指针变量占多大内存?

指针变量存储的是地址,地址的位数由平台决定,和指针是什么类型无关。

  • 32 位平台:地址是 32bit,所有指针大小都是 4 字节
  • 64 位平台:地址是 64bit,所有指针大小都是 8 字节

示例:

#include <stdio.h>
int main()
{
    printf("%zd\n", sizeof(char *));
    printf("%zd\n", sizeof(short *));
    printf("%zd\n", sizeof(int *));
    printf("%zd\n", sizeof(double *));
    return 0;
}

不管是char*还是int*,同一个平台下大小完全一样。
思考:既然大小全部一样,那为什么还需要区分char*、int*不同指针类型?答案在下一节揭晓。嘻嘻

三、指针类型到底有什么意义?

误区:既然指针变量大小全部一样,那类型就没用?大错特错!
指针的类型决定两件核心事情:**解引用时访问多少字节;指针 ± 整数的时候,向后跳多少字节(步长)**±这个符号的输入方式是win+句号就和触发一个神秘的输入方式哦。

3.1 指针类型决定解引用权限(一次操作几个字节)
代码:

int n = 0x11223344;
int *pi = &n;
*pi = 0;

int*解引用权限 4 字节,执行后 n 的全部 4 个字节都会置 0。

代码:强制转换成char *

int n = 0x11223344;
char *pc = (char *)&n;
*pc = 0;

char*解引用权限只有 1 字节,只会修改 n 的第一个字节,剩下 3 字节保持原样。

总结:
char*:解引用只访问 1 字节;
short*:解引用访问 2 字节;
int*:解引用访问 4 字节。

3.2 指针类型决定指针± 整数的步长

指针加 1,不是内存地址简单 + 1 字节,而是向后跳「指向类型的大小」个字节。

#include <stdio.h>
int main()
{
    int n = 10;
    char *pc = (char*)&n;
    int *pi = &n;
    printf("%p\n", pc);
    printf("%p\n", pc+1); // char+1:地址+1字节
    printf("%p\n", pi);
    printf("%p\n", pi+1); // int+1:地址+4字节
    return 0;
}
  • char* + 1:向后移动 1 个字节
  • int* +1:向后移动 4 个字节
  • double* +1:向后移动 8 个字节

核心结论:指针+N,实际地址变化 = 原始地址 + N × sizeof (指向的类型)。

3.3 特殊的void*泛指指针

void*是无具体类型的指针,又叫泛型指针。
优点:可以接收任意类型变量的地址,不会报类型不匹配警告。
限制:不能直接解引用,也不能直接 ± 整数运算,编译器不知道它指向的对象占几个字节。

#include <stdio.h>
int main()
{
    int a = 10;
    void* pa = &a;
    // *pa = 20;  // 编译报错,非法间接寻址
    // pa + 1;    // 编译报错,无法计算步长
    return 0;
}

void * 一般用作函数形参,实现类似 “泛型” 效果,一个函数接收多种不同类型数据地址。想要读写,需要强制转换成对应类型指针。

四、指针的三种运算

指针不是什么运算都支持,C 语言指针合法运算只有三类:指针 ± 整数、指针 - 指针、指针关系比较。大部分运算(指针 + 指针,指针 * 指针)都是非法的。

4.1 指针± 整数

配合数组使用最多。数组内存连续存放,首元素地址 + 下标,就能访问数组每一个元素。

#include <stdio.h>
int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int *p = &arr[0];
    int sz = sizeof(arr)/sizeof(arr[0]);
    for(int i=0; i<sz; i++)
    {
        printf("%d ", *(p+i));
    }
    return 0;
}

*(p+i)等价于arr[i],数组下标本质就是指针运算的语法糖。

4.2 指针 - 指针

前提:两个指针必须指向同一块连续内存(同一个数组)。
指针相减,得到的不是地址直接相减的字节数,而是两个指针中间相隔元素的个数。

经典手搓字符串长度my_strlen:

#include <stdio.h>
int my_strlen(char *s)
{
    char *p = s;
    while(*p != '\0')
    {
        p++;
    }
    return p - s; // 两个char*指针相减,得到字符数量
}
int main()
{
    printf("%d\n", my_strlen("abc"));
    return 0;
}

4.3 指针的关系运算(大小比较)

同样要求指针指向同一块连续内存,可以用> < >= <=比较地址先后。

#include <stdio.h>
int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int *p = &arr[0];
    while(p < arr + 10)
    {
        printf("%d ", *p);
        p++;
    }
    return 0;
}

arr+10指向数组末尾的后一位,C 语言允许指针指向数组末尾的下一个位置,只做比较,禁止解引用访问。

五、核心知识点复盘

  1. 指针 = 内存单元的地址;指针变量是专门存放地址的变量。
  2. &取地址;*解引用,通过地址找到内存空间。
  3. 指针变量大小只看操作系统平台,和指针类型无关;32 位 4 字节,64 位 8 字节。
  4. 指针类型两大意义:
  • 解引用时,决定一次可以访问几个字节;
  • 指针 ± 整数,决定步长,+1 跳过一个指向元素的大小。
  1. void*万能接收地址,但是不能直接解引用和加减。
  2. 指针三种合法运算:指针 ± 整数、指针 - 指针、指针关系比较。指针相减、比较,仅限同一块连续内存。

注意:

  1. 不要混淆指针变量本身的地址&ps,和指针存储的地址ps;
  2. 不要对不相关的两个指针做相减、大小比较,行为未定义;
  3. void * 使用前,必须强制转换为对应类型,再做解引用;
  4. 指针 + 1 不是 + 1 字节,是加上指向类型的 sizeof 大小
C语言学习指南:从零基础到掌握计算机底层原理 C语言作为一门系统级编程语言,其核心价值在于帮助开发者理解计算机底层工作原理。通过指针、内存管理等核心概念,程序员能够直接操作硬件资源,建立扎实的计算机世界观。这种底层理解是学习操作系统、编译原理等高级课程的基础,也是掌握性能优化、嵌入式开发等关键技术的前提。在Python、Java等高级语言流行的今天,学习C语言能够打通其他语言的底层实现逻辑,为深入理解计算机系统提供坚实基础。本文结合198集动画教程的思路,探讨如何通过直观、场景化的方式降低C语言学习门槛,并提供了从环境搭建、核心概念到实战项目的完整学习 阅读详情

相关推荐

zabbix6.0.4拓扑图链路显示流量

1. 背景介绍 网络流量监控是网络管理员必备功课,以前研究cacti的weathermap插件,网络流量大小和拥塞情况一清二楚,随着cacti的没落,weathermap插件也不能再继续使用,此时就需要学习了解新的替代方案。 经过研究和实际测试,发现zabbix的拓扑图有这个功能。 以下验证了zabbix的拓扑图显示线路流量的功能。 2. Zabbix 6显示拓扑图流量过程 选择监测-拓扑图 点进Local ne...

u013930899的博客 8481

C语言底层操作:从内存对齐到指针运算,掌握系统编程核心

在系统软件、嵌入式和高性能计算领域,理解计算机底层运作机制是开发者必备的核心能力。从内存模型、指针运算到编译链接过程,这些基础概念构成了程序与硬件交互的桥梁。掌握内存对齐原则能优化数据访问速度,理解指针本质可避免野指针和内存越界问题,而熟悉字节序和系统调用则确保了跨平台数据处理的正确性。这些底层知识不仅是写出高性能、高可靠代码的基石,更是面试中考察候选人技术深度的关键。通过剖析memcpy与memmove的区别、结构体内存布局等实际案例,开发者能建立起从现象到本质的分析框架,从而在工程实践中有效应对栈溢出、

weixin_29597551的博客 333

数学建模传染病模型_【数学建模】之传染病模型

点击【拇指笔记】,关注我的公众号。SE模型缺点:没有考虑接触到的人中还有一部分病人,所以所有人并不会全部被感染。建立模型:已感染人数(病人)每个病人每天有效接触(足以使人致病)人数为根据(1)(2)可以建立模型:等式两边同时除以\Delta t由导数定义有同时,取\Delta t = 1天由(1)(5)两式可得最终的模型:Logistic模型缺点:区分已感染者(病人)和未感染者(健康人)...

weixin_39590453的博客 2227

C语言 ---- 指针函数与函数指针

概述 指针函数和函数指针是C语言里两个比较绕的概念。但是不仅面试题爱考,实际应用中也比较广泛。很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针、函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。 其实如果理解了这些概念的本质,是不需要死记硬背的,理解起来也比较容易。 指针函数 指针函数: 顾名思义,它的本质是一个函数,不过它的返回值是一个指针。其声明的形式如下所示: ret *func(args, ...); 其中,func

qq_41877840的博客 4810

AI漫剧制作全流程零基础实操指南:从剧本到剪辑

AI漫剧是一种利用AI工具将剧本、分镜、出图、配音、剪辑整合为流水线的短视频内容形式。其技术原理基于文生图、图生图与文本转语音模型的组合,核心挑战在于角色一致性控制与分镜批量出图。这项技术大幅降低了视频制作门槛,使个人创作者无需演员和设备即可产出剧情向短内容,广泛应用于短视频平台的情景剧、玄幻、甜宠等题材。本文给出了一套零基础可照做的全流程实操方案,覆盖剧本提示词、分镜表、出图选型、配音合成与剪辑模板,帮助你快速跑通AI漫剧制作链路。

weixin_29048309的博客 525

芯片低功耗设计的两种常用EDA流程

如题。

EricWZY2008的专栏 5557

计算机发展史与C语言:重新理解C语言的底层设计

当今,高级语言通常是以“非常抽象”的形态展现在我们眼前,而计算机设备也已经高度集成化,专门化,标准化。正因为如此,如果对计算机硬件的基本运行方式缺乏直觉,那么 C 语言中的许多设计都会显得反直觉,甚至令人痛苦。同时,我也会穿插介绍一些行业发展史上的重点时刻,相信你会被前人的聪明才智所折服,同时他们的方法论对我们的学习工作也大有裨益。历史演进的角度也会让我们系统的理解,为什么C语言会出现,为什么它能经久不衰。通过对计算硬件形态的发展历程,再结合C语言的发展,我们就会对一些难以理解的概念恍然大悟,

haokingyang的博客 1042

《网络摄像机实战11:flutter_webrtc支持 AWS Kinesis Video Streams信令服务器》

本文介绍了如何在Flutter项目中集成WebRTC实现网络摄像头的实时视频和音频对讲功能。通过使用flutter_webrtc插件,开发者可以快速构建跨平台的视频通信应用。文章详细说明了集成步骤:1)安装flutter_webrtc插件;2)配置信令服务器和KVS服务;3)初始化本地/远程视频渲染器;4)建立WebRTC连接并进行设备呼叫。最后展示了实际应用效果图,证明该方案能有效实现移动端与摄像头的实时音视频交互。该方案为开发智能家居监控等应用提供了技术参考。

lvj_158的专栏 356

初始C语言指针2(C语言指针的定义)

初始C语言指针(C语言指针的定义) 附1: 经过了第一部分C语言指针由来的介绍,相信大家对指针的认识已经有了初步地了解了,那么接下来我就为大家简单讲解下指针的定义,后续依旧会逐步更新指针这块知识点的讲解,我会逐级递进,由浅入深,让xdm逐步拿捏指针,从最开始遇到指针如同耗子见到猫马上跑,到后面指针在你面前也就只是个弟弟而已。 用代码先来为大家演示先,指针的定义(固定格式) 代码演示: 演示代码讲解: 1、首先大家需要先清楚地知道,int maintain = 6;这句语句的意思,是程序员向内存申请了4..

weixin_53811859的博客 936

保边滤波之Mean shift filter

保边滤波之Mean shift filter 目录 保边滤波之Mean shift filter 一、算法原理 二、练手实现的算法代码如下: 三、实现结果 一、算法原理 在OpenCV中,meanshift filter函数为 p...

大熊 1561

告别标注地狱!YOLO+CLIP多模态零样本检测全实战:图文联合推理,想检测什么直接输文字,不用训模型

这套方案我给朋友的超市用了快3个月,运行极其稳定,临期商品的检测准确率能到96%,后续加了“货架空货检测”“通道杂物堆积检测”,都是改一行文本就搞定,完全不用重新开发,朋友说省了十几万的定制开发费用。很多做计算机视觉的朋友,总觉得目标检测必须标数据、训模型,其实不是的。现在多模态大模型的能力已经足够强,把YOLO的定位能力和CLIP的图文泛化能力结合起来,就能用极低的成本,搞定绝大多数定制化检测需求。对于我们开发者来说,技术的价值从来不是炫技,而是用最简单的方案,解决最实际的问题。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 516

为什么说指针是c语言的灵魂?

我攻克这个难关,花了好几年时间,因为它不像单片机的问题,网上都有答案,也有例程参考,这种问题,是开发经验的问题,网上找不到资料,有也只是零零散散的。工作6,7年以后,独立做了一些复杂的项目,有物联网网关,有Ble产品,研究过协议栈和模块厂的SDK,也见过很多同事写的代码,对指针又有了新的理解。刚做开发的前两三年,我总是感觉自己写的程序,不够专业高大上,很多程序都过度使用指针,看起来更复杂显得专业点,现在回看那程序:真傻杯,脱裤子放屁。你可以简单理解成,就像人没有灵魂,废了,c语言没有指针,也废了。

无际单片机编程 1179

【OpenClaw企业级智能体实战】第10篇:医疗行业OpenClaw实战:病历自动书写、医保智能审核与患者随访管理(附HIPAA合规配置+完整代码)

医疗行业正面临“效率提升需求”与“合规监管红线”的双重矛盾:病历书写占据医生30%-50%工作时间,医保审核效率低下,患者随访工作量巨大,但医疗数据“不出域”“责任不转移”的要求又限制了AI落地。本文基于华为云、腾讯云安全规范及中关村科金、复旦大学附属中山医院等真实实践,拆解OpenClaw在医疗场景的五大核心应用(病历自动书写、医保智能审核、患者随访管理、科研文献综述、医学影像预处理),提供私有化部署架构、HIPAA合规配置模板、完整实操流程及可直接运行的代码。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 439

C语言从入门到入门之指针(1)

在学习指针之前,哥们要带大家理解两个概念,这两个概念就是和。

2503_92822828的博客 442

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言的指针(1)

你好,欢迎来到C语言的“心脏地带”。在开始之前,请先回答我一个问题:你学C语言时,最想砸电脑的瞬间是什么?我猜,十有八九是遇到指针的那一刻。Segmentation fault(段错误)像一堵南墙,printf调试到怀疑人生。网上说“指针就是地址”,你背下来了,可一写代码就原形毕露——“我知道它是什么,但我不知道怎么用。这个系列,就是为了解决这个问题而生的。为什么你总觉得指针难?因为很多教程把“语法”教成了“数学公式”,却忘了告诉你指针的本质是“如何高效地搬动内存里的数据”。

2601_96601560的博客 547

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C 语言】指针学习笔记:从底层原理到实战应用

本文系统讲解了C语言指针的核心概念与应用。首先阐述了指针的本质是存储内存地址的变量,通过可视化示例展示了指针与变量的关系。然后详细介绍了指针的基础用法,包括定义初始化、与数组的关联以及作为函数参数的传址调用。文章还总结了指针使用中的常见问题(野指针、悬空指针、越界访问)及解决方案,并列举了指针在动态内存管理、数据结构实现等场景中的进阶应用。最后给出了学习指针的建议:多画图理解内存关系、通过调试工具观察指针行为、记录常见错误避免重复踩坑。全文旨在帮助读者深入理解指针原理,掌握其正确使用方法。

qq_74952358的博客 531

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

别再死记硬背了!用‘酒店房间’和‘房卡’的比喻,5分钟搞懂C语言指针到底是个啥

本文通过‘酒店房间’和‘房卡’的生动比喻,帮助初学者快速理解C语言指针的核心概念。从内存地址到指针操作,再到多级指针和指针运算,用生活化的场景解释编程中的复杂概念,让学习指针变得简单有趣。

weixin_29009881的博客 191

C语言指针学习路径

摘要:本文系统介绍了C语言指针的学习路径,从基础概念到高级应用共7个阶段。首先讲解指针定义、取址解引用操作;随后覆盖指针与基本类型、数组、函数的结合;重点说明动态内存管理要点;最后解析指针数组、多级指针等高级主题及常见陷阱。文章提供了各阶段的典型代码示例,并推荐了《C Primer Plus》等学习资源和LeetCode等练习平台,强调通过手写调试和小项目实践来巩固理解,避免死记硬背。全文约150字,概括了指针学习的核心内容和实践方法。

qq_32576083的博客 1152

c语言声明指针变量的方法,C语言指针变量的声明

原标题:C语言指针变量的声明在 C 语言中,变量的地址往往都是编译系统自动分配的,对我们用户来说,我们是不知道某个变量的具体地址的。所以我们定义一个p,把普通变量 a 的地址直接送给指针变量 p 就是 p = &a;这样的写法。对于指针变量 p 的定义和初始化,一般有两种方式,这两种方式,初学者很容易混淆,因此这个地方没别的方法,就是死记硬背,记住即可。方法 1:定义时直接进行初始化赋值。...

weixin_39842682的博客 584

计算机专业为何必须学C语言?从指针到内存模型的底层认知突破

编程入门常从C语言开始,因其直接操作内存和指针,帮助建立程序运行在真实硬件上的认知。理解内存模型和指针原理,能打通数据结构、操作系统等后续课程,提升调试与性能优化能力。在嵌入式、系统编程和高性能计算中,C语言仍不可替代。掌握命令行编译和gdb、valgrind等工具,通过最小项目实践,可跨越语法记忆阶段,真正学懂C语言,为技术生涯奠定坚实基础。

weixin_31292729的博客 152

告别死记硬背:用动手实验搞定嵌入式笔试里的C语言内存与指针难题

本文提供了一套通过动手实验掌握嵌入式笔试中C语言内存与指针难题的实战指南。从搭建实验环境到分析内存布局、指针运算、结构体对齐等核心概念,结合GCC、GDB等工具进行可视化实践,帮助开发者深入理解嵌入式系统中的内存管理机制,有效应对笔试和面试挑战。

weixin_33671935的博客 158

12.2 C语言指针变量的声明

在 C 语言中,变量的地址往往都是编译系统自动分配的,对我们用户来说,我们是不知道某个变量的具体地址的。所以我们定义一个指针变量 p,把普通变量 a 的地址直接送给指针变量 p 就是 p = &amp;a;这样的写法。 对于指针变量 p 的定义和初始化,一般有两种方式,这两种方式,初学者很容易混淆,因此这个地方没别的方法,就是死记硬背,记住即可。 方法 1:定义时直接进行初始化赋值。 unsign...

weixin_44488826的博客 237

计算机二级C语言备考:从死记硬背到编程思维的系统训练

C语言作为编程语言的基础,其核心价值在于培养程序逻辑思维和问题解决能力。理解数据类型、流程控制、函数调用等基础概念是掌握编程原理的关键,这些能力在软件开发、算法设计和系统编程等应用场景中具有广泛价值。通过系统学习C语言的语法规则和调试技巧,考生可以避免单纯刷题的误区,建立从问题分析到代码实现的完整思维框架。本文结合二级考试高频考点和常见错误排查,帮助学习者将应试准备转化为实用的编程能力训练,实现从记忆到理解的转变。

weixin_34210740的博客 316

C语言指针与二级指针:从本质到实战的使用时机

内存地址是计算机访问数据的根基,C语言通过指针实现了对地址的直接操控,从而支持数据共享、动态内存分配与高效的系统级编程。指针的本质是间接访问,它化解了直接访问的局限,让程序能灵活管理复杂数据结构与性能敏感场景。在实际工程中,指针广泛应用于函数参数、链表与动态数组等场景;当需要修改指针自身的指向或构建动态二维数组时,二级指针便成为关键。同时,指针数组、数组指针、void*以及智能指针等概念的辨析,也直接关系着代码的安全性与可维护性。本文结合常见工程实践,梳理从指针到二级指针的判断标准与适用边界,并分享内存错误

weixin_34043301的博客 375

c语言指针链表编程题,C语言的指针、链表的原理和操作

心得:堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用c语言这个工具解决实际问题,又必须掌握它。通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致。学习c语...

weixin_30491017的博客 360

别再死记硬背了!通过‘渣男’、‘暖男’指针理解C语言const的四种用法

本文通过‘渣男’、‘直男’、‘暖男’等生活化比喻,生动解析C语言const指针的四种用法:const int *p(渣男型)、int *const p(直男型)、const int *const p(暖男型)及其变体。文章详细阐述了每种类型的特性、适用场景及常见错误,帮助开发者轻松掌握const指针的核心概念,提升代码安全性和可读性。

weixin_30851867的博客 609
上一篇: C语言操作符全方面讲解:二进制、位运算、表达式求值等
下一篇: C语言深入了解指针(2):const 修饰指针、野指针、assert 断言、传址调用
cylnk
博客等级 码龄2年 68粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值