首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Visual Studio中的编译器不允许将参数int N[a][b],int M[b][a]传递给函数?

在Visual Studio中的编译器不允许将参数int Na,int Mb传递给函数的原因是因为这两个参数的维度不匹配。

在C语言中,多维数组的内存布局是按行主序(row-major order)进行存储的。也就是说,对于一个二维数组int arrm,内存中的元素是按照arr0、arr0、...、arr0、arr1、arr1、...、arrm-1的顺序存储的。

当我们定义一个二维数组int Na时,它的内存布局是按照N0、N0、...、N0、N1、N1、...、Na-1的顺序存储的。

同样地,当我们定义一个二维数组int Mb时,它的内存布局是按照M0、M0、...、M0、M1、M1、...、Mb-1的顺序存储的。

由于N和M的维度不同,它们的内存布局也不同。因此,将int Na和int Mb传递给函数时,编译器无法正确地解析参数的内存布局,从而导致错误。

如果需要在函数中处理这两个数组,可以考虑使用指针来传递数组,并在函数内部进行适当的指针操作来访问数组元素。例如,可以将参数改为int (N)b和int (M)a,这样就可以正确地传递和处理这两个数组了。

需要注意的是,以上解释是基于C语言的多维数组的内存布局和传递方式。在其他编程语言或者特定的编译器中,可能存在不同的规则和机制。因此,在具体的开发环境中,需要根据语言和编译器的规范来理解和处理多维数组的传递问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C指针基础概览

printf("%c ", **pp_x); // 通过两次解引用符最初元素(x数组里值)输出来 } return 0; } 在Visual Studio 2019运行结果为...Studio 2019运行结果为 1 2 3 4 5 6 7 8 9 10 函数参数中使用指针 函数参数址 C语言函数参数可分为值和址,其中,对于非复合形式非指针数据...址是指参数是复合类型(数组,结构等)或者指针,传递给函数参数内存地址,利用该地址,可以改变参数值。...n", result); return 0; } 在Visual studio 2019运行结果为 15 程序mysum函数接受2个参数,第一个参数是数组长度,第二个参数是指向数组指针...这样做好处是,可以先定义若干函数,然后这些函数起始地址放入函数指针,这样就可以通过指针数组元素,方柏霓地调用线管地函数执行。

1K20

C++奇迹之旅:值和引用本质效率与性能比较

引用ref已经引用a,不能再引用b cout << ref << endl; // 输出10,ref依然引用a 如图:ref引用了a,这里值发生改变是因为b赋值给了ref 使用场景 做参数值与地址...; Swap(ra, rb); return 0; } 值、引用效率比较 以值作为参数或者返回值类型,在参和返回期间,函数不会直接传递实参或者变量本身直接返回,而是传递实参或者返回变量一份临时拷贝...在第一个示例: int& Add(int a, int b) { int c = a + b; return c; } 这里函数返回了局部变量c引用,但c在函数返回后就已经被销毁了...答案思考: 在Visual Studio上运行这段代码,输出结果是: Add(1, 2) is :7 这个结果确实是未定义行为,但在某些情况下可能会输出7。...之所以会出现这种情况,是因为Visual Studio编译器在处理这种未定义行为时可能会做一些特殊优化或处理,导致在某些环境下能够得到一个看似合理结果。

12410

Visual C++ 重大更改

早期版本编译器生成了匿名联合显式构造函数和析构函数。 这些在 Visual Studio 2015 Visual C++ 已删除。           ...但在 Visual Studio 2015 Visual C++ ,不会调用构造函数和析构函数编译器会对关于此行为更改发出警告。           ...           type_traits(1110):错误 C2139:“D”:未定义不允许作为编译器内部类型特征“__is_base_of”参数 .....复制构造函数Visual Studio 2013 和 Visual Studio 2015 RC ,如果该类具有用户定义移动构造函数,但没有用户定义复制构造函数,则编译器生成类复制构造函数...C + + 标准始终要求 n 应等于作为第一个参数递给调用分配(返回 p)值。但是,在当前版本中将检查 n 值。 在运行时,为 n 传递不同于标准要求参数代码可能会崩溃。

4.7K00

Visual C++ 重大更改

早期版本编译器生成了匿名联合显式构造函数和析构函数。 这些在 Visual Studio 2015 Visual C++ 已删除。           ...但在 Visual Studio 2015 Visual C++ ,不会调用构造函数和析构函数编译器会对关于此行为更改发出警告。           ...           type_traits(1110):错误 C2139:“D”:未定义不允许作为编译器内部类型特征“__is_base_of”参数 .....复制构造函数Visual Studio 2013 和 Visual Studio 2015 RC ,如果该类具有用户定义移动构造函数,但没有用户定义复制构造函数,则编译器生成类复制构造函数...C + + 标准始终要求 n 应等于作为第一个参数递给调用分配(返回 p)值。但是,在当前版本中将检查 n 值。 在运行时,为 n 传递不同于标准要求参数代码可能会崩溃。

