-
2021-03-31 14:10:16
int fun(int a[3][2]) { } int main() { fun(a); }
更多相关内容 -
C++使用引用的方法向函数传递数组,避免因传入函数而导致退化为指针,正确在函数中计算数组的大小。
2022-03-17 18:47:50我们知道,当我们将数组作为参数传递为一个函数后,数组会退化为指针。这样就导致我们无法正确在函数中计算数组的大小。 #include<iostream> using namespace std; int func(int* arr) { return sizeof(arr);...1.问题
我们知道,当我们将数组作为参数传递为一个函数后,数组会退化为指针。这样就导致我们无法正确在函数中计算数组的大小。
#include<iostream> using namespace std; int func(int* arr) { return sizeof(arr); } int main() { int Arr[] = { 2,4,3,1,73,0 }; cout << func(Arr) << endl; system("pause"); return 0; }
输出的结果是 4 ,因为这里计算的是一个指针的大小。
解决这个问题的方法通过控制函数中形参的数据类型,使得数组使用引用的方法传递给函数的形参。
原理
编译器是允许数组使用引用的方法传递给函数形参的。
提供的底层语法就是:数据类型(&新数组名)[数组的大小] = 原数组名;
例如:
int Arr[] = { 2,4,3,1,73,0 }; int(&arr)[6] = Arr;
因此我们可以根据此原理来用不同方法解决这个问题。
方法1——用基本语法
我们将
数据类型(&新数组名)[数组的大小]
作为函数形参即可#include<iostream> using namespace std; int func(int(&arr)[6]) { return sizeof(arr); } int main() { int Arr[] = { 2,4,3,1,73,0 }; cout << func(Arr) << endl; system("pause"); return 0; }
输出的结果是 24 。
这种方法好处在使为程序更加安全,因为传入的数据如果不是我们想要的大小,就会禁止传入,从而报错。
坏处更加明显了,我们需要提前知道所使用数组的大小,并且对于不同的数组,需要有不同的函数实现,使得重复代码增加很多。方法2——用函数模板
因为函数模板可以自动推断出传入函数参数的数据类型,所以我们可以通过使用函数模板更加便捷地解决这个问题。
#include<iostream> using namespace std; template<class T> int func(T& arr) { return sizeof(arr); } int main() { int Arr[] = { 2,4,3,1,73,0 }; cout << func(Arr) << endl; system("pause"); return 0; }
输出的结果是 24。
这样就成功解决了我们的问题,并且无论传入的数据是字符数组或者整型数组或者浮点型数组,都可以自动实现传入数组的引用。后话
因为
auto
也可以自动推断数据类型,所以也是一种解决问题的方法,但是因为auto
不能用在函数的参数列表中,所以如果不作为函数参数传递时,使用auto
也是一种很好的方法。
语法:int Arr[] = { 2,4,3,1,73,0 }; auto& arr = Arr;
#include<iostream> using namespace std; int main() { int Arr[] = { 2,4,3,1,73,0 }; auto& arr = Arr; cout << sizeof(arr) << endl; system("pause"); return 0; }
输出的结果也是 24。
-
在函数中引用外部数组元素
2020-10-29 21:42:51通过数组名引用数组 函数声明:void fun(int arr[],int n); 函数调用:int a[10]={3,7,9,11,0,6,7,5,4,2}; fun(a,10); 示例代码 #include <stdio.h> void fun(int arr[], int n) { int i = 0; for(i=0; i...通过数组名引用数组
函数声明:void fun(int arr[],int n); 函数调用:int a[10]={3,7,9,11,0,6,7,5,4,2}; fun(a,10);
示例代码
#include <stdio.h> void fun(int arr[], int n) { int i = 0; for(i=0; i<n; i++) { printf("%d ", arr[i]); } printf("\n"); } int main(int argc, const char** argv) { int a[5] = {1, 2, 3, 4, 5}; fun(a, 5); return 0; }
编译及运行结果
通过指针引用数组
函数声明:void fun(int arr[],int n); 函数调用:int a[10]={3,7,9,11,0,6,7,5,4,2}; fun(a,10);
示例代码
#include <stdio.h> void fun(int* arr, int n) { int i = 0; for(i=0; i<n; i++) { printf("%d ", arr[i]); } printf("\n"); } int main(int argc, const char** argv) { int a[5] = {1, 2, 3, 4, 5}; fun(a, 5); return 0; }
编译及运行结果
-
C++传参之引用数组
2021-11-02 10:19:42原帖见作者的个人博客:C++传参之引用数组 (wanyingjian.cn) 在C++中,有时候我们需要将数组作为参数传递到函数里去,常规的做法是: void fun(int* a) { cout << sizeof(a); //这里会输出4,即a这个指针...原帖见作者的个人博客:C++传参之引用数组 (wanyingjian.cn)
在C++中,有时候我们需要将数组作为参数传递到函数里去,常规的做法是:
void fun(int* a) { cout << sizeof(a); //这里会输出4,即a这个指针的大小 //接着对数组进行操作 }
但是这种做法丢失了一部分信息,有没有更加符合“语法”的写法呢?答案是有的:
void fun2(int* (&a)[100]) { cout << sizeof(a); //这里会输出400,即a数组的大小 //接着对数组进行操作 }
当要想限定传入数组的大小时,可以用上述的写法,其意思为“对数组a的引用”。同时应当注意,这种写法可以安全的使用sizeof()函数,当传入的数组大小不对时,编译器将会报错。
-
C++ 用引用的方式向函数传递数组
2020-08-25 08:09:06#include <iostream> using namespace std; int a[10] = { 10,20 }; void GetCharArr(char (&ac)[20]) { sprintf_s(ac, "ABABXX%d", a[0]); } int main() { char str1[20];... system("... -
引用数组进行运算时用INDIRECT函数巧妙转换文本表达式
2019-12-30 15:35:32进行数组运算时,先用文本形式表达出数组,再用INDIRECT函数返回由文本字符串指定的引用(即数组)。 紫色框内的函数公式分别为: '=SUM(INDIRECT("B"&$L333&":"&"B"&$M333)) '=SUM... -
数组引用做函数的形参
2021-01-06 20:15:50今天码代码发现数组引用做函数形参总是报错, 想着,数组名字不就是数组的首地址,那应该用指针做形参,加上引用的话,就应该的指针引用嘛。 int set_print(int* &t){ 结果凉凉 那逼急了用auto int set_... -
C++:引用(数组引用)
2021-11-26 10:27:09C++:引用(数组引用) 在C++里,数组引用如下: //第一种方法(常用) //1,定义数组类型 typedef int(my_arr)[5]; typedef int my_arr1[5]; //2,建立引用 my_arr1& arref = arr;//建立引用,相当于int &... -
函数通过引用传递数组(修改原数组)
2018-06-11 19:44:13//http://pppboy.blog.163.com/blog/static/3020379620138132495934/一、大概区别就...)array[] array是个数组,其中的元素是引用//应该叫:引用的数组int &array[]//array首先和&结合,所以array是... -
C语言理解篇:关于自定义函数如何引用main函数中的数组的理解
2021-08-10 10:05:11题目:在main函数中定义一个数组并为其赋值,然后自定义一个函数order(),使得main函数中的数组能够在order函数中引用并输出。 源代码: #include <stdio.h> #include <string.h> void order(char* str... -
c函数传递数组
2019-07-27 09:38:23如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为... -
函数调用(数组作为参数)
2019-12-09 20:24:47//调用max1函数 return 0 ; } void max1 ( double b [ 10 ] ) //形参 { double max = b [ 0 ] ; int j = 0 , n ; //这里是将b[0]提前拿出来,要不第一个无法比较。 for ( n = 1 ; n 9 ... -
C++数组的引用和引用的数组
2018-10-30 15:53:27转载:关于数组的引用和引用的数组 一、大概区别 就像指针的数组和数组的指针一样耐人寻味 //array首先向右结合,所以这个相当于 (int&)array[] array是个数组,其中的元素是引用 //应该叫:引用的数组 ... -
QT信号槽函数 形参 数组的引用
2020-12-14 12:01:54结论:QT信号槽函数形参不支持数组的引用 实际代码 //filename:abc.h void sig_add_line(int number, const char (&line)[SIZE]); moc编译后生成的函数 //filename:moc_abc.cpp void RC::sig_add_line(int _t1,... -
C语言中数组作为函数的参数以及返回值的使用简单入门
2021-01-01 01:11:31函数通过数组作为参数 如果想通过一个一维数组作为函数的参数,就必须声明函数形式参数,使用以下三种方式与所有三个声明方法之一产生类似的结果,因为每一种方式告诉编译器,一个整数指针将会要被接收。类似的方式... -
【恼人】——函数指针 函数指针数组 指向函数指针数组的指针
2018-04-21 00:12:34我们已经学过C语言很长一段时间了,相信大家对于这个问题还不是特别的陌生,今天我们就来再次的认识这些令我们头痛的函数的一些基本的区别。 函数指针 函数指针:函数指针是指向可执行代码段或调用可执行代码段... -
将数组作为函数参数调用
2021-10-15 14:40:41数组作为参数在函数中被调用的写法 -
整理的关于向函数传递数组的几种方法
2021-01-30 18:33:05整理的关于向函数传递数组的几种方法 向函数传递数组,一般遵循的就是传递一个地址,最熟悉的就是通过指针的操作来进行,不过,在练习的过程中,可以慢慢发现有其他许多方法,我们可以根据不同情况或者个人喜好来... -
数组的引用
2019-05-29 09:30:06引用的数组是不能当函数的参数的。 数组作为函数形参传递时,实际上是传递了数组首元素指针的一个副本,因为不能用一个数组初始化另外一个数组,所以数组作为形参时,函数是不知道这个数组的元素个数,只知道数组... -
C++引用&函数传递数组例子
2018-04-30 09:56:44#include <iostream>using namespace std;/*排序*/void xll(int (&...//排序函数int main(){ int a[5] = {1,8,5,6,3}; xll(a); return 0;}void xll(int (&ac)[5]){ int c; for(int i = ... -
调用函数返回数组
2020-07-19 16:12:51调用函数返回数组 1、传递函数 #include<stdio.h> #define maxn 4 void rink(int a[maxn]) { for(int i=0;i<maxn;i++) a[i]=a[i]+1; } int main() { int num[maxn]={4,6,7,8} rink(num); for(int i=0... -
函数对于数组的更改操作
2020-09-01 09:53:48int *TestCode(int ...这样在主函数内通过返回值可以对frame数组起到修改的作用 int *TestCode(int frame[]) { for (int i = 0; i < 200; i++) { frame[i] = i; test[i]=frame[i]; } return test; } 这 -
C++函数指针数组的使用方法
2015-11-24 20:30:49什么情况下,想到将函数指针数组来的呢?是由于近期写的一个程序中,有一系列顺序化的函数,且这些函数的形式基本一致,需要对每一步的执行结果进行判断,是否执行成功,若执行成功,则继续执行下一函数,如果执行... -
c语言函数传递数组_c语言函数数组地址传递没有输出
2021-05-21 13:44:19数组参数属于指针参数,指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径.如果把数组当作参数, 不管愿意与否, 它就是指针, 指向第一个值的指针.1. 数组参数就是指向第一个元素的... -
C/C++ | 函数返回数组指针
2020-03-05 00:01:53不过, 函数可以返回数组的指针或引用. 声明一个返回数组指针的函数 Type (*function(parameter_list))[dimension] int (*func(int i))[10]; func(int i) 表示调用 func 函数时需要一个 int 类型的实参. (*func... -
C++函数数组
2019-01-25 14:21:03在日常编码过程中,我们经常使用到数组,以C++的基本数据类型作为存储对象,而在某些特殊的情况下,我们需要使用到函数数组或函数指针(譬如回调函数),其实质为一个指针数组,数组内存储着各个函数的指针地址,在... -
C语言数组作为函数参数
2019-02-24 20:24:59一:数组元素作为函数的实参 数组元素就是变量,与普通变量没有区别,将数组元素传送给形参,实现单向的值传递。 #include <stdio.h> float max(float x,float y){ if(x > y) return x; ... -
指针在函数传递数组时的运用
2019-04-25 16:31:15如果希望在函数内部操作数组,必须传递数组指针 此代码表示了数组在函数间传递的方法,通过在子函数内修改数组数值,更明显表示了传入的是数组地址 #include <stdio.h> int max(int *intArr, int l)//int... -
C语言函数如何返回数组
2021-08-21 16:06:05动态内存分配与动态数组2.1 动态内存分配2.2 动态数组2.3 内存与堆与栈二、自定义函数返回数组1.常见错误2.返回数组的函数三. 总结四. 参考 提示:以下是本篇文章正文内容,下面案例可供参考 一、静态数组和动态... -
通过指针引用数组(包含多种例子,清晰易懂)
2020-03-05 23:58:47②在引用数组元素时指针的运算 ③通过指针引用数组元素 ④用数组名作函数参数 ⑤通过指针引用多维数组 ①数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址 指针变量可以...