使用数组传参

总的来说:
传数组要将数组大小一起传,
传数组首元素(也就是数组指针)的引用也很好用,void change3(int (&arry)[6]);注意(int & arry[])会报错
传指针也可以
小结:以上三种传参方式都支持操作指针和下标引用[]。
如果要获取数组的大小可以使用如下方法:

  • 想要在函数内获取数组大小,利用模板传引用,在int length=sizeof(arr)/sizeof(arr[0]);
  • 想要获取字符指针指向的字符串或字符数组的长度,使用strlen

1,这个方法我觉得太麻烦,所以也不想多说,就是用循环读取指针的值是否为NULL.这个想法只是理论上的,我想应该可以能实现,但是会写很多代码,所以我也就不实验了.

2,第二种很简单,就是在传递前先获取到数组的长度,然后把它作为参数传递进去就可以了.

3,后来通过搜索还了解到一个方法,这个是C++才能用的,就是利用定义一个模板就可以把数组引入到自定义函数中,这样就是在自定义函数中也可以获取得到数组的长度了.其实和第2种方法的代码量差不多,只是多了一个模板应用的知识点.

#include<iostream>
#include<iostream>using namespace std;void change1(int arry[])//1.传数组,就是传指针
{*(arry) = 7;arry[1] = 8;sizeof(arry);//结果是4,不允许sizeof(arry[]),sizeof(str[])也是不允许的
}
void change2(int * arry)
{arry[2] = 9;*(arry + 3) = 10;
}
void change3(int (&arry)[6])//这里的大小5必须与传进来的数组大小一样大,这也太难受了吧,不建议用
{*(arry+   4)= 11;//arry[4]= 7;会报错arry[5] = 12;
}
template <class T>
int GetLength(T& arry)//想要获取函数内获取大小,就要传引用
{int length = sizeof(arry) / sizeof(arry[0]);return length;
}
int main()
{int arr[6] = { 1, 2, 3,4 ,5,6};//sizeof是20char str[3] = "ab";//后面有\0所以不能再放字符了,如果是"abc"就会报错,sizeof是3,strlen是2change1(arr);cout << arr[0] << endl;//输出7,传数组其实是传指针,也可以修改数组的元素cout << arr[1] << endl;//输出8,传数组其实是传指针,也可以修改数组的元素change2(arr);cout << arr[2] << endl;//输出9,传指针可以修改数组的元素,也是支持下标访问的cout << arr[3] << endl;//输出10,传指针操作指针也可以改变元素change3(arr);cout << arr[4] << endl;//输出11,传引用操作指针也可以改变元素cout << arr[5] << endl;//输出12,传引用操作指针也可以改变元素system("pause");
}

char* arr与char*arr[]

两者作为参数时没有区别

如:void foo(char a[10]);
同:void foo(char *a);
基本没有任何区别,在两者中,a都是指针,甚至第一种形式中给定大小10都没有任何意义。
或者说:void foo(char a[10]);
同:void foo(char * const a);

但是其他地方

char a[]; //表示定义一个数组;
char *a=“123”; //表示定义一个指针,且指向常量区,不能通过*a修改"123"的值,默认是有const属性的;
一般情况下,通过[]定义数组都需要给定数组的大小
比如:char a[10];
如果我们已经给数组初始化,那么可以不指定大小,比如:char a[]=“Hello,world!”;
此外,还有一种情况,是在一个文件中引用另外一个文件中的数组申明,也可以不给大小,如:extern char a[];

二维数组传参

方式一形参为二维数组
声明

void function(int a[m][n]);//函数声明
void function(int a[][n]);//不论多少维数组,第一维都可省略。
//凭什么,第二维就不可省略呢?由编译器的寻址方式决定。

调用

function(a);//函数调用  实参直接写数组名!数组名!(重点)。
//(注意)function(a[m][n])或function(a[][n])都不可以!
//话说,写数组名多好,简单轻松。

在函数操控元素