5.2K10

【从业余项目中学习2】C# 实现调用Matlab函数Visual Studio:2008, Matlab:R2009a)

最近正在给客户做个人项目,要求实现C#与Matlab之间调用,即C# winform界面收集用户输入参数参数递给Matlab算法计算,Matlab函数返回结果显示在winform界面上...测试用例简介   功能:Matlab函数计算两个数值a与b和,a与b值由C#提供,和值c经Matlab计算得出后,返回给C#   环境:Microsoft Visual Studio 2008      ...打开Matlab R2009a,新建testAdd.m文件     B. testAdd.m实现加法函数 1 function y = testAdd(a, b) 2 y = a + b;   2....怀疑是否与我VS,Matlab都装在一台机器有关。另外即便我执行这安装命令,也找不到正确编译器。总之,我并没有按照网上教程,直接"deploytool"即可。...\bin\win32\v2.0,MWArray是用于C#与Matlab之间数据交换类,值,取结果都用到它)     B.

2.8K70

老梁聊C++,为什么不能修改set里值?如果非要修改怎么办?

说白了,也就是编译器进行了限制,不允许我们对set迭代器内容进行修改。 Effective C++当中也明确说了,不要对set集合元素进行修改。...也很简单,大概率因为你用是vc编译器,比如臭名昭著VC6.0或者是visual studio IDE(不是VSCode)。微软编译器没有严格遵循C++标准,在很多地方有些瑕疵和随意。...说人话就是std::set其实不允许元素定义成const,既然元素不是const类型,那么就说明理论上是可以修改。...这个时候我们就可以在时候,使用const_cast操作符来解除掉const限制。 test(const_cast(p)); 尖括号是我们要转换类型,只能是指针或引用。...i = 3; const int b = i; int *r2 = const_cast(&b); (*r2)++; cout << b << endl; 这两段代码做事情非常类似,也就是通过

1K20

【C++】命名空间&缺省参数&函数重载&引用&内联函数

);//不,使用备用4 return 0; } 备注: 缺省参数不能在函数声明和定义同时出现,否则就会报错 最好是在声明时写缺省,也就是下面这样 void InitStack(Stack* ps...函数重载 函数重载定义:C++中支持两个函数名相同,但是函数参数参数个数或者类型)要不同  C语言中一个项目中不允许出现同名函数 C++函数重载允许一个项目中出现同名函数 #include...; void Swap(int* m, int* n) { int temp = *m; *m = *n; *n = temp; } void Swap(int& m, int& n) {...int temp = m; m = n; n = temp; } int main() { int a = 10; int b = 20; //地址交换 Swap(&a, &b);...; printf("%d\n", ret); return 0; } 为什么不是所有的函数定义成内联函数

80130

C++从入门到精通——引用(&)

在main函数变量x传递给increment函数后,x值被递增为11。因为参数是引用类型,所以对i修改会直接影响到x。...在main函数变量x传递给print函数后,print函数无法修改x值。这样做可以确保函数不会意外地修改传递给参数。...表达式计算:在进行表达式计算时,如果表达式包含临时变量创建和销毁,编译器会在需要地方生成临时变量。 函数调用:当调用函数时,会将实参传递给形参。...做返回值 int& Count() { static int n = 0; n++; // ... return n; } 下面代码输出什么结果?为什么?...五、值、引用效率比较 以值作为参数或者返回值类型,在参和返回期间,函数不会直接传递实参或者变量本身直接返回,而是传递实参或者返回变量一份临时拷贝,因此用值作为参数或者返回值类型,效率是非常低下

8810

C语言:函数

test(1,2,3); } 虽然最后运行结果还是一样,但是void会明确告诉编译器这个函数不需要参,所以如果你在调用参数,就会有警告 3、函数参数可以有0个,也可以有多个,这个根据实际需要来确定...为什么有的函数在调用时明明不需要参,却还要写括号??因为( )本质上就是一个函数调用操作符!!!..."%d\n", r); return 0; } 调用Add函数参数a和b我们叫做实参,实参就是真实传递给函数参数 定义Add函数x和y就是形参,为什么叫做形参呢?...&b); //调⽤加法函数,完成a和b相加 //求和结果放在r int r = Add(a, b); //输出 printf("%d\n", r); return 0; } 2、return...八、链式访问 所谓链式访问就是⼀个函数返回值作为另外⼀个函数参数,像链条⼀样函数串起来就是函数链式访问。

11910

初识c语言函数

