数组传参,指针作为参数
⽬录
⼀、数组传参
1.⼀维数组作为参数(形参)
⼀维数组作为参数(形参)传参时——>可⽤⼀维数组来接收(实参)
void test(int[10])
{
;
}
int main()
{
int arr [10]= {0};
test(arr);
return 0;
}
int[10])
{
;
}
int main()
{
int arr [10]= {0};
test(arr);
return 0;
}
⼀维数组作为参数(形参)传参时——>可⽤⼀级指针来接收(实参)
void test(int*p)
{
;
}
int main()
{
int arr [10]= {0};
test(arr);
return 0;
}
int*p)
{
;
}
int main()
{
int arr [10]= {0};
test(arr);
return 0;
}
C 语⾔中,当⼀维数组作为函数参数(形参,实参)的时候,编译器总是把它解析成⼀个指向其⾸元 素⾸地址的指针。
2.⼆维数组
⼆维数组作为参数(形参)传参时——>可⽤⼆维数组接收(实参)
void test(int arr[][10])
{
;
}
int main()
{
int arr [10][10]= {0};
test(arr);
return 0;
}
arr[][10])
{
;
}
int main()
{
int arr [10][10]= {0};
test(arr);
return 0;
}
接受时arr[][]第⼀个[]中可以忽略,但是第⼆个[]不能省略,因为⼆维数组可以不知道有多少⾏,但是⼀定得知道⼀⾏有多少个元素。
⼆维数组作为参数(形参)传参时——>可⽤数组指针接收(实参)
void test(int (*p)[10])
{
;
}
int main()
{
int arr [10][10]= {0};
test(arr);
return 0;
}
int (*p)[10])
{
;
}
int main()
{
int arr [10][10]= {0};
test(arr);
return 0;
}
因为C 语⾔中,当⼀维数组作为函数参数的时候,编译器总是把它解析成⼀个指向其⾸元 素⾸地址的指针,所以arr[10][10]可以写作 int (*p)[10]。
但这⾥需要注意的是:C 语⾔中,当⼀维数组作为函数参数(形参,实参)的时候,编译器总是把它解析 成⼀个指向其⾸元素⾸地址的指针。这条规则并不是递归的,也就是说只有⼀维数组才是 如此,当数组超过⼀维时,将第⼀维改写为指向数组⾸元素⾸地址的指针之后,后⾯的维 再也不可改写。⽐如:a[3][4][5]作为参数时可以被改写为(*p)[4][5]。
⼆、指针传参
1.⼀级指针传参(形参)
⼀级指针传参(形参)——>可以⽤⼀级指针接收(实参)
void test(int *p)
{
;
}
int main()
{
int *arr;
test(arr);
return 0;
}
指针p只是arr指针的临时拷贝(在栈上创建),所以test函数结束后就销毁了,如果要利⽤指针p则test函数必须要由返回值且类型为指针p 的类型。然后在test函数最后加上return p;即可在利⽤函数返回值返回p的地址。
⼀级指针传参(形参)——>可以⽤⼆数组接收(实参)
void test(int arr[])
{
;
}
int main()
{
int *arr;
test(arr);
return 0;
}
同上C 语⾔中,当⼀维数组作为函数参数(形参,实参)的时候,编译器总是把它解析成⼀个指向其⾸元 素⾸地址的指针。
指针与二维数组⼀级指针传参(形参)——>可以⽤⼆维指针接收(实参)传的时⼀级指针的地址
void test(int**p)
{
*p= 2;
return p;
}
int main()
{
int *arr;
test(&arr);
return 0;
}
2.⼆级指针可以传参,⽤三级指针接收。(以此类推)但⼤部分情况下⽤来做实参接收⼀维数组,指针数组。
三、指针数组,数组指针传参
1.指针数组传参
指针数组传参(形参)——>可以⽤指针数组接收(实参),也可以⽤⼆级指针接收
void test(int *arr[])
{
;
}
int main()
{
int *arr[] = { 0 };
test(arr);
return 0;
}
指针数组传参(形参)——>可以⽤⼆级指针接收(实参)
void test(int **p)
{
;
}
int main()
{
int *arr[] = { 0 };
test(arr);
return 0;
}
同样C 语⾔中,当⼀维数组作为函数参数(形参,实参)的时候,编译器总是把它解析成⼀个指向其⾸元 素⾸地址的指针。
int*arr[]是指针数组做参数时编译器就解析为int*(*)arr。
2.数组指针传参
数组指针可做维⼆维数组传参时的实参。
总结:
C 语⾔中,当⼀维数组作为函数参数(形参,实参)的时候,编译器总是把它解析 成⼀个指向其⾸元素⾸地址的指针。这条规则并不是递归的,也就是说只有⼀维数组才是 如此,当数组超过⼀维时,将第⼀维改写为指向数组⾸元素⾸地址的指针之后,后⾯的维 再也不可改写。⽐如:a[3][4][5]作为参数时可以被改写为(*p)[4][5]。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论