C语言指针学习-从入门到精通

C语言中有指针概念,非常抽象灵魂,想要完全掌握他不是意见容易的事,结合这几天的学习进行一个总结。

一、什么是指针指针实际就是地址,(指针=地址),地址就是具体的位置信息。
 

二、什么是变量:用于存储某种类型的数据叫做变量,比如int a;定义了一个整型a变量,那么这个时候计算机会给变量a自动分配了一个内存空间,这个空间大小按int的占用的字节大小分配,如整型占用4个字节,内存也就是这么大,这块内存空间的首地址就是指针,通常可以用取址符&取出地址,即&a,这就是内部的空间分配逻辑。


三、什么是指针变量:用于存储指针的变量,也可以通俗的理解成存储地址的变量,专门存储的地址的变量就是指针变量,指针变量的定义是int *b, b可以用来存储地址的变量, 指针变量也是一个存储单元,和普通变量一样,区别是存储你单元里的内容是指针。 也可以理解成指向具体整型数字的指针。

注意:

对于指针变量 b,是不能用*b对存储单元空间进行赋值,比如*b=10; 这个时候会报错的,如下

int a = 10;
int *b;
*b=20; 

正确的写法有2种,1指针指向一个有实际空间或已分配了空间的变量

int a = 10;
int *b;
b = &a;
*b=20; 

2给指针b分配空间如下

int a = 10;
int *b = (int *)malloc(sizeof(int));
*b=20; 

以上必须要分清楚和理解到位,否则很难去深刻运用指针,

四、变量内存分配

上述代码中定义一个变量int a=10是栈上分配,函数结束即回收,用malloc是动态分配空间,变量的内存分配如下

1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。

2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

五、C语言堆和栈空间如何交互 

堆和栈是两个不同的内存区域,用于存储程序中的数据。堆是由程序员动态分配的内存空间,而栈则是由编译器自动管理的内存空间。

在C程序中,堆和栈是两个独立的存储区域,相互独立,没有直接的交互关系。在函数调用时,局部变量和函数参数都被存储在栈中;当函数返回时,这些变量和参数也会自动从栈中弹出并释放。而堆则是由程序员手动分配和释放内存。

可以使用指针在堆和栈之间传递数据。程序员可以通过将堆上分配的内存的地址存储在栈中来实现这一点。同时,也可以将栈上分配的变量的地址存储在堆中。

例如,可以使用malloc()函数在堆中分配内存,并将其地址存储在指向堆中分配的内存的指针中。然后,可以将指针传递给函数,该函数可以在堆上分配空间,并将结果存储在该指针所指的位置。最终,可以使用free()函数释放在堆中分配的内存。

