二维数组调时候的传参问题 and 一维数组的中括号秘密( [ ] )——实参与形参的对应 —————— 开开开山怪

【文本分析学习】Anaconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码) NLTK 文本分析学习之 Anadconda+pytorch虚拟环境下的pycharm文本分析(含分词、词性标注、词形归一化、停用词、文本情感分析、词频、文本相似度,附数据代码) 阅读详情

1> 一维数组的基本知识储备

重要概念 1: 实参与形参: 在c中,实参可以是常量,变量,表达式。但是形参只能是 变量
重要概念 2: 数组结构: 任何数组的式是 type 数组名[ count ] ,数组名是一个指针常量,指类是数组元素的类型
重要概念 3: 指类:指类即指针所指向的空间的元素类型,对于指针变量来说,它的指类就是去掉和这个指针变量紧挨的 * 。任何申请的指针变量的结构都可以为 type * 变量名 。

int * pp的指类的 int , 此时的 type == int
double *** pp的指类是double** ,此时的 type == double**

像我们经常用的数组例如 int array[4] 相当于申请了4个int 空间,array 是数组名,但它的本质是指针常量,是一个地址,是这个数组的首元素首地址,而这个array 的指类是int ,指类的意思是指针所指向的空间的元素的类型。
当我们需要访问这个数组中的某个元素时,我们通常采用array[0], array[1]……,来访问数组中的第一个元素,第二个元素……。
上面说到array是一个指针常量,也代表数组首元素的首地址,对于星号运算符( * )大家应该不陌生,是一个指向运算符,后边可以跟指针常量,指针变量,指针表达式,那对 *array就有两种不同的状态 1:当处于等号的左边是表示array所指向的空间。 2:处于等号的右边,则表示array所指向的空间的值。
当我们采用 array[0] array[1] array[2] 进行访问数组中的元素的时候其实本质如下:

在这里插入图片描述

结论: [ ] 运算符相当于 *( ) 运算符
array[0] = = * (array + 0) == *(0 + array)
array[1] == * (array + 1) == *(1 + array)
在这里插入图片描述

2 > 二维数组的基本知识储备

采用简单的例子说明问题

一维数组 的基本形式 int array[3] 表示申请了三个元素的数组,元素的类型为int类型
二维数组 的基本形式 int array[3][2] 表示这个数组是三行四列,数组中的每个元素的类型为int类型

重点:在上面说到 一维数组 int array [3] 中的array是指针常量,且指类为int类型
而此时的 int array [3] [2] 中的array该怎么解释呢?

由于int array[3][2] 中的 [ 2 ] 离 array 较远可以将 [2] 进行左挪形成 int [2] array[3] 则形成
type array[3] , 此时的数据类型为 type 即 int [2] 。

此时的array同样也是一个指针常量但是一个二阶指针,但此时 array 的指类为 type 即 int [2] ,此时的 array + 1 则移动一个指类的长度即2 * 4 = 16个字节;array + 1 依旧是指针;此时的 array 代表的是 行指针, array + 1 则挪动一行的长度;

在这里插入图片描述

3> 一维数组和二维数组的传参问题

int array[3]

1> 一维数组的实参与形参的传递

void  funOne(int *p);  //函数的声明
void funOne(int *p) { //函数的定义
	
} 

int main() {
  int array[3];
  
  funOne(array);	
  return 0; 
}




//实参与形参传递时要求参数个数一致,参数的顺序一致,参数的类型一致
//此时实参是array是一个一阶指针,指类是int类型,同时形参 p也是一阶指针,且指类为int类型。

2> 二维数组的形参与实参的传递

void funOne();
void funOne() {
}

int main() {
  int array[3][2];

  funOne(array);
  return;
}

对于这个简单二维数组 int array[3][2] 来说,进行形参与实参的传递时,形参应该怎么写?
在上面已经说到不管是几维数组,结构都遵循 type 数组名[count]。
int array[3][2] == int[2] array[3]
type 为 int [2]
array是 指针常量
array所指向的空间的元素类型为int[2] ,这就对应到我一开始说到的指类,
array的指类是int [2];

对比一位数组来看
int array[3] 我们形参变量定义的时候为int *p
int array[3][2] 那对应是不是 int *p[2]呢?

错误写法: int * p[2]
分析: 因为形参实参传递的时候应遵循对应的规则,我们只需要做对应的判断 , 由于 [ ] 运算符的优先级高于 * 运算符,所以 [ ] 与变量 p 紧密结合,而 * 则与 int 进行结合,此时就形成的这样一个局面 int * p[2] ; 发现这个结果就相当于 type 变量名[count] ,那就相当于此时的 p 是一个数组首地址,是在一个指针常量,且指类是 type 即 int * , 这明显与上述的 array 的指类 type 不相同,所以 int * p[2] 是错误写法。

