C 进阶指针

【C语言】——指针进阶 两万字长文,总结C语言指针的知识点 阅读详情

目录

一、字符指针

储存字符串的指针

const修饰的字符指针在内存的储存

二、指针数组

 指针数组的定义

指针数组的简单运用

三、数组指针

数组指针的定义

数组指针的使用

四、数组参数、指针参数的传递

一维数组传参

 二维数组传参

指针传参

五、函数指针

函数指针的定义

函数指针的用法

函数指针数组

指向函数指针数组的指针

六、回调函数

回调函数的定义

一点鄙见


一、字符指针

储存字符串的指针

一般来讲,我们可以创建一个字符变量,并在其中,放一个字符,再用一个指针指向这个变量,这就是一个指向字符的指针。但是,指针里面还饿可以放字符串,如下:

当p里面放的是字符串时:此处赋给p的是首字符的地址(即a的地址)

此时里面放的字符串为常量字符串,相当于p的常量变大了(用 *p 修改字符串首位时会报错)(有的编译器会报警告)

因此可以用const修饰,更严谨(这样写的话,如果后面出现了改变*p的操作,编译器会直接提示错误)

在打印字符串时,提供首地址,程序就会开始打印,在遇到 \0 时停止打印

const修饰的字符指针在内存的储存

注意:这里比较的是地址。,而不是内容

p1==p2 说明p1和p2指向同意字符串(常量字符串放在内存的只读区内,不能被修改,为了节约资源,只会在内存里存一份,因此p1 p2 两个指针指向的是同一个位置)

而arr1 和arr2 是两个独立数组,需要各自独立的空间,即首元素地址不同

二、指针数组

 指针数组的定义

整形数组:存放整形的数组;字符数组:存放字符的数组;以此类推,指针数组就是存放指针的数组

指针数组的简单运用

由指针数组的定义可知,数组中储存的数据类型为指针,而c语言中,许多数据都可以是指针,比如数组名等,那么,通过对指针数组的运用,我们可以实现一些如类似二维数组的功能

int main()
{
	int arr1[] = { 1,2,3,4 };
	int arr2[] = { 3,4,5,6 };
	int arr3[] = { 6,7,8,9 };

	int* parr[] = { arr1,arr2,arr3 };
	//这里的数组名前面如果加上&会报警告
	int i = 0;
	for (; i < 3; i++)
	{
		int j = 0;
		for (; j < 4; j++)
		{
			printf("%d ", parr[i][j]);
			printf("%d ", *(parr[i] + j));
			//两种方法都可以成功输出
		}
	}
	return 0;
}

注意:通过指针数组实现二维数组的功能,本质不是二维数组(二维数组中的数据是在内存中连续存放的,这里的三个数组不一定)

三、数组指针

数组指针的定义

整形指针:指向整形的指针;字符指针:指向字符的指针;再一次以此类推,数组指针就是指向数组的指针。

int *p1[10];
//p1是指针数组,意为大小为10的数组内存的类型是int*

int (*p2)[10];
//p2是数组指针,即指向数组的指针,每个元素为int类型,大小为10
//注意:[] 的优先级高于*,因此要用()来保证p和*先结合

&数组名,得到数组地址,数组的地址需要一个变量来存,即数组指针就是用来存放数组地址的

即:arr 为 int ,&arr 为 类型* 地址名 [ ]

数组指针前面的int是数组类型,[] 中为数组大小(大小不能漏,否则会有警告)

(注意:数组指针不是二级指针)

数组指针的使用

当数组的大小未定义,而通过初始化自动分配时,数组指针也必须写清楚数组的大小

因为p是指向数组的,所以*p相当于数组名,即数组首元素地址

指针数组在一维数组的使用:

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

可以用,但是及其别扭(合法,但有病)

数组指针一般不用在一维数组,而是二维甚至三维数组

void print1(int arr[3][5], int x, int y)
//对二维数组的每一行进行打印
{
    int i = 0;
    for (; i < x; i++)
    {
        int j = 0;
        for (; j < y; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

void print2(int(*p)[5], int x, int y)
//此处p指向第一行,p+1指向第二行,即*p相当于拿到一整行
{
    int i = 0;
    for (; i < x; i++)
    {
        int j = 0;
        for (; j < y; j++)
        {
            printf("%d ", *(*(p + i) + j));
            //此处*(p + i)拿到第i + 1行的首元素地址,*(*(p + i) + j)拿到第i + 1行第j + 1个元素的地址
            printf("%d ", p[i][j]);
            //效果同上
        }
        printf("\n");
    }
}

int main()
{
    int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
    print1(arr, 3, 5);//直接传递数组
    print2(arr, 3, 5);//传递数组名,而二位数组的首元素是它的第一行
    //即arr表示第一行的地址
    return 0;
}

这种用法只能说是能用,但还是麻烦,因为直接传递数组时,传递的也是地址,此处并未体现使用指针的好处。

关于数组的几个区别

int arr1[10];//数组

int *arr2[10];//整形指针数组

int (*arr3)[10];//数组指针

int (*arr4[5])[10];//存放数组指针的数组
//*arr4[10]即名为arr4指针数组,[10]代表指针指向的数组里有5个元素

四、数组参数、指针参数的传递

一维数组传参

//1、数组传参
//假设调用test函数,参数为数组arr,大小为10
//接收格式:
void test(int arr[]);
void test(int arr[10]);
void test(int *arr);

//2、指针数组传参
//假设调用test函数,参数为数组arr,数组内容为int*,大小为10
//即 
int *arr[10] = {0}
//接收格式:
void test(int*arr[10]);
//以数组形式接收
void test(int **arr)
//arr2是指针数组,以二级指针的形式接收

 二维数组传参

//假设调用test函数,传递啊一个arr[3][5]的数组
//接收格式:
void test(arr[3][5]);
void test(arr[][5]);
//对于二维数组传参,只能省略第一个[],第二个不能省
//或者用指针数组的方式接收
//注意:二维数组的地址为第一行的地址,即一个一维数组整个数组的地址,
//不能放在一个一级指针或者二级指针里面,即不能用一级/二级指针接收
void test(int (*arr)[5]);
//此处int (*arr)[5]的arr为数组指针,对应一个每行5个元素的数组

指针传参

指针传参时,是什么指针,形参一般就用什么接收

当函数接收的参数为指针时,只要传过去的参数类型能匹配,就可以传递

形参为二级指针时,可以传递的参数:

**p、&p、指针数组、三级指针解引用

五、函数指针

函数指针的定义

函数指针:指向函数的指针

每个函数都有自己的地址

函数指针的储存格式:返回类型 (*指针名)(参数) = &函数名

以test为例: int (*pf)(int,int) = &test(&可以不写)

函数指针的用法

定义函数指针的时候的星号不能去掉, 否则就不是指针了

直接用指针调用函数(调用时,pf前面的星号可以不写,或者随便写几个(写星号一定要带括号),写一个为标准写法)

通过该方法,可以把一个函数传到另一个函数里进行调用(直接调用也可以,这种情况下调用属于多此一举)

 以下是一个利用函数指针实现的简单计算器

//用函数指针解决代码冗余(回调函数)
void menu()
{
    printf("1.add\n");
    printf("2.sub\n");
    printf("3.mul\n");
    printf("4.div\n");
    printf("0.exit\n");
}

int Add(int x, int y)
{
    return x + y;
}
int Sub(int x, int y)
{
    return x - y;
}
int Mul(int x, int y)
{
    return x * y;
}
int Div(int x, int y)
{
    return x / y;
}

//重新封装一个函数
void calc(int(*pf)(int, int))
//通过函数指针调用函数,能够去掉每个case中的冗余代码
//否则需要在每个case中添加用于输入数字和调用对应函数的代码
{
    int x = 0;
    int y = 0;
    int ret = 0;
    printf("enter two numbers:");
    scanf("%d %d", &x, &y);
    ret = pf(x, y);
    printf("%d\n", ret);
}

int main()
{
    int input = 0;
    int x = 0;
    int y = 0;
    do
    {
        menu();
        scanf("%d", &input);
        int ret = 0;
        switch (input)
        {
        case 1:
            calc(Add);//传的参为需要调用的函数对应的函数指针
            break;
        case 2:
            calc(Sub);
            break;
        case 3:
            calc(Mul);
            break;
        case 4:
            calc(Div);
            break;
        case 0:
        {
            printf("exit");
            break;
        }
        default:
            printf("error");
            break;
        }
    } while (input);
    return 0;
}

函数指针数组

 既然可以用一个指针指向函数,那么把函数指针放在指针数组中,就是函数指针数组、

一个合理的函数指针数组,可以简化代码,使代码的可读性和美观性更好

int(*arr[4])(int, int) = { Add,Sub,Mul,Div };
    //arr就是函数指针数组
    //只有参数相同、返回类型相同的函数才能放进同一数组

比如,我们可以用函数指针数组来改进上面这段计算器的代码

void menu()
{
    printf("1.add\n");
    printf("2.sub\n");
    printf("3.mul\n");
    printf("4.div\n");
    printf("0.exit\n");
}

int Add(int x, int y)
{
    return x + y;
}
int Sub(int x, int y)
{
    return x - y;
}
int Mul(int x, int y)
{
    return x * y;
}
int Div(int x, int y)
{
    return x / y;
}

int main()
{
    int input = 0;
    int x = 0;
    int y = 0;

    int (*parr[5])(int, int) = { 0,Add,Sub,Mul,Div };//前面加个0,使内容对应选项
    //又称转移表
    do
    {
        menu();
        scanf("%d", &input);
        int ret = 0;
        if (input == 0)
        {
            printf("exit");
        }
        else if (input >= 1 && input <= 4)
        {
            printf("enter two numbers:");//把输入两个数的选项放进每个case里面,会有很多冗余代码
            scanf("%d %d", &x, &y);
            ret = parr[input](x, y);//同input的值直接调用函数
            printf("%d\n", ret);
        }
        else
        {
            printf("error\n");
        }
    } while (input);
    return 0;
}//利用函数指针数组简化代码

指向函数指针数组的指针

六、回调函数

回调函数的定义

回调函数就是一个通过函数指针调用的函数。如果把一个函数的指针作为参数传递给另一个函数,当这个指针被调用时,其指向的函数就是回调函数。 

示例代码见:函数指针的用法

一点鄙见

        有一说一,作为一个小白,刚开始学指针的时候确实非常懵,。就是不太理解为什么要有这个东西,很多操作,比如调用函数、传递数组等,都是一行代码可以搞定的事情,为什么要多此一举去用指针,而且有时候很难理解代码写的是什么。后来学的东西多了,慢慢发现,好像指针还不错,很多地方可以用指针来简化代码,而且有些东西不用指针是没办法实现的,比如最基础的,在函数里面修改实参,很多人说指针是双刃剑,确实,指针用好了,写出来的代码可以非常优雅,指针用不好写出来的可能就是一个大bug,短短几行代码可以有一万个报错。怎么说呢,一个好的Coder可以被叫做代码诗人,写出来的代码可以像诗一样优美,那我觉得,用好指针应该是成为一名诗人的基础之一,希望我能早日掌握吧。

Linux下Linpack测试GPU和CPU性能 前面的文章已经介绍了如何搭建Linpack环境:https://blog.youkuaiyun.com/liu_feng_zi_/article/details/107429720 接下来说明如何使用 一、编写运行脚本: 新建文件:run_linpack.sh,内容如下: export HPL_DIR =/root/LHC/Linpack/hpl-2.0_FERMI_v15 export MKL_NUM_THREADS=6 export OMP_NUM_THREADS=6 export MKL_DYNAMI. 阅读详情

相关推荐

2023-07-04 Fast-Lio论文中公式(6)与BCH公式中近似雅可比公式的一致性推导

将(1)式代入(6)式,就有。

wmorries的博客 479

c语言指针进阶部分

我们在创建数组的时候,会给我们分配一块内存,同时这个数组有地址,地址就是首字符的地址,让我们去往里面去放东西,这一次我们放的是 hello world ,这个时候,我们又创建了一个数组,又会为我们分配一块内存,同时这个数组也有地址,让我们去往里面去放东西,这一次我们放的也是 hello world ,所以这两个数组里面的内容是一致的,但是地址不一样,我们比较的是数组名,数组名就是首元素的地址,就是比较地址。在这里我们打印的是函数的地址,我们可以看到加不加&取地址符号结果都是一样的,这是不是和数组差不多啊。

2402_84602321的博客 1869

IIS - 会话cookie中缺少HttpOnly属性

不啰嗦,我们直接开始! 先进行常规设置 打开配置编辑器 选中图中节点,将httpOnlyCookies设置为true 然后。。。不起作用。。。 换种方式 通过配置出站规则getcookie添加HttpOnly 在Web.config中添加如下出站规则 <rewrite> <outboundRules> <rule name="Add HttpOnly"> <match serverVa.

。 21万+

【C语言进阶】指针的进阶【上篇】

本文讲解了指针的进阶中的字符指针,数组指针,指针数组,数组传参和指针传参等一系列的知识,图文并茂,让你可以看懂并且理解

你我皆为凡人的博客 1545

L3 级自动驾驶 2025:法规突破与车企技术路线竞争

2025年L3级自动驾驶迎来规模化商业落地关键期。全球主要经济体在法规、技术、市场三方面取得突破:中国通过《北京市自动驾驶汽车条例》明确责任划分,欧盟设立严格技术认证标准。技术路线呈现"多传感器融合为主流,纯视觉为补充"格局,华为、特斯拉等企业展开硬件军备竞赛与算法架构革新。中国车企在技术验证和规模化应用方面领先,而欧美车企侧重生态整合。尽管面临成本控制、责任认定和用户信任等挑战,随着技术进步和车路协同发展,L3自动驾驶正从高端选配向大众化普及迈进,为L4级奠定基础。

2301_77933942的博客 3098

基于注意力机制的行人重识别(Reld)模型论文解读----Relation-Aware Global Attention for Person Re-identification

任务概述:在多摄像头的复杂场景中,快速定位查找指定目标的所有结果。

qq_52053775的博客 1895

【C进阶】指针的进阶

此篇博客干货满满,先是以很长的篇幅讲解了关于各类复合指针,后续主要介绍了回调函数中的qsort函数,可谓是十分巧妙,掌握指针的进阶,就对指针有很深的认识,家人们三连支持一下吧!!

m0_70088010的博客 1184

从零开始学 PyTorch 7天路线图(完整可运行代码版)

本文提供了5天PyTorch入门教程的完整代码,涵盖从基础到实战的核心内容。Day1测试环境并介绍张量基础;Day2讲解常用张量操作;Day3演示自动求导机制;Day4实现完整线性回归模型;Day5构建MNIST手写数字识别全连接网络。所有代码可直接运行,包含GPU检测、梯度计算、模型训练和可视化等关键环节,帮助新手快速掌握PyTorch核心概念和典型应用场景。

IT老农民的博客 314

C语言指针进阶训练

对C语言指针的进一步学习,通过常见的进阶练习,能够帮助学者更加深刻的学习指针的实际操作与用法。

Hello_shuo的博客 2213

嵌入式工程师成长之路(0)----认识元件

在电子设计与维修中,认识元件是成功的关键!面对琳琅满目的电阻、电容、电感与二极管,样子形式千奇百怪,你是否也曾陷入困难? 本文基于行业权威分类标准,结合十年工程师实战经验,深度解析4大类、30+子类电子元件的核心特性、应用场景与避坑指南,助你从“小白”秒变“电子高手”!

云轩阁 11万+

廉价却有效?ESD防护中的电容

摘要:在成本敏感型电子产品设计中,多层陶瓷电容(MLCC)可作为TVS二极管的替代方案用于静电放电(ESD)防护。其工作原理是通过电容充放电特性吸收静电能量,而非电压钳位。计算表明100nF/50V MLCC可有效缓冲8kV静电冲击,但存在吸收能量有限、无自恢复等局限。建议将MLCC作为一级缓冲措施,配合TVS等器件形成多级防护,并优先选择X7R材质、100nF容值、50V耐压的0402/0603封装MLCC。该方案在低速信号和电源引脚防护中具有显著成本优势,但不能完全替代专业ESD抑制器。

硬核科技 431

C语言——进阶指针理解

函数调用约定定义了函数在调用过程中参数传递、堆栈管理和返回值处理的规则。它确保了调用方(Caller)和被调用方(Callee)对函数调用的底层细节达成一致,避免因规则不匹配导致的程序崩溃或数据损坏。

Dfuen的博客 961

[毕设项目-MCP+ENSP]一句话搞定ENSP自动化:MCP + LLM实战(架构图、工具清单、踩坑全解)

用 MCP + LLM 把“人话”变成对华为 ENSP 的安全自动化操作,三款工具覆盖配置/查询/落盘,配套架构、实战与排坑清单。

逐梦苍穹的博客 2543

c语言进阶 指针

指针数组是一种特殊的数组,其核心特点在于每个数组元素都是一个指针变量,这些指针可以指向不同的数据类型。&arr的存储类型&arr(*p)表示 p 是指针(*p)[5]表示 p 指向包含 5 个元素的数组表示数组元素为 int// 正确:p是指向包含5个int的数组指针// 正确:p1指向首元素(类型int*)// 错误:类型不匹配(int* 与 int (*)[5])// 错误:必须指定数组大小int* p1[5];// 指针数组:包含5个int*的数组。

ztztz111的博客 1729

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深度学习工具包 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")

【C语言】指针进阶【万字详细版】

进阶的指针有指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针等等,让我们来探讨指针的高级主题。

小明的博客 2366

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

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

【C语言进阶】C语言指针进阶实战:优化与难题解析

在C语言的浩瀚宇宙中,指针无疑是那颗最为璀璨而神秘的星辰。它既是连接数据与操作的桥梁,也是让许多初学者望而生畏的迷宫。一旦掌握了指针的精髓,C语言的世界便仿佛被彻底点亮,编程的效率和灵活性得以质的飞跃。然而,仅仅停留在指针的基本使用上,远不足以探索其全部魅力与力量。指针的进阶应用,尤其是如何通过指针优化程序性能、解决复杂难题,是每一位C语言开发者必须攀登的高峰

EterNity_TiMe_的计算机学习之路 3190

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【C语言】指针进阶(1)

数组指针是指针?还是数组?答案是:指针。整形指针——指向整形变量的指针,存放整形变量地址的指针变量。字符指针——指向字符变量的指针,存放字符变量地址的指针变量。数组指针——指向数组的指针,存放的是数组的地址。下面代码哪个是数组指针?int (*p)[10]是数组指针。

m0_73648729的博客 980

C语言——指针从初阶到进阶

本文讨论了关于指针的相关问题,欢迎大家阅读指针

2501_90507065的博客 6155

C进阶 部分内存 指针数组 数组指针

#include <stdio.h> #include <stdlib.h> //内存 #if 0 int main(){ char a= - 128; char b = -127; char c = -126; printf("%d %d %d\n", a, b, c); printf("%u %u %u\n", a, b, c); system("paus...

qq_44783220的博客 142

C语言进阶之指针的进阶

指针的进阶及面试题讲解

立志做一个高产且细节博主 977

C语言进阶:指针进阶(字符指针、指针数组、数组指针)

C语言进阶,指针进阶,对于指针更加深入的了解

2501_91709575的博客 2955

【C语言】指针的进阶

]的优先级 高于 * ,所以 要加上()来保证p 先和 * 结合。

加油!!! 1097

C语言进阶:指针进阶(数组参数和指针参数、函数指针和函数指针数组)

C语言进阶,介绍数组参数和指针参数、函数指针和函数指针数组的内容

2501_91709575的博客 3250

8、C 语言指针进阶总结

本文总结了C语言指针进阶的核心知识点:1.指针语法结构由数据类型和指针名组成,可解析复杂指针类型;2.指针与多维数组的对应关系,需匹配维度与指针层级;3.特殊指针类型包括字符指针(字符串操作)、多级指针(指针数组)、void指针(类型转换)、const指针(常量限定)和函数指针(回调机制);4.使用注意事项涵盖指针偏移量计算、野指针防范和const关键字的语义差异。掌握这些知识对处理复杂数据结构和内存操作至关重要。

weizhigongzi的博客 1029

C语言进阶之路-数组与指针

本文细讲了打怪路上的数组和指针的特点和消灭方法,各位只需认真学习,即可消灭它们。祝各位都可爬上C语巅峰,斩尽拦路小妖。

志不在此,打卡留念 2374

C语言进阶第二篇【指针进阶】

字符指针的使用、指针数组和数组指针的理解、数组和指针的传参以及补充的练习例题

m0_61933976的博客 3645
上一篇: Py 循环语句
下一篇: Py 函数
flashier
博客等级 码龄3年 381粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值