使用数组传参
总的来说:
传数组要将数组大小一起传,
传数组首元素(也就是数组指针)的引用也很好用,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