正确的写法: int ( * p)[2]
分析: 上边错误写法是因为 [ ] 运算符降低了 * 与变量 p 的结合性,那我们可以采用 ( ) 来提高 * 与变量 p 的高度结合性, int ( * p)[2] 由于 [ ] 此时并没有与变量 p 进行结合,则 [2] 可以进行左挪形成 int[2] ( * p) 其实这样就相当于 type * 变量名,根据指类的概念 p 的指类为 type 即 int[2] 与 array 对应。

不用买VR设备!用UE5内置模拟器开发虚拟现实项目的完整教程 本文提供了一套无需购买昂贵VR硬件的虚拟现实开发最佳实践方案。详细介绍了如何利用虚幻引擎5内置的XR模拟器,从零开始配置开发环境、模拟操作、构建场景并实现核心交互逻辑。通过这套纯软件方案,开发者可以高效学习VR开发核心,大幅降低入门门槛和成本。 阅读详情

相关推荐

Obsidian的Git插件设置配置全流程 -- 简单的电脑端多平台同步方案及常见问题

Git同步obsidian的保姆级教程和常见问题

weixin_44370439的博客 1万+

一维数组及二维数组的传参问题

一维数组的传参 方法一:传数组名 编译器会把这里的 array 解析成指向整型元素的指针,也就是数组的首地址,方括号里面的数组编译器会忽略,写不写都可以,最好不写,以免引起误解。 void test(int array[]) {} 方法二:传指针 array是指向数组的指针,数组名是首元素的地址。 但是在 sizeof(数组名) 和 &(数组名) 两组情况下,数组名指整个数组。 void...

lvxin15353715790的博客 1148

安装 Claude Code 并接入阿里云百炼(Bailian)

这些工具通常提供可视化界面,只需在设置中填入阿里云百炼的 API Key 和 Base URL 即可,无需配置环境变量。注意:如果你使用的是阿里云百炼的 Coding Plan 套餐,请使用该套餐专属的 API Key 和 Base URL。你可以使用文本编辑器打开该文件,或者在终端使用命令(如 macOS/Linux 下使用 nano ~/.claude/settings.json)。你可以直接用自然语言下达指令,例如:“帮我在这个目录下写一个 Python 脚本,实现两数之和的功能”。

hopsky的博客 1843

4步讲解一维数组传参与二维数组传参

速来看看:耗时3小时打磨而成:4步讲解一维数组传参与二维数组传参!!

weixin_64308540的博客 1285

搞定ESD(五):静电放电问题分析与调试

前面深入分析了静电放电的干扰机理、耦合路径,从现在开始将进入下一个大家非常关注的环节:静电放电问题分析与调试,掌握静电放电问题的分析方法,快速锁定敏感设备或者耦合路径,可以达到事半功倍的效果。

记得诚 2793

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 灯带颜色变换 (Java/Py/C/C++/Js/Go)

算法大师! 663

C语言二维数组做为实参/形参传递给函数的方式总结

