深入了解指针(1)

本文详细介绍了C语言中指针的概念,包括指针作为内存地址的访问工具,指针变量的定义、类型和大小,以及const修饰符的应用。同时探讨了void*指针、野指针的产生原因和处理,以及传值调用与传址调用的区别。

内存与地址

学习指针,我们首先要了解指针,指针是用来访问内存的。举个例子,就像过节走亲访友,首先我们要知道地址,才可以去拜访。那么指针的作用就是地址,用于以后可以轻松的访问到内存。也可以这么理解:内存的单元编号==地址==指针。

指针变量与地址

&,在C语言中,名为取地址的操作符,例如:

int main()
{
    int a=0;
    printf("%p",&a);
    return 0;
}

这样便可以得到a的地址。

得到的地址p也是一个变量,其中存放的是a的地址。那我们该如何定义这种变量呢?

指针类型

定义指针首先要了解指针的类型,有int型,有char型,还有float型......

其次我们还要知道一个解引用的操作符(*)

//整型
int a=20;
int*p=&a;

指针变量的大小

有地址总线决定,我们知道,计算机有32位也有64位,所以指针的大小也有两种,四个字节和八个字节,其中32位有32个比特位,也就是4个字节,64位则是8个字节。而且指针的大小与前面说的指针的类型不同,指针的大小只和平台有关,与指针的类型无关。

指针类型的意义

指针的类型决定了对指针解引用时的权限大小(一次可以操作几个字符)

例如;char*的指针只能访问一个字节,int*的指针可以访问四个字节。

指针+-整数

上面我们说了char*与int*的区别,所以他们+-一个整数的结果也是不一样的。

char*类型的指针+1跳过一个字节,而int*类型的指针+1跳过4个字节。

所以结论:指针类型决定了指针向前或者向后走一步的距离大小。

void*指针

上面介绍的指针在定义时我们知道其类型,而如果我们并不知道的话,便可以用void*指针,

void*指针可以理解为无具体类型的指针(泛型指针)可以接受任何类型的地址,但是这类指针并不可以直接进行+-整数的操作,也不可以进行解引用的操作。所以我们一般使用在函数参数的部分,用来接收不同类型数据的地址,实现泛型编程的效果。

const修饰指针

const修饰变量

通过使用const修饰,可以使一个变量具有常属性,但本质上还是变量(在c++中const修饰后变量会变成常量)具有常属性之后,这个变量变得不可被修改,但是通过指针我们依旧可以改变存在一个变量里面的值,如:

可以看出n的值改变了,这是不符合const限制的,所以是不合理的,那么如何让指针也无法改变const定义后的变量的值呢?

const修饰指针变量

如果const放在*左边修饰的是指针内容,指针内容就不会发生改变。但是指针变量本身可以改变。

运行后我们可以发现,n所指的值还是10,即所存的数值没有改变。但是p的指向改变了。

int main()
{
    int n=10;
    int m=20;
    int const * p=&n;
    *p=20;
    p=&m
}

相反的,如果放在*右边的话,p中所存放的值会发生改变,而p的指向并不会发生改变,*p不变。

如果*前后都有const限制的话,那么两个值都不会发生改变。

指针运算

分为三种:指针+-整数;指针-指针;指针的关系运算(指针比较大小)。

注意:指针-指针的运算方式的两个指针指向同一块空间。

野指针

概念:就是指针指向的位置是不可知的(随机的,不正确的,没有限制的)

产生野指针的原因

1.指针未初始化

int main()
{
    int * p;//局部变量未初始化,默认为随机值
    *p=20;
return 0;
}

2.指针的越界访问

如出现在数组当中,超出数组的大小。

3.指针指向的空间释放

不能返回局部变量的地址。

assert断言

assert()括号内只要是表达式都可以,如果表达式的结果为假,assert()就会报错,使程序的执行中止。可以用来判断一个指针是否是一个空指针。

#include<assert.h>

是他的头文件。

传值调用和传址调用

传址调用,可以让函数和主调函数(不是主函数,是自己创建的函数)之间建立真正的联系,,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数的变量值来实现计算,就可以采用传值调用(人话:只用不改变)如果函数内部要修改主调函数中变量的值,就需要传址调用。

结语:关于指针的学习并没有结束,后续还会有更多关于指针的介绍。

**项目概述:** 本资源提供了一套采用Vue.js与JavaScript技术栈构建的古籍文献文字检测与识别系统的完整源代码及相关项目文档。当前系统版本为`v4.0+`,基于`vue-cli`脚手架工具开发。 **环境配置与运行指引:** 1. **获取项目文件**后,进入项目主目录。 2. 执行依赖安装命令: ```bash npm install ``` 若网络环境导致安装缓慢,可通过指定镜像源加速: ```bash npm install --registry=https://registry.npm.taobao.org ``` 3. 启动本地开发服务器: ```bash npm run dev ``` 启动后,可在浏览器中查看运行效果。 **构建与部署:** - 生成测试环境产物: ```bash npm run build:stage ``` - 生成生产环境优化版本: ```bash npm run build:prod ``` **辅助操作命令:** - 预览构建后效果: ```bash npm run preview ``` - 结合资源分析报告预览: ```bash npm run preview -- --report ``` - 代码质量检查与自动修复: ```bash npm run lint npm run lint -- --fix ``` **适用说明:** 本系统代码经过完整功能验证,运行稳定可靠。适用于计算机科学、人工智能、电子信息工程等相关专业的高校师生、研究人员及开发人员,可用于学术研究、课程实践、毕业设计或项目原型开发。使用者可在现有基础上进行功能扩展或定制修改,以满足特定应用场景需求。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
【EI复现】基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度(Matlab代码实现)内容概要:本文介绍了基于阶梯碳交易机制的虚拟电厂优化调度模型,重点研究了包含P2G-CCS(电转气-碳捕集与封存)耦合技术和燃气掺氢技术的综合能源系统在Matlab平台上的仿真与代码实现。该模型充分考虑碳排放约束与阶梯式碳交易成本,通过优化虚拟电厂内部多种能源设备的协同运行,提升能源利用效率并降低碳排放。文中详细阐述了系统架构、数学建模、目标函数构建(涵盖经济性与环保性)、约束条件处理及求解方法,并依托YALMIP工具包调用求解器进行实例验证,实现了科研级复现。此外,文档附带网盘资源链接,提供完整代码与相关资料支持进一步学习与拓展。; 适合人群:具备一定电力系统、优化理论及Matlab编程基础的研究生、科研人员或从事综合能源系统、低碳调度方向的工程技术人员;熟悉YALMIP和常用优化算法者更佳。; 使用场景及目标:①学习和复现EI级别关于虚拟电厂低碳优化调度的学术论文;②掌握P2G-CCS、燃气掺氢等新型低碳技术在电力系统中的建模与应用;③理解阶梯碳交易机制对调度决策的影响;④实践基于Matlab/YALMIP的混合整数线性规划或非线性规划问题建模与求解流程。; 阅读建议:建议结合提供的网盘资源,先通读文档理解整体思路,再逐步调试代码,重点关注模型构建与代码实现之间的映射关系;可尝试修改参数、结构或引入新的约束条件以深化理解并拓展应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值