C和C++中数组的不同

news2024/11/17 17:46:41

本文选自公众号文章:

https://mp.weixin.qq.com/s/xyUMWTyEu7-Uws8Zfxifpghttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxcheckurl?requrl=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FxyUMWTyEu7-Uws8Zfxifpg&skey=%40crypt_963c540a_c8e6882f00ef27f0c27a8357dea508a7&deviceid=e018551237441330&pass_ticket=hKeIzPnVjzg5Gn7uOm%252BlJOTiRD7vgY4FzwOwt95fv%252FXb3GpjM6qwNVI%252FK7ofv%252F1ldF2x9nulDZZv%252FwcixkBjtw%253D%253D&opcode=2&scene=1&username=@ffc933edb70ad383b17c80ff12e7fdd90fb0657914699f6e81d16e97be7c7b28

(1)在C99标准中引入了可变长度数组 (Variable-Length Arrays, VLA) 的概念。可变长度数组允许在运行时确定数组的大小,这使得数组的大小可以在函数调用时动态决定。例如:

#include <stdio.h>
int main(void) {
  int n;
  scanf("%d",&n) ; 
  int a[n];
  for(int i=0; i<n; i++) {
    a[i]=i;
  }
  for(int i=0; i<n; i++) {
    printf("%d ",a[i]);
  }
  printf("\n");
  return 0;
}

在C++中,标准C++并不直接支持可变长度数组。C++11及以后的标准没有引入类似C99中的可变长度数组特性。然而,C++中可以使用其他机制来达到类似的效果。

(2)分析下面的程序:

#include <stdio.h>
int main() {
    int *pa1,*pa2, *pb1,*pb2;
    int a[15]= {0};
    int b[3][5]= {0};
    pa1 = a;
    pa2 = a+1;
    pb1 = b;
    pb2 = b+1;
    printf("%p,%p,%d\n",pa1, pa2, pa2-pa1);
    printf("%p,%p,%d\n",pb1, pb2, pb2-pb1);
    return 0;
}

数组名表示整个数组在存储空间中的起址,因此可以把数组名看作是一个指针,因此,a的类型为int *,b的类型为int (*)[5](指向含有5个整数的一维数组的指针)。

用C/C++语法分析第6行第7行语句。

第6行:pa1 = a;

pa1 被定义为指向整数的指针;a是一个包含15个整数的数组。

数组名a实际上是数组首元素的地址。因此,pa1 = a; 的效果是将 a 的首元素地址赋值给 pa1。结果:pa1指向 a 数组的第一个元素。

第7行:pa2 = a + 1;

pa2 同样被定义为指向整数的指针;a+1 的效果是将 a 的地址加上一个整数的大小(通常是4字节,取决于平台)。这意味着 pa2 指向 a 数组的第二个元素。结果:pa2 现在指向 a 数组的第二个元素。

总结:pa1指向 a 数组的第一个元素,pa2指向 a 数组的第二个元素。这两个语句都是正确的,并且按照预期的行为工作。

用C/C++语法分析第8行第9行语句。

通过前面的介绍知道,b的类型是 int (*)[5],而不是简单的 int*。这意味着 b 指向的是一个包含5个整数的数组,而不是单个整数。

对于语句:pb1 = b;

pb1 被定义为指向整数的指针,b 是一个二维数组,包含3行5列的整数。数组名 b 实际上是指向含有5个整数的一维数组的指针,即 int (*)[5]。因此,pb1 = b; 的效果是尝试将 b 的首元素地址赋值给 pb1。

这里有一个类型不匹配的问题。pb1 是一个指向整数的指针,而 b 的类型是 int (*)[5],即指向含有5个整数的一维数组的指针。所以,这个语句会导致编译错误,因为 pb1 的类型与 b 的类型不匹配。

同样,语句:pb2 = b + 1;

也类似。b + 1 的效果是将 b 的地址加上一个一维数组的大小(通常是5个整数的大小)。这意味着 pb2 试图指向 b 数组的第二个一维数组。与 pb1 = b; 类似,这里同样存在类型不匹配的问题。所以,这个语句也会导致编译错误,因为 pb2 的类型与 b + 1 的类型不匹配。

总之,pb1 和 pb2 的类型都是 int *,即指向整数的指针。b 的类型是 int (*)[5],即指向含有5个整数的一维数组的指针。pb1 = b; 和 pb2 = b + 1; 都会导致编译错误,因为 pb1 和 pb2 的类型与 b 的类型不匹配。