以sqrt()函数为例,他给我们介绍了这个函数参数及返回类型,也给我们举了例子,可以说是相当完善了。 自定义函数 函数形参和实参 实际参数就是真实传递给函数参数。...链式访问 所谓链式访问就是⼀个函数返回值作为另外⼀个函数参数,像链条⼀样函数串起来就是函数链式访问。...直接上代码: int main() { printf("%d\n",strlen("abcdef"));//链式访问 return 0; } 此处我们就直接strlen()函数返回值作为函数参数给了...多个文件 如果代码量较大时,不会将所有的代码都放在⼀个文件,我们往往会根据程序功能,代码拆分放在多个文件。...y); test.c int main() { int a=10, b=20; //函数调用 int ret=Add(a,b); printf("和为%d\n",ret

8510

【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

函数参数值调用和址调用 (1) 值调用 和 址调用 值调用 : 以方式参数递给函数, 不能直接修改主函数变量值, 仅仅是副本传递给函数; 址调用 : 变量指针 传递给函数..._1 函数 a = %d, b = %d \n", a, b); } void swap_2(int *a, int *b) { int temp; temp =...a = 5, b = 10 执行 swap_2 函数, a = 5, b = 10 示例解析 :  -- 值调用 : swap_1 是值调用, 传入是 main 函数 a b 两个变量副本..., 因此函数执行完毕后, 主函数值是不变; -- 址调用 : swap_2 是址调用, 传入是 a , b 两个变量地址 &a, &b, 当在swap_2 中进行修改时候, 主函数...; a = p 和 a++ 会报错; 数组参数 :  -- 形参指针 : 数组作为参数递给函数时候, 传递是数组首地址, 传递地址, 形参是指针; 数组参数示例 :  -- 函数参数是数组

3.9K20

C++ 多态实现机制

是否可以做一些邪恶事情呢 ?手动 b vptr 赋值给 a 会怎样? 千万不要在实际写代码这样做!...很自然想法是函数指针Fun 声明为 typedef void(*Fun)(Animal*);, 然后通过参将 “this 指针” (实际上是指向对象指针) 传给函数, 以期待函数这个参数像 this...__thiscall , this 指针存入 ECX 寄存器, 而通过方式 __cdecl 是参数压入栈, 因此, 此处出问题是成员函数 Dog::eat() 想从 ECX 寄存器得到...至于为什么前几个看似工作正常, 是由于函数执行期间恰好将 a 值 move 进了 ECX 寄存器....可以看一下相应汇编代码 image.png 在 Visual Studio x86 编译下出现这种情况是可以复现, g++ 编译却没有出现过.

66440

一门号称比Python快68000倍新型AI编程语言

官方还从其他语言(如 Rust、Swift、Julia、Zig、Nim 等)以及以前开发人员迁移到新编译器和语言经验获益,并利用现有的 MLIR 编译器生态系统。...= 1 var b = 2 print(a + b) do_math()AI助手 函数参数和返回值 函数参数和返回值需要有显示类型标识,以下是带 Int 类型参数和返回 Int...类型值例子: fn add(x: Int, y: Int) -> Int: return x + y z = add(1, 2) print(z)AI助手 函数参数可变性默认为不可变引用...x + yAI助手 如果希望参数可变,并且变动同步到函数外,类似于 c++引用参,可以用 inout 来修饰,示例代码如下: fn add_inout(inout x: Int, inout...(a) print(b) print(c)AI助手 输出为: 2 3 5AI助手 如果希望在函数内改变参,并且不影响函数外部变量,可以用 owned 来修饰,代码示例如下: fn set_fire

38440

C语言——I 深入理解指针(一)

, b);//值调用 printf("交换后:a=%d b=%d\n", a, b); return 0; } 我们发现其实没产⽣交换效果,这是为什么呢?...我们发现在main函数内部,创建了a和b,a地址是0x00cffdd0,b地址是0x00cffdc4,在调⽤Swap1函数时,a和b递给了Swap1函数,在Swap1函数内部创建了形参x和y接收...我们现在要解决就是当调⽤Swap函数时候,Swap函数内部操作就是main函数a和b,直接a和b值交换了。...那么就可以使⽤指针了,在main函数中将a和b地址传递给Swap函数,Swap函数⾥边通过地址间接操作main函数a和b,并达到交换效果就好了。...(&a, &b);//址调用 printf("交换后:a=%d b=%d\n", a, b); return 0; } 我们可以看到实现成Swap2⽅式,顺利完成了任务,这⾥调⽤Swap2函数时候是变量地址传递给函数

9810

【C】程序环境和预处理

而代码1为函数参,是先将a、b传给x、y,再将返回值传回来。...(x):(y)) int main() { int a = 10; int b = 20; //函数方式 int m1 = Max(a, b); printf("m1 = %d\n",...m1); //宏方式 int m2 = MAX(a, b); printf("m2 = %d\n", m2); return 0; } 我们发现用函数也可以实现,但为什么建议用宏来实现呢?...函数参数只在函数调用时候求值一次,它结果值传递给函数。表达式求值结果更容易预测。 带有副作用参数 参数可能被替换到宏体多个位置,所以带有副作用参数求值可能会产生不可预料结果。...函数参数只在时候求值一次,结果更容易控制。 参数类型 宏参数与类型无关,只要对参数操作是合法,它就可以使用于任何参数类型。

16230

C++函数

; b = temp; } 值得一提是,函数原型参数名其实可以不用写,因为只有参数类型和数量才是函数标志,毕竟都只是个带好罢了。...,这也是为了调用时方便参数设置,因为在调用时你要写参数,不可能参数空一个不写,而写完了你要设置,剩下就都是右边默认了: int func1 (int n, int m = 4, int j =...5); // 有效 int func2 (int n, int m = 6, int j); // 无效 // 不允许这样调用: func(1, , 2);// 无效 函数重载 c++允许有多个同名函数...(int a, int b); void swap (double a, double b); void swap (int a, int b, int n = 5); 但是只有参数类型和数量才是函数特征标...编译器到底用哪个函数版本? 上面说了这么多种函数,可能在函数原型部分我有一大堆同名但是各个细节部分不同函数原型,当在代码调用时候到底编译器怎么判断用哪个呢?换言之也就是这些调用是怎么排序呢?

