| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言_数组、指针和函数 -> 正文阅读 |
|
[C++知识库]C语言_数组、指针和函数 |
文章目录数组、指针和函数0、前言之前大一的时候,学习C语言,学到数组的时候感觉还行,可以接受。但是学到指针和函数后,绕来绕去的,就开始懵圈了。 但是,指针的重要性不言而喻,检验C语言学得好不好,就看“指针和内存管理”了。 大一下之后呢,就一直学Java,虽说原理都是相近的,但是毕竟C的语法还是比较细的,而且最近因为一些原因呢,要用C语言实现算法,所以抽空补补了C的基础和语法,特此记录一下。 1、数组的内存中的存储那些简单的数组定义、初始化等比较简单就不说明,我们重点来看数组在内存中的存储。 在此,我们先来补充一下内存地址原理,其实这个知识点是《计算机组成原理》的内容,在此简单提一下,顺带补充一句,基础很重要,小伙伴们要重视基础哦! 假设我们的机子32位,则会使用4字节来存储地址,例如”0x11223344”;若为64位,则用8字节来存储地址,例如“0x1122334455667788”。 以32位机为例: 接着,我们先写一段很简单的程序,然后我们再来看,VS2022调试中的内存映像。
内存映像: 通过内存映像我们可以很清楚的看到,例如:
2、指针2.1、指针和指针变量
假设32位机,num存放的地址为“0x 11 22 33 44”。 我们就说,变量num的地址(指针)是“0x 11 22 33 44”;指针变量point的值是“0x 11 22 33 44”。 我们都知道int类型的变量num占4个字节(32位机),那么指针变量point占多大的空间呢?答若为32位机,寻址范围为32位即4字节;若为64位机,则寻址范围为64位即8字节。 2.2、操作符
2.3、指针操作2.3.1、指针和整数相加减我们以加法为例,减法同理。
2.3.2、指针递增
2.3.3、指针求差
2.3.4、& 和 * 同时使用
&*point 和 *&a 的含义和区别 “&”和“*”两个运算符的优先级别相同,但要按自右向左的方向结合。 因此,&* point 与 &a 相同,都表示变量a的地址,也就是point。 而*&a,首先进行&a运算,得到a的地址,再进行*运算。*&a和*point的作用是一样的,它们都等价于变量a,即*&a 与a等价。 2.4、指针类型与地址地址应该和指针类型兼容,也就是说,我们不能把int型变量的地址赋值给指向double类型的指针,只能将int型变量的地址赋值给指向int类型的指针变量中。 用代码表示如下:
我们在开发过程中,应该避免出现这种问题。 但是,如果硬要这么做的话,又有什么影响呢? 其实是可以赋值的,但是会出现数据截断等错误,而且不能进行指针操作,由于篇幅所限,详情请看《C语言_地址与指针类型不兼容造成的影响》。 3、函数3.1、全局变量和局部变量
全局变量i存储在数据段,所以main函数和my_print函数都是可见的。 全局变量不会因为某个函数执行结束而消失,在整个进程的执行过程中始终有效,因此开发中应尽量避免使用全局变量! 我们在函数内定义的变量都称为局部变量,局部变量存储在自己的函数对应的栈空间内,函数执行结束后,函数内的局部变量所分配的空间将会得到释放。 如果局部变量与全局变量重名,那么将采取就近原则,即实际获取和修改的值是局部变量的值。 3.2、堆空间和栈空间的差异我们用一个例子来看一看栈空间和堆空间的差异。
4、函数、数组和指针假设我们有一个需求,是要对数组进行求和,我们可以怎样定义函数呢?
从输出的结果可以出,以上三个函数是等价的! 之前,我们也说过,数组名就是数组首元素地址。 无论是将函数形参定义成“数组”亦或是“指针”,我们传入的“数组名”亦或是“指针”,其实在底层最后传的都是“指针”,也就是“地址”,对应到本例就是“数组首元素的地址”。 这样也就能明白,为什么我们定义函数时需要两个形式参数,即“数组地址”和“数组大小”。 因为在函数实现中,我们并不知道数组的长度,盲目运算可能会造成空指针异常,因此我们要手动地传入“数组长度”。当然,我们也可以传入“数组首地址”和“数组尾地址”,其实原理都是一样的。 emmm,大概就唠这么多吧,最近发现基础真的重要!!! 注:如有错误,敬请指正!!! |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:08:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |