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

11 篇文章 0 订阅

使用数组传参

总的来说:
传数组要将数组大小一起传,
传数组首元素(也就是数组指针)的引用也很好用,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是20
	char str[3] = "ab";//后面有\0所以不能再放字符了,如果是"abc"就会报错,sizeof是3,strlen是2
	change1(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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值