【C++温故知新】(二)指针

本文深入解析C++指针的概念,包括指针的声明、动态内存管理、与数组及字符串的交互,以及指针算术操作。同时,探讨了指针在结构体中的应用,并对比了自动存储、静态存储与动态存储的不同。

指针

指针是一个变量,存储的是值的地址

&Value => Address/Pointer
*Pointer/Address => Value

例如:

int myInt = 10;     //Value
int *myPoint = &myInt;     //Pointer

上边的写法是将 myInt 的地址赋给了指针 myPoint ,前边的 * 可以和 int 一同理解为一个整体,表示一个整型的指针。

指针的声明

int *myPoint;
int * myPoint;
int* myPoint;

动态分配内存

  • 使用new来分配内存
typeName * pointer_name = new typeName;
  • 使用delete释放内存
delete pointer_name;

总结:使用 * 声明指针,指向某值的地址,使用 &Value 获得值的地址,使用 new 会动态分配空间,使用 delete 释放动态分配的空间

指针与数组

使用new创建动态数组

动态数组表示在运行过程中创建。如果不使用 new 来声明数组,那么数组会在编译的时候就被分配相应的内存,不论是否有值都会占据相应的存储空间,成为静态联编(static binding),类似于使用值存储;使用 new 来声明数组,数组会在程序运行时创建,成为动态联编(dynamic binding),类似于使用链表存储。

动态数组的创建与释放

typeName * pointer_name = new typeName [num_elements];
delete [] pointer_name;

动态数组的使用

pointer_name 为指向数组第一个值的指针,调用数组第n个元素可以:

  • pointer_name[n];
  • pointer_name+n; pointer_name[0];

数组名与指针

数组名即为指向该数组第一个元素的指针,即存在:

arrayName = &arrayName[0]

所以以下两个情况等价:

int myInt[3] = {0,1,2};
int* myPoint=myInt;  <==>  int* myPoint = &myInt[0]
myPoint[0]  <==>  *myPoint
myPoint[2]  <==>  *(myPoint+2)

但是只有指针才可以有运算,数组名不可以有运算,例如在上边的代码中,myPoint+1 是合法的,但是 myInt+1 是不合法的

指针算术

将指针加一,等于将指针增加的量指向其类型的字节数。比如一个指向double类型的指针加一,其数值其实增加8,以指到下一个地址去。

还可以将一个指针减去另一个指针,获得两个指针的差。这种运算将得到一个整数,仅当两个指针指向同一个数组(也可以指向超出结尾的一个位置)时,这种运算才有意义;这将得到两个元素的间隔。

指针和字符串

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

由于数组名是数组中第一个元素的指针,所以在字符串数组中,如果直接打印数组名,将会一直打印所有的内容,直到出现\0才结束,如:

char myChar[10] = "hello";
cout << myChar;

上述代码将打印 hello

char myChar[10] = "hello";
char* myPointer = myChar;
cout << myPointer;

上述代码将打印 hello

char myChar[10] = "hell\0o";
cout << myChar;

上述代码将只打印 hell

指针与结构

使用 new 可以创建动态结构,使用指针调用动态结构中的某一项需要使用 ->,(使用结构名来调用某一项使用的是 .

struct myStruct
{
    int myInt;
    double myDouble;
};

myStruct * myPointer = new myStruct;
myPointer->myInt = 10;
myPointer->myDouble = 10.2;

存储方式

根据用于分配内存的方法,C++管理数据内存的方式可以分为 自动存储、静态存储和动态存储(有时也叫作自由存储空间或堆)。(C++11新增了线程存储)

  • 自动存储:
    在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),它们在所属的函数被调用时自动产生,在该函数结束时消亡。自动变量是一个局部变量,其作用域为包含它的代码块。代码块是被包含在花括号中的一段代码。自动变量通常存储在栈中,即执行代码块时,其中的变量将依次加入到栈中,而在离开代码块时,将按相反的顺序释放这些变量。
  • 静态存储:
    静态存储是整个程序执行期间都存在的存储方式。使变量成为静态的方式有两种:一种是在函数外面定义它;另一种是在声明变量时使用关键字 static 定义。
  • 动态存储:
    使用 new 和 delete 运算符可以提供一种比自动变量和静态变量更灵活的方法。它们管理了一个内存池,这在C++中被称为自由存储空间(free store)或堆(heap)。该内存池同用于静态变量和自动变量的内存是分开的。因此,数据的生命周期不完全受程序或函数的生存时间控制。

转载请注明出处,本文永久更新链接:https://blogs.littlegenius.xin/2019/08/05/【C-温故知新】二指针/

(Kriging_NSGA2)克里金模型结合多目标遗传算法求最优因变量及对应的最佳自变量组合研究(Matlab代码实现)内容概要:本文介绍了克里金模型(Kriging)与多目标遗传算法NSGA-II相结合的方法,用于求解最优因变量及其对应的最佳自变量组合,并提供了完整的Matlab代码实现。该方法首先利用克里金模型构建高精度的代理模型,逼近复杂的非线性系统响应,减少计算成本;随后结合NSGA-II算法进行多目标优化,搜索帕累托前沿解集,从而获得多个最优折衷方案。文中详细阐述了代理模型构建、算法集成流程及参数设置,适用于工程设计、参数反演等复杂优化问题。此外,文档还展示了该方法在SCI一区论文中的复现应用,体现了其科学性与实用性。; 适合人群:具备一定Matlab编程基础,熟悉优化算法和数值建模的研究生、科研人员及工程技术人员,尤其适合从事仿真优化、实验设计、代理模型研究的相关领域工作者。; 使用场景及目标:①解决高计算成本的多目标优化问题,通过代理模型降低仿真次数;②在无法解析求导或函数高度非线性的情况下寻找最优变量组合;③复现SCI高水平论文中的优化方法,提升科研可信度与效率;④应用于工程设计、能源系统调度、智能制造等需参数优化的实际场景。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现过程,重点关注克里金模型的构建步骤与NSGA-II的集成方式,建议自行调整测试函数或实际案例验证算法性能,并配合YALMIP等工具包扩展优化求解能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值