31410

【C++】构造函数初始化列表 ① ( 类对象作为成员变量时构造函数问题 | 构造函数初始化列表语法规则 )

; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 在一个类 , 其成员变量是 带有参构造函数 类型 , 这种情况下没有调用 有参构造函数机会 , 此时就会出现 编译报错情况 ; 在下面的代码..._Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(22): message : 编译器已在此处生成“B::B” 1>D:\002_Project\...006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(22,1): message : “B::B(void)”: 由于 数据成员“B::m_a...”不具备相应 默认构造函数 或重载解决不明确,因此已隐式删除函数 1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp...初始化列表元素由 成员变量名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码 , 为 B 类定义了默认构造函数 , 其中定义了 构造函数 初始化列表 ; 在 初始化列表 , m_age

54430

【C++】泛型编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体类型参数列表 | 继承 类模板 必须重写构造函数 )

子类 : // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 类型参数列表 , 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小...具体类 构造函数 // 否则会报错 Son(int a = 10, int b = 20) : Father(a) { this->b = b;...类型参数列表 数据类型 ; 此时 , 在继承时 , 被继承 类模板 必须 声明 类型参数列表 , 具体泛型类型写在尖括号 , C++ 编译器需要知道 具体 数据类型 是什么 , 才能生成...类型参数列表 , 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存 class Son : public Father...类型参数列表 , 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存 class Son : public Father

76530

【C++】C++入门必备知识详细讲解

先看看缺省参数使用: 在上面的使用,Add 函数就是用了缺省参数,在 Add 函数定义,它指定了 a = 100,b = 200,意思就是,当调用 Add 函数时,如果没有参数进来,就使用它自己定义变量...以上这段代码输出结果就是 510 ,那么例如 int ret = Add(a,,c); 这种参是不允许。...那么我们可以给缺省参数分类,像上面代码,Add()这种什么都不就叫做全缺省参数;像Add(a)或者Add(a,b)这种只一部分就叫做半缺省参数。...(3.14, 3); return 0; } 运行结果如下: 以上代码,我们在函数打印数据,是为了说明编译器调用了这个函数;我们定义了两个同名函数,但是它们参数类型不一样...n 别名,我们看执行结果: 第二次执行是随机值,为什么呢?

10710

c语言基础知识帮助理解(详解函数

在main()函数,我们声明了两个整数变量x和y,并将它们作为实际参数递给printSum()函数。在printSum()函数内部,形式参数a和b接收到相应值,并计算它们和。...最后,在函数打印出结果 需要注意是:形参实例化之后其实相当于实参一份临时拷贝,想要改变参数值,单单传值操作是不行哦,我们要进行址操作(后面讲) 5.函数调用 5.1值调用 值调用是指在函数调用时...,实际参数值复制给形式参数,二者地址是不同,即函数形参和实参分别占有不同内存块,对形参修改不会影响实参 5.2址调用 (传递地址) 址调用是把函数外部创建变量内存地址传递给函数参数一种调用函数方式...通过函数嵌套调用,可以复杂问题分解成更小子问题,并通过调用不同函数来解决这些子问题 int multiply(int a, int b) { return a * b; } int...在main()函数,我们声明了两个整数变量x和y,并将它们作为实际参数递给add()函数。add()函数返回x + y结果,然后这个结果作为实际参数递给multiply()函数

10610
领券