1.   *(a[i] + j)  //代表第 i 行 第 j 列
2.  *(*(a+i) + j) //同上
3. *((int *)a +i*n +j )//同上,n表示第二维数组长度,即列宽
//要把数组形式写成指针形式如*((int*)array + n*i + j);
//直接写char array[i][j]会导致错误,编译可以通过,在VC编译器中执行会出现异常

方式二形参为数组指针(指向数组的指针)
(只是 声明定义 与第一种不同,其他一样)
声明

void function(int (*a)[n]);
//不是(int *a[n])(指针数组) ,而是(int (*a)[n])(数组指针);
// 缘由是 [] 的 优先级比 *的大

调用

function(a);//函数调用  实参同样直接写数组名!//(注意)function(a[m][n])或function(a[][n])同样都不可以!

在函数操控元素

1.   *(a[i] + j)  //代表第 i 行 第 j 列
2.  *(*(a+i) + j) //同上
3. *((int *)a +i*n +j )//同上,n表示第二维数组长度,即列宽//a[i][j]不被允许。由编译器的寻址方式决定。

方式三二级指针传参
声明

void function(int **a,int n);    n表示第二维数组长度,即列宽

调用

function( (int **)a,int n);      实参不能为数组名!*与上面相反*!有两个 * !//(注意)function(a)或function((int *)a)不可以!

在函数操控元素

 *((int *)a +i*n +j )      只有一种!n表示第二维数组长度,即列宽
//其他不被允许。由编译器的寻址方式决定。

详见https://blog.csdn.net/qq_43868654/article/details/84641383

键入二维数组

char ** aa;
int n;
cin>>n;
aa = new char *[n];
for ( int i=0;i <n;i++ )
aa[i] = new char [n];

示例如下:

  • 小结,二维数组作为参数传递时,需要跟传有多少列
#include<iostream>using namespace std;void print_array1(int arr[][3], int n)
{for (int i = 0; i < n; ++i){for (int j = 0; j < n; ++j){cout << *((int *)arr + i*n + j) << " ";}cout << "\n";}cout << endl;
}void print_array2(int(*arr)[3],  int n)
{for (int i = 0; i < n; ++i){for (int j = 0; j < n; ++j){cout << *((int *)arr + i*n + j) << " ";}cout << "\n";}cout << endl;
}void print_array3(int **arr, int n)
{for (int i = 0; i < n; ++i){for (int j = 0; j < n; ++j){cout << *((int *)arr + i*n + j) << " ";}cout << "\n";}cout << endl;
}
int main()
{int arr[][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };cout << "二维数组传参:" << endl;print_array1(arr, 3);cout << "数组指针传参:" << endl;print_array2(arr, 3);cout << "二级指针传参:" << endl;print_array3((int**)arr, 3);system("pause");return 0;
}

正则表达式

带有特殊符号的字符串,特殊符号描述了字符串的特征(哪些字符开头/结束,包含哪些字符,某个字符出现几次…),帮助我们进行快速的筛选。

\d 匹配一个阿拉伯数字
\d+ 多个加号表示前面的数字可以重复出现

求字符串长度

int main()
{char *arr = new char[];char arr1[] = { "abcde" };gets(arr);int n = (strlen(arr));//既可以求字符串数组,也可以用来求字符串指针int x = sizeof(arr1) / sizeof(arr[0]);//这种方法只适用于字符串数组,不适用于字符串指针,如果对象是字符串指针则结果是4(32位系统)cout << n << endl;cout << x << endl;system("pause");return 0;
}
  • 数组的传参参考以下两篇

https://www.cnblogs.com/ike_li/p/7339011.html

https://www.cnblogs.com/flowingwind/p/8446360.html

