C++学习笔记(一)——面向过程编程的C++之指针与数组

C++对象数组与对象指针的用法【C++初学面向对象编程】 在C++类与对象的学习当中,有一个用来装同一个类对象的数组即对象数组,有一个指向对象或对象成员的指针即对象指针,本文重点分析的就是对象指针和对象数组的各种用法及注意事项。类和对象是 C++ 的重要特性,它们使得 C++ 成为面向对象的编程语言。 阅读详情

一、指针的声明和使用

1. 基础

基本语法如下:

int value = 1;
int * pValue = &value;

pValue存储的是value所在的地址,用解引用符*可以来访问指针指向的地址中所存储的值。所以*pValue和value是完全等价的。


2. 指针与指针所指的内容辨析

double * tax_ptr;
char * str;

由于已将tax_ptr声明为一个指向double的指针,因此编译器知道*tax_ptr是一个double类型的值。也就是说,它知道*tax_ptr是一个以浮点格式存储的值,这个值(在大多数系统上)占据8个字节。指针变量不仅仅是指针,而且是指向特定类型的指针。
但虽然tax_ptr和str指向两种长度不同的数据类型,但这两个变量本身的长度通常是相同的。一般来说,地址需要2个还是4个字节,取决于计算机系统(有些系统可能需要更大的地址,系统可以针对不同的类型使用不同长度的地址)。

必须声明指针所指向的类型的原因之一:地址本身只指出了对象存储地址的开始,而没有指出其类型(使用的字节数)。通过指定指针的类型,程序知道*tax_ptr是8个字节的double值,str是1个字节的char值。程序用cout打印它们的值时,知道要读取多少字节以及如何解释它们。

3. 指针的危险

在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。
为数据提供空间是一个独立的步骤。

long * fellow;
*fellow = 223323;

一定要在对指针应用解引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。

4. 指针和数字

有时候我们可能需要一些特殊的操作,访问一个确定的地址中的值,比如调试过程中,要看看某个地址中的值:

int *pt;
pt = 0xB8000000;  // type mismatch

但是,指针不是整型,虽然计算机通常把地址当做整数来处理。在上面这两句代码中,pt是指向int的指针,因此可以把它赋给地址,但右边是一个整数。在C99标准发布之前,C语言允许这样的赋值。但C++在类型一致方面的要求更严格,编译器将显示一条错误消息,通告类型不匹配。要将数字值作为地址来使用,应通过强制类型转换将数字转为适当的地址类型:

int * pt;
pt = (int *) 0xB8000000; // types now match

5. 使用new来分配内存

指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在这种情况下,只能通过指针来访问内存。在C预言中,可以用库函数malloc()来分配内存;在C++中仍然可以这样做,但C++还有更好的方法——new运算符。

6. 使用delete来释放内存

使用new和delete时,应遵守以下规则。

  • 不要使用delete来释放不是new分配的内存。
  • 不要使用delete释放同一个内存块两次。
  • 如果使用new[]为数组分配内存,则应使用delete[]来释放。
  • 如果使用new为一个实体分配内存,则应使用delete(没有方括号)来释放。
  • 对空指针应用delete是安全的。

另外,一般来说,不要创建两个指向同一个内存块的指针,因为这将增加错误地删除同一个内存块两次的可能性。但稍后会看到,对于返回指针的函数,使用另一个指针确实有道理。

7. 使用new来创建动态数组

如果通过声明来创建数组,则在程序被编译时将它分配内存空间。在编译时给数组分配内存被称为静态联编(static binding),意味着数组是在编译时加入到程序中的。
但使用new时,如果在运行阶段需要数组,则创建它;如果不需要则不创建。还可以在程序运行时选择数组的长度。这被称为动态联编(dynamic binding),意味着数组是在程序运行时创建的。这种数组叫做动态数组(dynamic array)

二、指针与数组和指针算术

1. 指针和数组

指针和数组基本等价的原因在于指针算术(pointer arithmetic)和C++内部处理数组的方式。

首先,我们来看一看算术。将整数变量加1后,其值将增加1;但将指针变量加1后,增加的量等于它指向的类型的字节数。

  • 将指向double的指针加1后,如果系统对double使用8个字节存储,则数值将增加8;
  • 将指向short的指针加1后,如果系统对short使用2个字节存储,则指针值将增加2.

另外,C++将数组名解释为地址。

使用数组表示法时,C++都执行下面的转换:

arrayname[i] becomes *(arrayname + i)

如果使用指针表示法,C++也执行同样的变换:

pointername[i] becomes *(pointername + i)

因此,在很多情况下,可以相同的方式使用指针名和数组名。区别之一是,可以修改指针的值,而数组名是常量:

pointername = pointername + 1;   // valid
arrayname = arrayname + 1; // not allowed

另一个区别是,对数组应用sizeof运算符得到的是数组的长度,而对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组。

double wages[3] = {10000.0, 20000.0, 30000.0};
double *pw = wages;

上述代码中,pw和wages指的是同一个数组,但对它们应用sizeof运算符得到的结果如下:

24 = size of wages array << displaying sizeof wages
4 = size of pw pointer << displaying sizeof pw

这种情况下,C++不会将数组名解释为地址。

数组的地址

对数组取地址时,数组名也不会被解释为其地址。数组名被解释为其第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址。

short tell[10];		// tell an array of 20 bytes
cout << tell << endl;  // display &tell[0]
cout << &tell << endl;  // display address of whole array

从数字上说,这两个地址相同;但从概念上说,&tell[0](即tell)是一个2字节内存块的地址,而&tell是一个20字节内存块的地址。因此,表达式tell+1将地址值加2,而表达式&tell+1将地址加20.换句话说,tell是一个short指针(* short),而&tell是一个这样的指针,即指向包含10个元素的short数组(short(*)[10])

程序输入结果如下:


 tell     = 0x7ffc5ff53a80
&tell     = 0x7ffc5ff53a80
 tell + 1 = 0x7ffc5ff53a82
&tell + 1 = 0x7ffc5ff53a94 // 16进制表示 比&tell增加了14  即十进制的20

对于前面有关&tell的类型描述是如何来的呢?首先,我们可以这样声明和初始化这种指针:

short (*pas)[10] = &tell; // pas points to array of 20 shorts

首先,如果省略括号,优先级规则将使得pas先与[10]结合,导致pas是一个short指针数组,它包含10个元素,因此括号是必不可少的。
其次,如果要描述变量的类型,可将声明中的变量名删除。因此,pas的类型为short (*)[10]。
另外,由于pas被设置为&tell,因此*pas与tell等价,所以(*pas)[0]为tell数组的第一个元素。

总之,使用new来创建数组以及使用指针来访问不同的元素很简单。只要把指针当做数组名对待即可。然而,要理解为何可以这样做,将是一种挑战。要想真正了解数组和指针,应认真复习它们的相互关系。

注意区分 指针数组与数组指针 的区别

2. 指针和字符串

指针和数组的特殊关系可以扩展到C-风格字符串。请看下面代码:

char flower[10] = "rose";
cout << flower << "s are red\n";

数组名是第一个元素的地址,因此cout语句中的flower是包含字符r的char元素的地址。cout对象认为char的地址是字符串的地址,因此它打印该地址处的字符,然后继续打印后面的字符,直到遇到空字符(\0)为止。 总之,如果给cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符为止。

这里的关键不在于flower是数组名,而在于flower是一个char的地址。

为了与cout对字符串输出的处理保持一致,这个用括号引起来的字符串"s are red\n”也应当是一个地址。

这意味着,对于数组中的字符串、用引号括起的字符串常量以及指针所描述的字符串,处理方式是一样的,都将传递它们的地址。与逐个传递字符串中的所有字符相比,这样做的工作量确实要少。

在cout和多数C++表达式中,char数组名、char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。

三、 C++管理数据内存的方式

根据用于分配内存的方法,C++有3中管理数据内存的方式:自动存储、静态存储和动态存储(有时也叫做自由存储空间或堆)。(C++11新增了第四种类型——线程存储,将在内存模型章节进行讨论)。

  1. 自动存储
    在函数内部定义的常规变量使用自动存储空间,被称为自动变量。自动变量通常存储在栈中,程序执行过程中,栈将不断地增大和缩小。
    其实就是我们在函数中使用的局部变量使用自动存储。

  2. 静态存储
    静态存储是整个程序执行期间都存在的存储方式。
    使变量成为静态的方式有两种:一种是在函数外面定义它;另一种是在声明变量时使用关键字static:
    static double fee = 56.50;