但是,该程序在C编译器下编译仅出现警告信息,但能正确编译,也能得到正确的结果。

图片

程序运行结果如下图所示。

图片

而在C++编译器下编译出现错误信息。

图片

为什么?在C语言中,虽然标准不允许int (*)[5]到int *的隐式转换,但在实际编译中可能通过,这主要是因为一些 C 编译器在处理代码时可能较为宽松,对不符合标准的类型转换没有严格报错。但这并不代表这种转换是正确的行为,使用这样的转换可能会导致不可预期的结果。

而在 C++ 中编译不通过是因为 C++ 的类型检查通常更加严格。C++ 致力于提供更强的类型安全,对于不符合标准的类型转换会明确报错,以防止潜在的错误和不可预期的行为发生。C++更注重程序的安全性和正确性,不允许这种可能导致错误的隐式类型转换。如果把8和9行改为:

pb1 =(int *) b;
pb2 =(int*) b+1;

在C或C++下都可编译通过。

参考文献:

[1]C语言基本概念——C与C++的不同之处

[2]李红卫,李秉璋. C程序设计与训练(第四版)[M],大连,大连理工大学出版社,2023.

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

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

相关文章

了解Redis数据持久化(下)

4.AOF 写后日志&#xff0c;避免宕机数据丢失 4.1 AOF说明 AOF日志存储的是Redis服务器的顺序指令序列只记录对内存进行修改的指令append-only file&#xff08;AOF&#xff09;AOF主要是主线程在执行&#xff0c;将日志写入磁盘的过程中&#xff0c;如果磁盘压力太大&#x…

USB3.2 摘录(九)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; USB3.2 摘录&#xff08;五&#xff09; USB3.2 摘录&#xff08;六&#xff09; USB3.2 摘录&…

HCIA--网络地址转换NAT技术