#include <stdio.h>
#include <stdlib.h>void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}int* heap_swap(int a, int b) {int* ptr = (int*) malloc(sizeof(int) * 2); //分配堆空间*ptr = b;*(ptr + 1) = a; //将栈上的数据复制到堆空间中return ptr; //返回堆指针
}int main() {int x = 10;int y = 20;printf("Before swapping: x=%d, y=%d\n", x, y);swap(&x, &y); //使用函数交换栈上的数据printf("After swapping using stack: x=%d, y=%d\n", x, y);int* ptr = heap_swap(x, y); //使用堆空间交换数据x = *(ptr + 1);y = *ptr;free(ptr); //释放堆空间printf("After swapping using heap: x=%d, y=%d\n", x, y);return 0;
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023蓝桥杯算法学习路线与基础知识整理

文章目录 前言数学基础1.1 简单数学1.2 案例2. 1组合数学2.2 案例3. 1线性代数3.2 案例4. 1高等数学4.2 案例 计算几何1.1基础概念1.2 案例2.1基本运算2.2 案例3.1圆3.2 案例 数论1.1基础知识1.2 案例2.1素数2.2 案例3.1同余理论3.2 案例4.1位运算4.2 案例 概率论1.1概率1.2 案…

【23-24 秋学期】NNDL 作业9 RNN - SRN

简单循环网络&#xff08;Simple Recurrent Network&#xff0c;SRN&#xff09;只有一个隐藏层的神经网络&#xff0e; 目录 1. 实现SRN &#xff08;1&#xff09;使用Numpy &#xff08;2&#xff09;在1的基础上&#xff0c;增加激活函数tanh &#xff08;3&#xff0…

uniapp版本更新ios无效

uniapp小程序实现更新操作提示用户升级 引言获取小程序版本是否需要更新以及更新操作1.App.vue文件中实现获取更新方法2.在App.vue的 onShow 里面运行3.App.vue中使用到的提示框封装方法引言 小程序更新时,为了防止小程序由于热启动或者需要在登录时候添加新的缓存,无法获取…

Navicat忘记连接密码,查看数据库密码(JAVA版本、php版)

1、php版参考 navicat 如何查看已经连接了的数据库账号和密码_12992884的技术博客_51CTO博客 2、java版参考 Navicat 如何查看已经连接了的数据库账号和密码|openssl|protected_网易订阅 以上均为转载学习

YOLOv7独家原创改进:自研独家创新FT_Conv,卷积高效结合傅里叶变换

💡💡💡本文自研创新改进:卷积如何有效地和频域结合,引入分数阶傅里叶变换和分数阶Gabor变换,最终创新到YOLOv7。 推荐指数:五星 在道路缺陷检测任务中,原始map为0.8,FT_Conv为0.82 收录YOLOv7原创自研 https://blog.csdn.net/m0_63774211/category_12511937.htm…

力扣347. 前 K 个高频元素(java,最小堆,快速排序法)

Problem: 347. 前 K 个高频元素 文章目录 前言题目描述思路解题方法复杂度Code 前言 对于求取Top K一般有如下两种题型&#xff1a; 1.针对静态数据&#xff08;查询TopK操作&#xff09; 2.针对动态数据&#xff08;包括添加数据操作和查询TOPK操作&#xff09; 一般解决思路…

《一带繁花一路歌》趣味化讲述“一带一路”故事,生动化展现“文明互鉴”美好图景

2023年&#xff0c;总台《艺览天下》推出“一带一路”10期特别节目《一带繁花一路歌》&#xff0c;节目邀请“一带一路”沿线国家驻华大使等重量级嘉宾&#xff0c;在地标推介、故事分享、现场互动等环节里趣味化讲述“一带一路”故事&#xff0c;生动地展现出“文明互鉴”的美…

使用Java将yaml转为properties,保证顺序、实测无BUG版本

使用Java将yaml转为properties 一、 前言1.1 顺序错乱的原因1.2 遗漏子节点的原因 二、优化措施三、源码 一、 前言 浏览了一圈网上的版本&#xff0c;大多存在以下问题&#xff1a; 转换后顺序错乱遗漏子节点 基于此进行了优化&#xff0c;如果只是想直接转换&#xff0c;可…

【开源视频联动物联网平台】视频AI智能分析部署方式

利用视频监控的AI智能分析技术&#xff0c;可以让视频监控发挥更大的作用&#xff0c;成为管理者的重要决策工具。近年来&#xff0c;基于视频监控的AI分析算法取得了巨大的发展&#xff0c;并在各种智慧化项目中得到了广泛应用&#xff0c;为客户提供更智能化的解决方案。 然…

【Node.js】笔记整理 3 -npm

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

Ubuntu22.04 server版本关闭DHCP,手动设置ip

在Ubuntu 22.04 中&#xff0c;网络配置已迁移到 Netplan&#xff0c;因此可以使用 Netplan 配置文件来手动设置 IP 地址并关闭 DHCP。 以下是在 Ubuntu 22.04 上手动设置 IP 地址并禁用 DHCP 的步骤&#xff1a; 打开终端&#xff0c;使用 root 权限或 sudo 执行以下命令&…

WordPress(10)解决中文连接问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、修改的前后二、自定义结构讲明三、修改方法前言 提示:这里可以添加本文要记录的大概内容: 1.中文连接如:http://www.lplovemm.love/2023/11/12/测试 2.这种连接在提交sitemap收录的时…

【神经网络】AlexNet

来源 2012年在全球知名的图像识别竞赛 ILSVRC 中&#xff0c;AlexNet 横空出世&#xff0c;直接将错误率降低了近 10 个百分点&#xff0c;这是之前所有机器学习模型无法做到的。 网络结构 AlexNet整体的网络结构包括&#xff1a;1个输入层&#xff08;input layer&#xff…

夸克大模型助力学术科研提效 四大优势提升知识正确性

当严谨的学术科研与创新的大模型技术结合在一起&#xff0c;会擦出什么样的火花&#xff1f;日前&#xff0c;夸克大模型甫一推出便以优秀的性能成为国产大模型中的“学霸”。在中国科学技术协会近期主办的“大模型应用场景研讨会”上&#xff0c;夸克大模型在快速阅读、创作润…

“简洁实用,没有繁琐设置!Cloudreve是个人使用的最佳网盘“

Cloudreve是一款基于Web的文件共享和管理服务软件。它可以用于创建自己的私有云存储服务或公共文件分享平台&#xff0c;该网盘底层支持本机存储、从机存储、阿里云OSS、又拍云、腾讯云COS、七牛云存储、OneDrive&#xff08;国际版/世纪互联版&#xff09;等多种存储方式&…

云轴科技ZStack助力龙芯打造IT产业新生态

11月28日&#xff0c;2023龙芯产品发布暨用户大会在国家会议中心启幕。大会以“到中流击水”为主题&#xff0c;现场发布新一代通用处理器龙芯3A6000、打印机主控芯片龙芯2P0500重磅成果&#xff0c;并对外公布龙芯处理器核IP及龙芯自主指令系统架构授权计划。作为龙芯的卓越行…

如何判断电脑电源质量的好坏?

电脑电源作为电脑的关键部件直接影响到电脑的性能和寿命&#xff0c;因此选择一个好的电源至关重要。那么要如何判断电脑电源的好坏呢?判断的指标都有哪些呢? 1.外观检测 观察电源外观可以初步判断电脑电源的工艺质量和材料质量。外观检测需要检查电源外壳是否坚固&#xff0…

阿里云RDS标准版(x86) vs 经济版(ARM)性能对比

概述 阿里云数据库在去年云栖大会上发布了基于阿里倚天芯片&#xff08;ARM架构&#xff09;的RDS实例&#xff0c;后正式命名为经济版。本文通过标准的sysbench测试&#xff0c;来看看相比与标准版&#xff0c;经济版是否更加“经济”&#xff0c;以帮助开发者选择适合自己的…

《六》CSS 中的自定义属性

自定义属性&#xff1a;也可以称作 CSS 变量或者级联变量&#xff0c;是由 CSS 作者定义的。由自定义属性标记来设定值&#xff08;例如&#xff1a; --main-color: black;&#xff09;&#xff0c;由 var() 函数来获取值&#xff08;例如&#xff1a; color: var(--main-color…

蓝桥杯每日一题2023.11.30

题目描述 九数组分数 - 蓝桥云课 (lanqiao.cn) 题目分析 此题目实际上是使用dfs进行数字确定&#xff0c;每次循环中将当前数字与剩下的数字进行交换 eg.1与2、3、4、、、进行交换 2与3、4、、、进行交换 填空位置将其恢复原来位置即可&#xff0c;也就直接将其交换回去即可…