我是靠谱客的博主 俏皮人生,这篇文章主要介绍C语言进阶:指针的进阶(3),现在分享给大家,希望可以做个参考。

数组传参和指针传参

实践之中不免会碰到数组和指针作函数参数而如何设计形参的问题。

一维数组传参

一维数组传参,下列接收方式是否可行呢?

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//1. void test(int arr[]) {} //2. void test(int arr[10]) {} //3. void test(int* arr) {} int main() { int arr[10] = { 0 }; test(arr); return 0; }

1.数组传参数组接收,可行但其实都会降级优化成指针,编译器不会真正创建一个数组。

2.由于形参数组形同虚设,所以数组大小无意义,任意大小或无。(有歧义)

3.数组传参本质就是首元素地址,首元素类型为int,所以指针的类型为int*。

所以可以看出[]和*()是等价的。我愿称之为*和[]的爱恨情仇!(‐^▽^‐)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
//1. void test2(int* arr[2]) {} //2. void test2(int** arr) {} int main() { int* arr2[10] = { 0 }; test2(arr2); return 0; }

指针数组,每个元素类型为int*,故用二级指针接收数组名。

一维数组传参,数组和指针接收。

二维数组传参

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
//1. void test(int arr[3][5]) {} //2. void test(int arr[][]) {} //3. void test(int arr[][5]) {} int main() { int arr[3][5] = { 0 }; test(arr); }
  • 二维数组传参用二维数组接收,行可省略,但列不可以
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//4. void test(int* arr) {} //5. void test(int* arr[5]) {} //6. void test(int(*arr)[5]) {} //7. void test(int** arr) {} int main() { int arr[3][5] = { 0 }; test(arr); }

4.整型指针接收的应该是整型变量的地址,而二维数组数组名为首行的数组地址。

5.指针数组和二维数组无关。

6.二维数组传参用首行数组大小的数组指针接收。

7.二级指针和二维数组无关。

  • 二维数组数组名arr为首行“一维数组”的地址,数组的地址用数组指针接收。

int(*)[5]型数组指针指向元素个数为5的一维数组。指针+1访问到下一行,每次跳一行。再解一层引用访问一行里每个元素。

一级指针传参

反向思考,若函数形参为指针,传参时实参可以如何设计呢?

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void test(int* ptr, int sz) {} void test(int arr[],int sz) {} int main() { //1. int a = 10; test(&a); //2. int arr[10] = { 0 }; test(arr); return 0; }
  • 一级指针传参,形参用指针和数组都行,但不提倡用一维数组。
  • 若形参为指针,实参也可以是指针(地址),也可以是数组。

二级指针传参

当二级指针作参数时,形参如何设计呢?

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
void test(int** pp) { printf("%dn", **pp); } void test(int* arr[]) {//用法不好 printf("%dn", *arr[0]); } int main() { int a = 10; int* p = &a; int** pp = &p; test(pp); return 0; }
  • 当二级指针作函数参数时,形参可以是二级指针和指针数组。

当形参为二级指针,实参可以传什么呢?

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void test(int** pp) { printf("%dn", **pp); } int main() { int a = 10; int* p = &a; int** pp = &p; int* arr[10] = { &a }; //1. test(&p); //2. test(pp); //3. test(arr); return 0; }
  • 当形参为二级指针时,实参可以是:二级指针(一级指针地址),指针数组首元素的地址。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注靠谱客的更多内容!

最后

以上就是俏皮人生最近收集整理的关于C语言进阶:指针的进阶(3)的全部内容,更多相关C语言进阶:指针内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(107)

评论列表共有 0 条评论

立即
投稿
返回
顶部