自动存储和静态存储的关键在于:这些方法严格地限制了变量的寿命。变量可能存在于程序的整个声明周期(静态变量),也可能只是在特定函数被执行时存在(自动变量)。

  1. 动态存储
    new和delete运算符提供了一种比自动变量和静态变量更灵活的方法。它们管理了一个内存池,这在C++中被称为自由存储空间(free store)或堆(heap)。该内存池同用于静态变量和自动变量的内存是分开的。在一个函数中使用new分配内存,而在另一个函数中使用delete释放它。因此,数据的生命周期不完全受程序或函数的生存时间控制。与使用常规变量相比,使用new和delete让程序员对程序如何使用内存有更大的控制权。然而,内存管理也更复杂了。在栈中,自动添加和删除机制使得占用的内存总是连续的,但new和delete的相互影响可能导致占用的自由存储区不连续,这使得跟踪新分配内存的位置更困难。

栈、堆和内存泄漏
如果使用new在自由存储空间(或堆)上创建变量后,没有调用delete。那么随着包含指向该内存的指针的内存由于作用域规则和对象生命周期的原因而被释放,自由存储空间上动态分配的内存依然会持续存在,且无法被访问,这将导致内存泄漏。使用C++智能指针能够有效避免内存泄漏。

C++指针、数组与函数编程实践 本文通过多个C++编程实例,涵盖温度转换、指针与引用区别、动态内存分配、数组操作、字符串处理及函数设计等内容。重点讲解了指针数组、二维数组、动态数组创建与释放,以及函数参数传递和文件单词统计等核心编程技能,适合巩固基础并提升实际编码能力。 阅读详情

相关推荐

C++指针与数组编程实践

本文深入讲解了C++中指针与数组的多种应用场景,包括指针变量的声明与使用、通过指针操作数组元素、函数参数中使用数组与指针的三种声明方式、指针与内存地址的关系,以及多个实践编程示例,如数组复制、遍历、求和和最小值查找。同时,还介绍了如何通过指针优化复数类和日期类的显示方法。

w3x4y的博客 924

多个指针指向一块内存问题

理解c++中的深拷贝和浅拷贝

weixin_41440480的博客 825

多个指针指向同一内存区实践

在C++Primer中12章讲到内存的动态申请,delete能重复执行,尽量不要将两个指针指向同一块申请的内存。写了一段代码来看一下实际情况。

m0_52709408的博客 717

指针

指针 为对象起了另外一个名字(引用即别名) int int_value = 1024; int& refValue = int_value; // refValue指向int_value,是int_value的一个别名 int& refValue2; // 错误:引用必须初始化 注意: 引用并非对象,只是为一个已经存在的对象起了一个别名 引用只能绑定在对象上,不能与字面值或某个表达式的计算结果绑定在一起 int &ref_value = 10; // 错误

Z3300529971的博客 251

FreeModbus从入门到实战:手把手教你用STM32实现工业级Modbus RTU通信

本文详细介绍了如何使用STM32和FreeModbus实现工业级Modbus RTU通信,涵盖硬件搭建、协议栈移植及优化技巧。重点解析了FreeModbus的移植过程,包括串口驱动适配、定时器配置和工业级稳定性优化,为开发者提供了一套完整的工业通信解决方案。

weixin_33737774的博客 350

VSCode 远程开发:实现服务器图形化界面(GUI)的高效操作指南

本文详细介绍了如何通过VSCode远程开发实现服务器图形化界面(GUI)操作,包括X11转发原理、完整配置指南和实战测试。通过安装Xming、配置SSH连接和服务器端设置,开发者可以高效地在本地显示远程GUI应用,提升开发效率。

weixin_29245767的博客 293

c++ 指向同一地址的指针 和 指针的引用

一 指向同一地址的指针 pointer *p1; pointer *p2; p2=p1; ⭐ p2=p1是让p2和指向同一内存空间,但如果后续p1地址变了,p2的地址不会随之改变。是浅拷贝 总结:不要让两个指向同一地址的指针同时操作这个内存空间,会出错 例1 BstNode* p1=tree->GetRoot();//p1=null BstNode* p2 = p1;//p2和p1指向同一地址空间 null cout << p1->data;//地址为0153F308

EastFloatWater的博客 1659

DOSBOX 0.74模拟器安装Windows 95

DosBox本身带有5.0版的DOS系统,启动后虚拟一个Z盘存放有Dosbox特有的外部指令,如config.com、imgmount.com等,经测试,可以顺利安装各版本的windows 3.1系统,但是不能安装win95,需要用原版的dos镜像启动才能安装。1. 获取启动盘镜像文件 下载Win95启动软盘镜像文件,名为boot.img,放到DosBox 0.74的目录下。2. 制作硬盘镜像文件

xjnzhidao的博客 9311

不要将两个指针变量指向同一块动态内存

