熟悉C里指针的朋友来帮我检查一下这段代码的注释:关于数组名和指针互相转换的

slowgrace slowgrace 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
熟悉C里指针的朋友来帮我检查一下这段代码的注释,好么?

主要是依据以下关于数组名和指针互相转换的道理:

(1)当一个数组标识符出现在表达式中,这个标识符的类型就从“某种类型T的数组”转换成“指向类型T的指针”,而且它的值就等于数组第一个元素的地址。并且这个指针是个常量指针,不可改变其值的。
(2)但是当数组标识符被用作sizeof和取址(&)操作的操作数时,sizeof返回的是整个数组的大小,而取址操作返回的是指向数组的指针(而不是指向一个值为数组头元素地址的指针的指针)。
(3)既然数组标示符在表达式中被“转换为”指针用,那对于二维数组又是什么情况呢?对于一个二维数组如:int a[3][3], a是指向一维数组的指针;当进行一次a[i]这样的运算后所得到的值是一个指针,其所指对象是一个int类型,[]运算符的作用除了变址,还将一个行指针变为一个列指针;同理当进行一次&a[i]这样的运算后所得到的指针又是一个指向一维数组的指针,即行指针。


	int a[3] = {1, 2, 3};
char **s;
char p[3][5] = {{'a', 'b', 'c', 'c','\0'},
{'d', 'e', 'f', 'f','\0'},
{'\0', '\0', '\0', '\0', '\0'}};

s = (char **)p;

printf("a: %p\n", a); //0012FF74:a在表达式里被转为int *,指向a[0]
printf("*&a: %p\n", *&a); //0012FF74:a首先是int *,对一个指针型变量取地址之后再取值就是它本身,所以结果同上一行
printf("&a: %p\n", &a); //0012FF74:&a返回的是数组指针,因为数组的地址同a[0]的地址,所以结果同上一行
printf("&a[0]: %p\n", &a[0]); //0012FF74:打印的a[0]同学的地址,所以结果同上一行

printf("a[0]: %p\n", a[0]); //00000001:把a[0]的值以双字的形式打印出来
printf("*a: %p\n", *a); //00000001:把*a里的值当指针打印出其地址。记住a在表达式里被转为int *,指向a[0],
//所以*a其实就是a[0],所以结果同上一行。

printf("p: %p\n", p); //0012FF60:p是指向一维数组的指针,这个语句是要打印该一维数组的地址,等于p[0][0]的地址
printf("&p: %p\n", &p); //0012FF60:打印二维数组p的地址,等于p[0][0]的地址,所以结果同上一行
printf("p[0]: %p\n", p[0]); //0012FF60:p[0]是一维数组的数组名,出现在表达式中作为char *使用。
//这个语句是要打印p[0]所指向的字符的地址,也就是p[0][0]的地址,所以结果同上一行


printf("&p[0]: %p\n", &p[0]); //0012FF60:打印一维数组p[0]的地址,等于p[0][0]的地址,所以结果同上一行
printf("p[1]: %p\n", p[1]); //0012FF65:一维数组名p[1]作为char *,指向p[1][0]。
//这个语句是要打印p[1][0]的地址,该地址等于p[0][0]的地址加5


printf("p[2]: %p\n", p[2]); //0012FF6A:一维数组名p[2]作为char *,指向p[2][0]。
//这个语句是要打印p[2][0]的地址,该地址等于p[1][0]的地址加5


printf("&p[0][0]: %p\n", &p[0][0]); //0012FF60:打印p[0][0]的地址
printf("&p[1][0]: %p\n", &p[1][0]); //0012FF65:打印p[1][0]的地址
printf("&p[2][0]: %p\n", &p[2][0]); //0012FF6A:打印p[2][0]的地址

printf("s的值: %p\n", s); //0012FF60:s的值等于p的值,因此等于p[0][0]的地址;
printf("s+1的值: %p\n", s+1); //0012FF64:s是指针的指针,因此s+1等于s的地址加4字节(32位系统);
printf("*s: %p\n", *s); //63636261:s是char **,*s就是char*。
//因此这句意思是把s指向的内存取4个字节(也就是p[0][0]到p[0][]3)作为char*,打印其值。