NAT(Network Address Translation&#xff0c;网络地址转换技术是为了缓解IPv4地址有限的问题。 NAT技术主要用于实现内部网络的主机访问外部网络。一方面NAT缓解了IPv4地址短缺的问题&#xff0c;另一方面NAT技术让外网无法直接与使用私有地址的内网进行通信&#xff0c;提升…

【ACL2024教程】大型语言模型对抗攻击的脆弱性,200多页ppt

本教程全面概述了大型语言模型&#xff08;LLMs&#xff09;在对抗攻击下暴露的脆弱性——这是一个可信机器学习中新兴的跨学科领域&#xff0c;结合了自然语言处理&#xff08;NLP&#xff09;和网络安全的视角。我们强调了单模态LLM、多模态LLM以及集成LLM的系统中现有的脆弱…

FPGA上板项目(三)——RAM测试

目录 实验内容实验原理实验步骤实验用时序波形HDL 代码仿真综合实现上板测试 实验内容 对 FPGA 内部的 RAM 进行数据读写操作。 实验原理 RAM &#xff08;Random Access Memory&#xff09;&#xff0c;是可以进行数据交换的存储器&#xff0c;可读可写&#xff1b;而 ROM&…

Docker一行命令安装MySQL

1 前言 在Linux系统中安装MySQL数据库是一件繁琐的事情&#xff0c;经常遇到各种问题&#xff0c;浪费大量时间。Docker的出现很好的解决这个问题&#xff0c;下面然我们来学习如何在Docker中用一行命令安装MySQL。 2 安装Docker 这里以CentOS系统为例&#xff0c;步骤非常简…

这4款专业的思维导图工具教你怎么快速制作脑图。

思维导图怎么制作&#xff1f;其实很简单&#xff0c;在制作思维导图之前&#xff0c;先要明确自己的导图主体&#xff0c;然后就可以去选择一个合适的工具&#xff0c;就可以开始制作。如果不知道如何挑选工具的话&#xff0c;我可以帮助大家列举几个。 1、福昕365脑图 传送门…

关于前端布局的基础知识

float 横向布局 float 实现横向布局&#xff0c;需要向横着布局的元素添加float 其值left right 存在问题 如果使用float 所在父级五高度&#xff0c;会导致下方的元素上移 top的高度被吞了 解决方法&#xff1a; 给父级元素设置高度&#xff1a;不推荐&#xff0c;需要给父级…

盘点15款主流客户管理系统,助力企业选型!

本文将盘点15款主流客户管理系统&#xff1a; 简道云、纷享销客、销售易、HubSpot、Zoho CRM、SAP CRM、Oracle CRM、金蝶云星空 CRM、用友 CRM、悟空 CRM、Salesforce、Microsoft Dynamics 365、亿客 CRM、八百客 CRM、CloudCC CRM。 在当今的商业环境中&#xff0c;客户管理系…

能大致讲一下Chat GPT的原理吗?

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 话题群精选了三位网友的回答&#xff0c;从不同的角度阐释了Chat GPT的原理。 第一位网友的回答&#xff1a; 不给你扯长篇大论&#…

SpringBoot整合MyBatis使用自定义TypeHandler

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

系统知识小百科:如何禁用电脑无关软件!

禁用电脑上的无关软件是提升系统性能和安全性的有效手段。 以下是一些主要的方法来帮助你禁用这些软件&#xff1a; 一、通过Windows系统设置卸载无用软件 打开设置&#xff1a;按下Win I打开Windows设置。 进入应用管理&#xff1a;点击“应用”选项&#xff0c;这里会列出…

2024最新盘点!哪些仓库管理系统值得推荐?

本文将对16款仓库管理系统进行盘点&#xff1a; 简道云仓库管理系统、Oracle Warehouse Management、富勒、音飞储存、Microsoft Dynamics 365、金蝶、Logiwa、易订货、Fishbowl Warehouse、百卓轻云、智慧记、Oracle NetSuite、鸿链科技 WMS 仓库管理系统、Infor CloudSuite、…

武汉流星汇聚:亚马逊赋能中小企业,跨境电商市场举足轻重地位稳

在全球经济一体化的浪潮中&#xff0c;跨境电商作为推动国际贸易的重要力量&#xff0c;正以前所未有的速度发展。在这场全球性的商业竞赛中&#xff0c;亚马逊以其卓越的市场表现、强大的技术实力和深厚的品牌影响力&#xff0c;稳居跨境电商市场的领头羊地位&#xff0c;其举…

视频美颜SDK与直播美颜插件的开发指南:从基础到高级应用

今天&#xff0c;笔者将详细讲解如何从基础到高级应用开发视频美颜SDK与直播美颜插件。 一、视频美颜SDK的基础概念与架构设计 视频美颜SDK是一种集成在移动应用或桌面应用中的软件开发工具包&#xff0c;允许开发者在视频流中实现实时美颜效果。其核心功能包括肤色调整、磨皮…

Vue3.5新增的baseWatch让watch函数和Vue组件彻底分手

前言 在Vue 3.5.0-beta.3版本中新增了一个base watch函数&#xff0c;这个函数用法和我们熟知的watch API一模一样。区别就是我们之前用的watch API是和Vue组件以及生命周期是一起实现的&#xff0c;他们是深度绑定的。而Vue3.5新增的base watch函数是一个新的函数&#xff0c…

飞速(FS)400G SR4光模块概述

随着光网络领域新技术的不断涌现&#xff0c;数据传输的能力和效率也在持续提升。400G SR4光模块的出现不仅扩展了短距离光通信的可能性&#xff0c;还为未来迈向800G及更高带标准宽奠定了基础。本文深入探讨了飞速&#xff08;FS&#xff09;400G SR4光模块的特点和重要性&…

《计算机操作系统》(第4版)第10章 多处理机操作系统 复习笔记

第10章 多处理机操作系统 一、多处理机系统的基本概念 1. 多处理机系统的引入 (1)CPU 时钟频率接近极限。 (2)增加系统吞吐量。 (3)节省投资。 (4)提高系统可靠性。 2.多处理机系统的类型 (1)紧密耦合MPS 和松散耦合MPS ①紧密耦合MPS 紧密耦合通常是通过高速总线或高速交叉开…

页面设计任务 商品详情页(带评论区)

目录 效果图&#xff1a; 任务描述 源码&#xff1a; 详细讲解&#xff1a; 1.产品信息部分 2.用户评论区域 效果图&#xff1a; 任务描述 页面结构: 页面应包括一个标题部分、一个产品展示区和一个客户评价区。使用图片展示产品&#xff0c;并添加描述。客户评价区展示一…

删除Vue2残留配置文件解决异常:Cannot find module ‘@vue/babel-plugin-transform-vue-jsx‘

背景 完成Vue2代码升级为Vue3后&#xff0c;将新代码上传至代码库。在修改源代码库代码后&#xff0c;启动项目&#xff0c;提示&#xff1a;Cannot find module ‘vue/babel-plugin-transform-vue-jsx‘&#xff0c;尝试安装该第三方库后仍然无效。 解决方案&#xff1a; 删…