C++/C补充知识点,数组,数组传参,二维数组传参打印三种发方法,正则表达式相关推荐

  1. C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇

    序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...

  2. c语言二维数组作用,C语言二维数组知识点介绍

    C语言二维数组知识点介绍 数组可以看作是一行连续的数据,只有一个下标,称为一维数组.在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以确定它在数组中的位置.本 ...

  3. C 二维数组,以及自定义二维数组

    C 二维数组,以及自定义二维数组 我们通常情况下是这样定义一个二维数组的: int a[10][15]; 我们分别查看一下a,a[0],*a 都是一样的值吧 我们可以这么理解: a是一个数组的数组 a ...

  4. 【C语言数组】一、二维数组冒泡排序

    目录 1. 一维数组的创建和初始化 1.1 一维数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 ...

  5. c语言二维数组 ppt,C语言二维数组与指针.ppt

    C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...

  6. Java二维数组详解:二维数组的声明和初始化,以及获取二维数组的值

    为了方便组织各种信息,计算机常将信息以表的形式进行组织,然后再以行和列的形式呈现出来.二维数组的结构决定了其能非常方便地表示计算机中的表,以第一个下标表示元素所在的行,第二个下标表示元素所在的列.下面 ...

  7. java二维数组扫雷,C语言二维数组实现扫雷游戏

    #include //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', '+','+','+','+' ...

  8. php 二位数组去掉重复,PHP 二维数组去掉重复值并保持原结构

    PHP 二维数组去掉重复值并保持原结构 直接上代码,解释很详细 //二维数组去掉重复值 function arrunique($a){ foreach($a[0] as $k => $v){ / ...

  9. 减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现

    文章目录 基本介绍 应用实例 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: ①记录数组一共有几行几列,有多少个不同的值(0除外) ...

  10. java 二维数组位置_java 找到二维数组指定元素的位置

    这个是代码编译时没有问题运行出错.主要功能是首先将txt格式文本导入二维数组,然后在二维数组中查找指定元素的行号和列号.运行结果出错显示为:importjava.util.*;importjava.i ...

最新文章

  1. CLion 2017 注册码
  2. [转]PHP用mysql数据库存储session
  3. asp.net mvc 页面传值的方法总结
  4. Some projects cannot be imported because they already exist in the workspace
  5. USACO 1.5.4 Checker Challenge
  6. java 日历工具_java中强大的时间处理工具:Calendar类(日历类)
  7. 牛客网软件测试机考题库,为什么编程题本地测试通过,可是提交时却总报错。求大神们指点。...
  8. Python个 flask 教程地址 做个记录方便以后学习用
  9. 【手势识别】基于matlab GUI肤色手势识别【含Matlab源码 716期】
  10. python层次聚类选择类别_什么是聚类分析?聚类分析方法的类别
  11. 如何使用matlab进行音频信号处理+代码编译中会遇到的问题+matlab安装包
  12. Android原生人脸识别Camera2示例
  13. 原来javaeye变成iteye了
  14. 5s管理清洁活动如何推行?
  15. 如何用一根网线连接两台电脑,传输大文件
  16. 原生的APP、小程序(微信小程序、支付宝小程序、头条小程序、百度小程序.等等)、H5 的优势与劣势分析有那些?
  17. 【FreeSwitch开发实践】freeswitch配置wss证书问题 Encrypted Alert/Certification Unknown
  18. Phalcon框架的入门使用,Phalcon框架学习,编写简单的视图输出及数据库写入!
  19. 学校计算机报损报废申请表,学校财产登记报损上报制度
  20. 计算机通信与网络安全国际会议,第一届计算机通信与网络安全国际学术会议(CCNS2020)...

热门文章

  1. 计算机类毕业设计评语导师评语,毕业设计指导老师评语
  2. Win11系统svchost.exe一直在下载怎么办?
  3. 一元稀疏多项式计算器
  4. 经历了6面,终于入职蚂蚁金服
  5. 硬盘出现“文件或目录损坏且无法读取”的故障,怎么解决?
  6. MacOS 连接网络打印机后一直不能打印
  7. 网易校招测试岗位2018
  8. 网页磁贴模板_文本磁贴(登录)模板 (HTML)
  9. oracle cube,oracle rollup和cube分析
  10. python计算直角三角形斜边上的中线_怎么证明直角三角形斜边上的中线