C++/C补充知识点,数组,数组传参,二维数组传参打印三种发方法,正则表达式
使用数组传参
总的来说:
传数组要将数组大小一起传,
传数组首元素(也就是数组指针)的引用也很好用,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补充知识点,数组,数组传参,二维数组传参打印三种发方法,正则表达式相关推荐
- C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇
序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...
- c语言二维数组作用,C语言二维数组知识点介绍
C语言二维数组知识点介绍 数组可以看作是一行连续的数据,只有一个下标,称为一维数组.在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以确定它在数组中的位置.本 ...
- C 二维数组,以及自定义二维数组
C 二维数组,以及自定义二维数组 我们通常情况下是这样定义一个二维数组的: int a[10][15]; 我们分别查看一下a,a[0],*a 都是一样的值吧 我们可以这么理解: a是一个数组的数组 a ...
- 【C语言数组】一、二维数组冒泡排序
目录 1. 一维数组的创建和初始化 1.1 一维数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化 2.1 二维数组的创建 2.2 ...
- c语言二维数组 ppt,C语言二维数组与指针.ppt
C语言二维数组与指针.ppt 好好考,全国计算机等级考试 二级C语言,第12讲 二维数组与指针,二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 ...
- Java二维数组详解:二维数组的声明和初始化,以及获取二维数组的值
为了方便组织各种信息,计算机常将信息以表的形式进行组织,然后再以行和列的形式呈现出来.二维数组的结构决定了其能非常方便地表示计算机中的表,以第一个下标表示元素所在的行,第二个下标表示元素所在的列.下面 ...
- java二维数组扫雷,C语言二维数组实现扫雷游戏
#include //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', '+','+','+','+' ...
- php 二位数组去掉重复,PHP 二维数组去掉重复值并保持原结构
PHP 二维数组去掉重复值并保持原结构 直接上代码,解释很详细 //二维数组去掉重复值 function arrunique($a){ foreach($a[0] as $k => $v){ / ...
- 减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
文章目录 基本介绍 应用实例 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: ①记录数组一共有几行几列,有多少个不同的值(0除外) ...
- java 二维数组位置_java 找到二维数组指定元素的位置
这个是代码编译时没有问题运行出错.主要功能是首先将txt格式文本导入二维数组,然后在二维数组中查找指定元素的行号和列号.运行结果出错显示为:importjava.util.*;importjava.i ...
最新文章
- CLion 2017 注册码
- [转]PHP用mysql数据库存储session
- asp.net mvc 页面传值的方法总结
- Some projects cannot be imported because they already exist in the workspace
- USACO 1.5.4 Checker Challenge
- java 日历工具_java中强大的时间处理工具:Calendar类(日历类)
- 牛客网软件测试机考题库,为什么编程题本地测试通过,可是提交时却总报错。求大神们指点。...
- Python个 flask 教程地址 做个记录方便以后学习用
- 【手势识别】基于matlab GUI肤色手势识别【含Matlab源码 716期】
- python层次聚类选择类别_什么是聚类分析?聚类分析方法的类别
- 如何使用matlab进行音频信号处理+代码编译中会遇到的问题+matlab安装包
- Android原生人脸识别Camera2示例
- 原来javaeye变成iteye了
- 5s管理清洁活动如何推行?
- 如何用一根网线连接两台电脑,传输大文件
- 原生的APP、小程序(微信小程序、支付宝小程序、头条小程序、百度小程序.等等)、H5 的优势与劣势分析有那些?
- 【FreeSwitch开发实践】freeswitch配置wss证书问题 Encrypted Alert/Certification Unknown
- Phalcon框架的入门使用,Phalcon框架学习,编写简单的视图输出及数据库写入!
- 学校计算机报损报废申请表,学校财产登记报损上报制度
- 计算机通信与网络安全国际会议,第一届计算机通信与网络安全国际学术会议(CCNS2020)...