不要将两个指针变量指向同一块动态内存。这个容易引起很严重的问题。如果将两个指针变量指向同一块动态内存,而其中一个生命期结束释放了该动态内存,这个时候就会出现问题,另一个指针所指向的地址虽然被释放了但该指针并不等于NULL,这就是所谓的悬垂指针错误,这种错误很难被察觉,而且非常严重,因为这时该指针的值是随机的,可能指向一个系统内存而导致程序崩溃。但也就是因为值是随机的,所以运行程序时有时正常有时崩溃

逐日者 5733

深度学习12—VGG19实现

state_dict = load_state_dict_from_url(model_urls['vgg19'],model_dir='./model' ,progress=progress)#预训练模型地址。accuracy=((out.argmax(1)==label).sum()).clone().detach().cpu().numpy()#正确预测的总和比测试集的长度,即预测正确的精度。image=torch.reshape(image,(1,3,224,224))#四维图形,RGB三个通。

m0_55196097的博客 2444

sap 新增科目表_SAP系统中四大科目表的总结

操作科目表定义-OB13 2国家科目表定义-OB13 3集团科目表定义-OB13 4合并科目表(ECCS)定义-CX10 4分配操作科目表到公司代码-OB62 5分配国家科目表到公司代码-OB62 6分配集团科目表到操作科目表-OB13 6分配集团科目表到合并科目表-CXNF 7Operation 8定义集团科目表的科目-FSP0 8定义国家科目表的科目-FSP0 8定义操作科目表的科目-FSP0...

weixin_39585463的博客 1721

C/C++数组指针和指针数组

数组指针和指针数组的区别 指针数组:首先它是一个数组,每一个元素都是一个指针。 数组指针:首先它是一个指针,它指向一个数组。它是"指向数组的指针"的简称。 运算符的优先级关系:() &gt; [] &gt; *   数组指针(也称行指针)例如:int (*p)[n];根据优先级,先看( )内,p是一个指针,后面的[ ]又说明了p是一个指向数组的指针,由于前面的int,所以p是一个指向 i...

Tyler_Zx的博客 4204

q-learning精讲

Q-learning Q-learning是一种用于机器学习的强化学习技术。 Q-learning的目标是学习一种策略,告诉Agent在什么情况下要采取什么行动。 它不需要环境模型,可以处理随机转换和奖励的问题,而无需进行调整。 对于任何有限马尔可夫决策过程(FMDP),Q学习找到一种最优的策略,即从当前状态开始,它在任何和所有后续步骤中最大化总奖励的预期值。在给定无限探索时间和部分随机策略的情况...

weixin_41697507的博客 1万+

C++面试题-指针-指针数组与数组指针

C++面试题-指针-指针数组与数组指针 问:int (*p)[n]与int *p[n]的区别? 答: int (*p)[n]是数组指针,指向某n个元素所组成的整块的数组,返回值是整型指针类型的。 int *p[n]是指针数组,指向数组里面的每个元素,即p[0]指向第一个元素,p[1]指向第二个元素,以此类推,p[n-1]指向第n-1个元素,返回值是整型的。   问:下面代码的输出结果是什...

《好好先生》专栏 3754

STM32F103标准库开发:Keil5新建STM32工程

新建STM32工程 步骤一:创建工程模板文件 新建一个文件夹 template 在文件夹template里面新建五个文件 (1)CMSIS: 存放内核驱动程序和启动引导文件 (2)FWLIB:存放库函数文件 (3)Project:存放工程文件 (4)System:存放自己写的驱动程序 (5)User:存放用户程序(主函数) 步骤二:导入stm...

MQ0522的博客 2万+

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

算法大师! 671

C/C++中指针与数组、指针数组与数组指针

1.指针与数组 (1)指针与数组的联系 数组名和指针之间,经常会交替使用这两个变量, 可以把一个指针当成数组来使用,或者是把数组名赋值给指针,通过指针来访问数组成员变量, 代码示例 : #include &lt;iostream&gt; int main() { int array[] = {1,2,3,4,5}; int *p_array = array; int len...

波波鱼的博客 3579

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【C++】数组指针、指针数组与二级指针

数组指针、指针数组与二级指针数组指针与指针数组数组指针指针数组二级指针二级指针的特性指向指针数组的数组指针与二级指针测试代码 数组指针与指针数组 数组指针是指针,意为指向数组的指针; 指针数组是数组,意为数组内部存储着指针的数组。 数组指针 数组指针具有如下特性1: 数组指针用于指向一个数组; 数组名是数组首元素的起始地址,但不是数组的起始地址,通过取地址符&作用域数组名可以得到数组的起...