假设main函数中定义了一个数组: int data[3][10] 一、传递形参(函数中只能使用数组参数,无法修改) 1.函数中的写法 void func(int array[][10]) { tmp=array[i][j]; } void func(int array[3][10]) { tmp=array[i][j]; } void func(int(*array)[1...

rock4you 1万+

C++-ONNX:用onnxruntime部署自己的模型【Pytorch导出.onnx】【Tensorflow导出.onnx】【C++用onnxruntime框架部署并推理】

微软联合Facebook等在2017年搞了个深度学习以及机器学习模型的格式标准–ONNX,旨在将所有模型格式统一为一致,更方便地实现模型部署。现在大多数的深度学习框架都支持ONNX模型转出并提供相应的导出接口。ONNXRuntime(Open Neural Network Exchange)是微软推出的一款针对ONNX模型格式的推理框架,用户可以非常便利的用其运行一个onnx模型。ONNXRuntime支持多种运行后端包括CPU,GPU,TensorRT,DML等。

u013250861的博客 5766

同样是将数组首地址存入指针变量里面,为什么有时加*有时不加*呢?

笔者为纯初学者,在通过小甲鱼的c语言教程进行自学时,学到了指针数组与数组指针这一章,果不其然,指针的学习难度很大,笔者对于很多习题都是处于完全不会做的情况。在论坛上搜寻相关资料时,偶然遇见一个坛友提出一个很有趣的问题,对此,笔者也同样有疑问,故以实验寻求其答案,提出不成熟之猜想,望与诸君共勉。 由图可知,target,*target,以及一维数组str的第一个元素实则拥有同一个地址,故不难发现,数组指针实则指向了数组的第一个元素的地址。 在百度百科上同样指出a[0]是第一个一..

m0_62304174的博客 1193

项目经理必看:如何建立高效的相关方沟通机制?

你是否遇到过这样的场景?客户突然说“这不是我要的”,开发团队抱怨“需求总变”,高层追问“进度滞后为什么不早说”?这些问题的根源往往是——相关方沟通机制失效。本文聚焦“如何建立高效沟通机制”,覆盖从识别相关方到持续优化的全流程,适用于IT、产品、工程等各类项目。本文将按“理解问题→拆解核心概念→掌握工具方法→实战落地→未来趋势”的逻辑展开,重点讲解“相关方分析矩阵”“沟通计划表”等实用工具,并用“组织生日派对”的案例贯穿全文,让抽象概念变得可感知。相关方识别:用“权力/利益矩阵”找对人(像派对邀请关键客人)

项目管理的博客 1295

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

二维数组名不能作为指针传递

二维数组名即数组地址,指向首行地址,表面上看,行地址即一维数组指针,而数组名指向行就应该是指针的指针,但是必须注意指针也是有类型的,类型不同数据宽度也不同。 如果a[10][10],假设int **p=a; 那么要对行递增执行p++时,编译器如何知道列宽?因为int **是指指向一个 int 类型的指针,32位系统中int 的宽度为4字节,即地址宽度是4字节,因此p将指向下一个元素(整数指针),也...

weixin_42916705的博客 792

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C/C++中二维数组作为形参传递参数

`param1`为二维数组,在函数`void total_score_of_each_stu(param1, param2, param3,param4)`中该以怎样的形参形式去接收函数调用时实参传递的参数?

weixin_45615071的博客 4303

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数组的使用的几个注意

我们有时会遇到*a或者*(&a)之类的数组使用,a为数组名。那么今天就来简单介绍一下这些: 比如说我们定义一维数组 int a[100]; 我们都知道一维指针名 a 保存的是数组首元素的地址,那么是否我们对数组进行遍历就可以像指针一样 a++ 来遍历呢? 答案是不能,因为上面数组首字母的解释并不完整,完整的说法是一维数组名是一个指针常量,它保存数组首元素的地址。 而我们知道,常量是保存在全

wp1995的博客 819

关于二维数组传参做形参

二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写?要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型。 正确的是:void Func(int array[3][10]); void

6万+

易懂的数组作为函数参数(C语言)

易懂的数组作为函数参数(C语言) 目录易懂的数组作为函数参数(C语言)1、数组做函数参数2、通过形参数组修改数组元素3、数组排序 1、数组做函数参数 (1)、若将一个数组作为实际参数传递给函数,只需不带方括号的数组名即可 若数组a的定义为:int a[10]; 若要将数组a作为实参传递给被调用函数SumArr(), 则调用语句可写成:SumArr(a,10); 数组名代表数组首元素的地址,因此数组名做参数就可以将数组的起始地址传递给形参。另外需要将数组元素的个数也传递给被调用的函数。 函数SumArr()

lflcodeplus的博客 7860

解决前端发axios请求传输数组参数给后端时,请求路径中的数组参数带中括号[]

问题描述 今天在做项目某部分功能时,后端接口接收一个数组参数,前端向后端发起axios get请求时,请求路径中的数组参数始终带有中括号[],导致后端一直报400错误… 正确请求路径: http://127.0.0.1:9000/bridgeMonitorContent/getContentByTypeIds?monitorTypeIds=LF-SWJTU&monitorTypeIds=ND-SWJTU 实际请求路径: http://127.0.0.1:9000/xboot/bridgeMonit

少年Dream 6645

数组的形参与实参,通过引用传递数组

在《C++ Primer 第四版》的第七章中,讲到了通过引用传递数组,和其他类型一样,数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参与实参类型的一部分,编译器检查数组实参的大小与形参的大小是否匹配。 #include using namespace std; void output(int (&a)[13

nuptxiaoli 7573

C语言数组中,数组名在中括号中(即 [array])是什么意思?

#include <stdio.h> int main() { int array[3]= { 1, 2, 3 }; printf("%d\n", 1[array]); // 2,注意 printf("%d\n", [array]);将报错 printf("%d\n", -1[array]); // -2 return 0; } 输出:   分析...

a3192048的博客 1万+

二维数组做形参或实参是出现的问题

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可以指 定所有维数的大小,也可以省略第一维的大小说明,如:     void Func(int array[3][10]);     void Func(int array[][10]);     二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是 不合法的:     void Func(in

学习专栏 1319

二维数组名作为实参或者形参

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可以指 定所有维数的大小,也可以省略第一维的大小说明,如:    void Func(int array[3][10]);    void Func(int array[][10]);    二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:    void Func(int array[

luxingqiang110的专栏 997

字符串和数组作为参数传递

链接:https://www.zhihu.com/question/31203609/answer/50992895 1. 类1: public class ArrayTest { //都是引用传递,输出的结果是"goodbbb" public void arrayPassTest(String s, String[] ss) { ...

viking_xhg的博客 2万+
上一篇: 3大类6种排序 插入排序 选择排序 冒泡排序 希尔排序 堆排序 快速排序 —————— 开开开山怪
下一篇: 巨大数的运算 (前篇 ——对于整数) # 万进制 # —————— 开开开山怪
开开开山怪
博客等级 码龄8年 41粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值