printf("以s的值为地址的内存里的内容:%s \n", s); //abcc :从s所指向的地址取出连续内存(遇到'\0'为止)作为字符串来打印。
printf("以s+1的值为地址的内存里的内容:%s \n", s+1); // :从s+1所指向的地址取字符串来打印。
...全文

相关推荐

产业园区如何精准识别和匹配优质科技成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

【基于dq控制算法的并联有源滤波器】分流有源滤波器的仿真电路可以减轻谐波和无功功率(simulink仿真实现)

内容概要:本文详细介绍了基于dq控制算法的并联有源滤波器(APF)在Simulink环境下的仿真电路设计与实现过程,重点阐述了通过分流式拓扑结构有效抑制电力系统中的谐波污染并补偿无功功率的技术方案。文中深入剖析了dq变换的核心原理,将其应用于控制系统中,实现三相交流量到直流量的转换,从而简化控制器设计并提升动态响应精度。仿真模型完整构建了主电路、负载模块及控制策略三大组成部分,能够直观呈现滤波前后电流波形的改善效果,验证了该方法在提高电能质量方面的有效性与可行性。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校师生,以及从事电能质量治理、有源滤波器研发及相关领域工程应用的技术人员。; 使用场景及目标:①用于课堂教学与课程设计,帮助学生理解dq变换机制及有源滤波器的工作原理;②为科研项目提供可复现的仿真平台,支持新型控制算法的开发与验证;③辅助企业在实际工程中优化APF产品设计,增强谐波抑制与无功补偿性能。; 阅读建议:建议结合MATLAB/Simulink环境动手搭建与调试模型,深入掌握各控制模块参数整定方法及其对系统性能的影响,可通过改变负载类型或引入非理想工况进行对比分析,以全面提升对系统稳态与动态特性的理解与掌控能力。

大龙不吃小鱼干

国央企创新负责人如何利用平台实现技术成果的精准对接与协同创新?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

中小功率逆变电源关键单元电路设计与保护策略研究【原理+PCB+程序】

内容概要:本文围绕中小功率逆变电源的关键单元电路设计与保护策略展开系统性研究,涵盖逆变电源的工作原理、硬件电路设计(包括DC-DC升压与DC-AC逆变)、SPWM正弦波调制技术、闭环控制策略(电压/电流双闭环)、系统保护机制(过压、过流、短路、过温等)以及基于STM32的嵌入式控制系统开发。研究内容整合了Simulink仿真模型、PCB设计文件与嵌入式程序代码,实现了从理论分析、仿真验证到硬件实现的完整技术链条,重点突出系统稳定性设计与多层级保护策略的协同优化,适用于逆变器产品的研发与工程实践。; 适合人群:具备电力电子、自动控制或电气工程等相关专业背景,从事电源系统设计的研发工程师、高校研究生及工程技术人员,尤其适合具有一定嵌入式系统开发经验(熟悉STM32系列单片机)且工作年限在1-5年的从业人员。; 使用场景及目标:①用于中小功率离网/并网逆变器的原型开发与产品设计;②作为高校电力电子、自动化等专业的课程设计、毕业设计或科研项目的综合性参考方案;③深入掌握SPWM调制、LC滤波器设计、PID闭环控制、系统保护逻辑等关键技术的实现方法;④结合仿真与实物平台进行波形测试与参数调试,提升电力电子系统的综合设计能力与故障排查水平。; 阅读建议:建议读者结合提供的原理图、PCB布局图与源代码同步学习,优先在Simulink中完成控制逻辑仿真,理解系统动态响应特性后再搭建实际硬件平台。重点关注保护电路的动作阈值设置与软硬件协同保护机制的实现方式,实验过程中应配合示波器、万用表等仪器观测关键节点波形,逐步优化控制参数以提升系统效率与稳定性。

程序猿鑫

vector_search_node.py

vector_search_node.py

it_xiaohua
评论 69
收藏 已收藏
分享
返回顶部
slowgrace
C语言 70,039 成员 243,237 内容