小黑先森的博客 1502

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++ 指针,数组与指针之间的关系以及指针运算

但是在使用过程中arr[0]和p[0]是一样的,而且这两个是可以通用的,为什么会出现这样的情况呢,那就是因为arr的地址是整个数组的地址,而不是首元素的地址,然而p是数组首元素的地址。正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。指针和数组是密切相关的。指针的释放(delete)只能释放用new声明的指针,不能释放将一个变量地址给指针的指针,*对于上面的例子,`*var` 的值是1,即数组 `var` 的第一个元素的值。

iml6yu的博客 1108

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++指针与数组

在C++编程中,指针和数组有着密切的联系,它们在很多方面相互关联且可以相互转换。理解指针与数组之间的关系对于高效地操作数组、实现算法以及管理内存等方面都非常重要。指针和数组在C++中关系紧密,掌握它们的关系可以帮助我们更灵活地操作数组,实现更高效的算法和数据结构。无论是使用指针访问数组元素、动态分配数组内存,还是在函数中传递数组指针,都需要注意指针的正确使用和内存管理。

𝓓𝓸𝓶𝓲𝓷𝓪𝓽𝓲𝓷𝓰 𝓐𝓵𝓵 𝓣𝓱𝓲𝓷𝓰𝓼 1337

C++笔记 指针与数组 指针数组与数组指针

指针:C语言中某种数据类型的数据存储的内存地址,例如:指向各种整型的指针或者指向某个结构体的指针。 数组:若干个相同C语言数据类型的元素在连续内存中储存的一种形态。 数组在编译时就已经被确定下来,而指针直到运行时才能被真正的确定到底指向何方。所以数组的这些身份(内存)一旦确定下来就不能轻易的改变了,它们(内存)会伴随数组一生; 而指针则有很多的选择,在其一生他可以选择不同的生活方式,比如一个字符指针可以指向单个字符同时也可代表多个字符等。 指针和数组在C语言中使用频率是很高的,在极个别情况下,数组和

weixin_40933653的博客 2431

C/C++学习笔记-指针数组、数组指针

指针数组、数组指针 这两者前两个字可以看成是形容词,后两个词可以看成是名词: 名称 举例 是什么 特点 指针数组 int *p[10] 数组 由指针构成,指针指向整型 数组指针 int(*p)[10] 指针 指向整型数组 例1: #include "stdafx.h" #include <iostream> using namespace std; int n[...

sinat_18518099的博客 4314

C++学习笔记之数组&指针

如果你使用new、malloc或其他类似的函数为数据结构分配了动态内存,但之后没有释放它,那么这块内存将永远不会被回收。这不仅会导致程序使用的内存量逐渐增加,而且如果程序长时间运行或频繁进行动态内存分配,可能会导致可用内存耗尽,从而引发严重的问题。为了避免这些问题,通常建议程序员使用智能指针(如C++11引入的。

weixin_44392103的博客 1515

C++中的指针、数组指针与指针数组、函数指针与指针函数

C++中的指针、数组指针与指针数组、函数指针与指针函数 本文从初学者的角度,深入浅出地详解什么是指针、如何使用指针、如何定义指针、如何定义数组指针和函数指针,并给出对应的实例演示;接着,区别了数组指针与指针数组、函数指针与指针函数;最后,对最常混淆的引用传递、值传递和指针传递做了区处。 C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力。指针可

成长Bar的博客专栏 3218

C++学习笔记之指针(基础)

并且,在进行关系比较前,需要。

韵律咖啡馆 1209

C++学习笔记(七:指针)

这篇C++学习笔记系统整理了指针相关的核心知识,主要包含以下内容:1. 内存构成详解(代码区、栈区、堆区等5大分区) 2. 指针核心概念:定义、运算符(&/*)、指针运算规则 3. 指针与数组/字符串的关联操作 4. 指针作为函数参数和返回值的应用 5. 高级指针类型:指针数组、指向指针的指针 6. 引用机制及其与指针的区别 7. 典型应用场景如数据交换、动态内存管理等 笔记通过大量代码示例(如指针遍历数组、选择排序实现等)配合内存布局图示,深入解析指针的底层原理和使用技巧,特别强调指针运算、多维数

ShangguanLuli的博客 827
上一篇: C++学习笔记(零)——C++重要知识梳理
下一篇: 计算机网络学习笔记(零)——总体知识梳理
Undergoer_TW
博客等级 码龄11年 185粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值